轻松创建基于REST的WEB服务(下)

日期: 2011-06-02 作者:Jason Tees翻译:李松 来源:TechTarget中国 英文

创建基于Java的资源   在本示例的开发过程中,对于基于Java的组件,我们将只是编写一个名为HelloWorldResource 的类,这个类位于com.mcnz.ws包中。这个类有一个叫做getMessage()的方法,它返回字符串‘Rest Never Sleeps’。这个方法本身并无多大意义,但是我们感兴趣的是在代码中的各个标识符。   当你为这个类编写代码时,要注意这个类必须被放在WEB- INF文件夹下的classes目录中,并且所在的文件夹结构,如下图所示,能够映射到包名com.mcnz.ws。

  下面就是我们所要用到的代码,把它保存在上面指定的目录下以HelloWorldR……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

创建基于Java的资源

  在本示例的开发过程中,对于基于Java的组件,我们将只是编写一个名为HelloWorldResource 的类,这个类位于com.mcnz.ws包中。这个类有一个叫做getMessage()的方法,它返回字符串‘Rest Never Sleeps’。这个方法本身并无多大意义,但是我们感兴趣的是在代码中的各个标识符。

  当你为这个类编写代码时,要注意这个类必须被放在WEB- INF文件夹下的classes目录中,并且所在的文件夹结构,如下图所示,能够映射到包名com.mcnz.ws。

能够映射到包名com.mcnz.ws

  下面就是我们所要用到的代码,把它保存在上面指定的目录下以HelloWorldResource.java命名的一个文件中。

  要实现的类

以下是引用片段:
package com.mcnz.ws;
import javax.ws.rs.*;
@Path("helloworld")
public class HelloWorldResource {
    @GET
    @Produces("text/plain")
    public String getMessage() {
        return "Rest Never Sleeps";
    }
}

  前面我们说过,这个服务要只响应HTTP GET请求,因此,你会看到,这个getMessage()方法带有一个@GET的修饰符。并且,后面紧跟着一个@Produces标记,指示这个方法仅仅返回一个普通文本("text/plain"),这是MIME类型中最简单的一种。当客户通过指定的URL调用我们的服务时,这个文本字符串“Rest Never Sleeps”就会被返回。

  在最开始的时候,我们就已经提到,调用这个服务所用的URL将会是:http://localhost:8080/restful/resources/helloworld

  你会发现,@Path("helloworld") 标记直接对应了在URL末尾处指定的资源名称。

  在Java文件保存完毕后,可以使用下述命令来编译我们的代码:

以下是引用片段:
C:> c:_jdk1.6binjavac -classpath "C:_restfulWEB-INFlib*"
C:_restfulWEB-INFclassescommcnzws*.java

  编译结束后,原来保存.java文件所在的目录下将会生成一个相同名称的.class文件。

保存.java文件所在的目录下将会生成一个相同名称的.class文件

  在部署描述符中配置Jersey

  在我们将需要的jar文件放到WEB-INFlib目录下,HelloWorldResource.java文件编译结束后,在部署前的最后一个步骤是,编辑部署描述符以便让Servlet容器知道这个Jersey实现将被用来处理RESTful Web服务的调用请求。因此,创建一个名为web.xml的文件,把它放到WEB-INF目录下,其内容如下:

以下是引用片段:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
    version="3.0"
   
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
  <servlet>
    <servlet-name>RestfulContainer</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.mcnz.ws</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>RestfulContainer</servlet-name>
    <url-pattern>/resources/*</url-pattern>
  </servlet-mapping>
</web-app>

  对于这个web.xml文件,有两点值得注意。其一是,一个Servlet已经被配置为处理RESTful调用。这个Servlet的名称是ServletContainer ,它是我们从Sun网站上下载下来的Jersey库文件的一部分,我们早已经将它放到WEB应用的lib目录下了。

  另一个值得注意的重要事情是,在Servlet映射中,“url-pattern”的名称为/resources/*。注意:URL-pattern(在本例中是“resources”)对应于URL中在资源名称(在本例中是“helloworld”)之前,在WEB应用context root(在本例中是“restful”)之后的那个部分。http://localhost:8080/restful/resources/helloworld

  现在,web.xml已经写好并保存完毕,我们可以将这个应用打包成一个war文件并部署到Tomcat了。你可以最终检查一下,你的开发环境应该在以下目录结构中包含有以下资源:

以下是引用片段:
+  ( root folder C:_restful )
++ WEB-INF
++++ web.xml
++++ lib
++++++ asm-3.1.jar
++++++ jackson-core-asl-1.7.1.jar
++++++ jackson-jaxrs-1.7.1.jar
++++++ jackson-mapper-asl-1.7.1.jar
++++++ jackson-xc-1.7.1.jar
++++++ jersey-client-1.6.jar
++++++ jersey-core-1.6.jar
++++++ jersey-json-1.6.jar
++++++ jersey-server-1.6.jar
++++++ jettison-1.1.jar
++++++ jsr311-api-1.1.1.jar
++++ classes
++++++ commcnzwsHelloWorldResource.class
++++++ commcnzwsHelloWorldResource.java

  部署及测试

  在_restful目录下面执行以下命令,能够将_restful目录下的所有资源文件打包成一个可部署的war文件。这个命令实际上会把这个war文件放到Tomcat 7安装时创建的webapps目录下面。如果你安装Tomcat时指定了不同的目录名称,下面的命令要做相应修改:

以下是引用片段:
C:_restful> %JAVA_HOME%binjar -cvf
C:_tomcatwebappsrestful.war *.*

下面的命令要做相应修改

  将war文件放到webapps目录下后,剩下的事情就只有启动Tomcat和调用这个服务了。

  我们已经将servlet引擎安装到了_tomcat目录,下述命令可以启动Tomcat:

以下是引用片段:
C:_tomcatbin> startup

  一旦Tomcat启动起来以后,由于在一个WEB浏览器中输入一个URL将会触发一个HTTP GET调用,这个RESTful WEB服务可以通过一个浏览器经由下述的URL来调用:http://localhost:8080/restful/resources/helloworld(注意,context root目录restful,对应的是war文件restful.war的名称)

  通过Chrome浏览器调用这个服务后的结果如下图所示:

通过Chrome浏览器调用这个服务后的结果

  总结

  搞定!你看,配置一个RESTful WEB服务的基本开发环境是多么轻松,编码实现一个极简易的RESTful WEB服务(本例目前只能处理GET请求)是多么容易!

相关推荐