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
注释。
DefaultAnnotationHanlderMappings
和 AnnotationMethodHandlerAdapter
使用
@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。