1. RESTful 不是一项技术,也不是一个标准,而是一种风格,跟servlet不在一个层面上,根本无法比较。一个基于servlet的application也是可以是符合RESTful风格的,换言之,RESTful可以通过servlet实现的。

2. 通过 REST 风格体系架构,请求和响应都是基于资源表示的传输来构建的。资源是通过全局 ID 来标识的,这些 ID 一般使用的是一个统一资源标识符(URI)。客户端应用使用 HTTP 方法(如,GET、POST、PUT 或 DELETE)来操作一个或多个资源。通常,GET 是用于获取或列出一个或多个资源,POST 用于创建,PUT 用于更新或替换,而 DELETE 则用于删除资源。

3、使用 Spring 3 来创建 RESTful Web Services。

在 Spring 框架支持 REST 之前,人们会使用其他几种实现技术来创建 Java 的 RESTful Web Services,如 Restlet、RestEasy 和 Jersey。Jersey 是其中最值得注意的,它是 JAX-RS(JSR 311)的参考实现。参考资料 中有更多关于 JSR 311 和 Jersey 的信息。

Spring 是一个得到广泛应用的 Java EE 框架,它在版本 3 以后就增加了 RESTful Web Services 开发的支持。虽然,对 REST 的支持并不是 JAX-RS 的一种实现,但是它具有比标准定义更多的特性。REST 支持被无缝整合到 Spring 的 MVC 层,它可以很容易应用到使用 Spring 构建的应用中。

Spring REST 支持的主要特性包括:

  • 注释,如 @RequestMapping@PathVariable,支持资源标识和 URL 映射
  • ContentNegotiatingViewResolver 支持为不同的 MIME/内容类型使用不同的表示方式
  • 使用相似的编程模型无缝地整合到原始的 MVC 层

 

        例如·Hello World:使用 Spring 3 REST 支持

        要创建这个例子所使用的开发环境,您需要:

  • IDE:Eclipse IDE for JEE (v3.4+)
  • Java SE5 以上
  • Web 容器:Apache Tomcat 6.0(Jetty 或其他容器也可)
  • Spring 3 框架(v3.0.3 是本文编写时的最新版本)
  • 其他程序库:JAXB 2、JSTL、commons-logging

在 Eclipse 中创建一个 Web 应用,然后设置 Tomcat 6 作为它的运行环境。然后,您需要设置 web.xml 文件来激活 Spring WebApplicationContext。这个例子将 Spring bean 配置分成两个文件:rest-servlet.xml 包含与 MVC/REST 有关的配置,rest-context.xml 包含服务级别的配置(如数据源 beans)。清单 1 显示了 web.xml 中的 Spring 配置的部分。

清单 1. 在 web.xml 中激活 Spring WebApplicationContext



<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
    /WEB-INF/rest-context.xml
</param-value>
</context-param>
     
<!-- This listener will load other application context file in addition to 
            rest-servlet.xml -->
<listener>
<listener-class>
    org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
     
<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>
    org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>



 

 

在 rest-servlet.xml 文件中创建 Spring MVC 的相关配置(Controller、View、View Resolver)。清单 2 显示了其中最重要的部分。

清单 2. 在 rest-servlet.xml 文件中创建 Spring MVC 配置



1 <context:component-scan base-package="dw.spring3.rest.controller" />
 2  
 3 <!--To enable @RequestMapping process on type level and method level-->
 4 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
 5 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
 6  
 7 <!--Use JAXB OXM marshaller to marshall/unmarshall following class-->
 8 <bean id="jaxbMarshaller"
 9 class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
10 <property name="classesToBeBound">
11     <list>
12         <value>dw.spring3.rest.bean.Employee</value>
13         <value>dw.spring3.rest.bean.EmployeeList</value>
14     </list>
15 </property>
16 </bean>
17  
18 <bean id="employees" class=
19     "org.springframework.web.servlet.view.xml.MarshallingView">
20 <constructor-arg ref="jaxbMarshaller" />
21 </bean>
22  
23 <bean id="viewResolver" class=
24 "org.springframework.web.servlet.view.BeanNameViewResolver" />



上面的代码中:


Component-scan

启用对带有 Spring 注释的类进行自动扫描

在实践中,它将检查控制器类中所定义的

@Controller 注释。

DefaultAnnotationHanlderMappingsAnnotationMethodHandlerAdapter

使用 @ReqeustMapping 注释的类或函数的 beans 由 Spring 处理


这个注释将在下一节进行详细介绍。

Jaxb2Mashaller

定义使用 JAXB 2 进行对象 XML 映射(OXM)的编组器(marshaller)和解组器(unmarshaller MashallingView

定义一个使用 Jaxb2Mashaller 的 XML 表示 view

BeanNameViewResolver

使用用户指定的 bean 名称定义一个视图解析器

本例将使用名为 “employees” 的

MarshallingView


这样就完成了 Spring 的相关配置。下一步是编写一个控制器来处理用户请求。清单 3 显示的是控制器类。

清单 3. dw.spring3.rest.controller.EmployeeController



@Controller

publicclass EmployeeController { 
  
 
  
 
   @RequestMapping(method=RequestMethod.GET, value="/employee/{id}") 
  
 
  
 
   public ModelAndView getEmployee(@PathVariable String id) { 
  
 
  
 
    
   Employee e = employeeDS.get(Long.parseLong(id)); 
  
 
  
 
    
   returnnew ModelAndView(XML_VIEW_NAME, "object", e); 
  
 
  
 
   } 
  
 
  
 
   }


@RequestMapping 注释是 Spring REST 特性的关键所在。它指定所注释的方法将处理哪个 HTTP 方法(RequestMethod.GET)和哪个 URI(/employee/{id})。注意:

  • 对于 {id} 占位符,使用 @PathVariable 注释可以将 {} 内的值注入到函数的参数。
  • XML_VIEW_NAME 为 employees,这是 rest-servlet.xml 中定义的视图名称。
  • employeeDS 是一个基于内存的数据源,它的实现已经超出本文写作范围。

将 Web 应用发布到您的 Tomcat 上。这时,您可以打开浏览器,然后输入 http://<host>:<port>/<appcontext>/service/employee/1。浏览器就会显示一个 ID 为 1 的员工信息的 XML 视图。

      资源操作是通过 HTTP 方法实现的,如 GET、POST、PUT 和 DELETE。

      也就是可以形成一个简单的支持对员工信息的 CRUD(增删查改)操作的 RESTful Web Service。