1. 返回什么
RESTful 风格在后台服务端来看:我们不需要再返回一个类似于JSP的页面,我们只需要返回数据资源的内容,纯数据,不含任何显示信息。
简单的来说就是,我们只需要返回 Json、Xml、RSS、图片等消息或者媒体
2. SpringMVC 的支持
使用 @ResponseBody
、 @RequestBody
启用 消息转换器,从而取代默认的视图解析器。
实际上也有一个内容协商器 ContentNegotiatingViewResolver
不过该方式不推荐使用。
SpringMVC 提供了多种消息转换器,满足了对常见消息的转换需要。
依据 URL 扩展名,或客户端请求头中的 Accept 属性,或指定的资源格式,来返回相应的资源格式。
3. Controller 配置实例
Controller:
@Controller
@RequestMapping("/rest")
public class RestController {
@Autowired
private Dao dao;
@RequestMapping(value = "/get/{name}")
// @RequestMapping(value = "/get/{name}", produces = "application/json")
// @RequestMapping(value = "/get/{name}", produces = "application/xml")
@ResponseBody
public Spitter get(@PathVariable String name) {
Spitter spitter = dao.find(name);
return spitter;
}
}
Spitter:
@XmlRootElement
public class Spitter {
private String username;
private String password;
private String fullname;
private String email;
private boolean updateByEmail;
public Spitter() {
}
//省略 setter getter...
}
测试可以使用 Junit 和 MockMvc 进行。
代码解读:
- 依赖于消息转换器,使用 @ResponseBody 注解以启用,将告知Spring返回的对象作为资源(非HTML视图)返回给客户端。
-
注解@RequestBody 类似作用找到一个对应的消息转换器。
-
转换器:
- Json – MappingJackson2HttpMessageConverter
- Xml – Jaxb2RootElementHttpMessageConverter
- 若要支持返回Xml格式,需要返回的JavaBean上使用JAXB注解@XmlRootElement等,该依赖已经集成在JDK中。
-
若要支持返回Json格式,需要引入 jackson-core jackson-databind 依赖。
-
支持客户端以url扩展名 url.xml url.json 方式请求也支持客户端在请求头的Accept属性配置application/json application/xml
-
url形式优先级高于Accept属性。
-
注解@RequestMapping 的 produces属性 不指定则根据请求头的Accept属性application/json application/xml 返回对应Content-Type属性的格式。
-
注解@RequestMapping 的 produces属性 指定则返回无限制的请求头或者对应限制的请求头的Accept属性,返回对应Content-Type属性的格式。
-
若@RequestMapping限制请求头的Accept属性application/json,客户端请求时使用url.xml请求,不论Accept属性如何设置均获取不到资源,因为优先级较高的url.xml资源不存在
-
无限制请求返回的格式优先检测是否使用了JAXB注解@XmlRootElement,如使用则返回XML格式,否则再返回Json格式。
-
若要指定使用XML格式,并且不想使用JAXB:
- 1.需要在spring配置文件中手动配置好视图解析器,并在Controller中显示的声明ModelAndView,并new ModelAndView(“视图解析器Bean”)后返回该视图
-
2.按照自己喜欢的方式构建Xml字符串,将构建后的字符串通过 @ResponseBody 注解所选定的消息转换器直接返回。
可以使用 @RestController
代替 @Controller
,这样就不需要在当前 Controller 中每个方法都添加 @ResponseBody
了。
4. 参考链接
Spring in Action(第4版),沃尔斯(Craig Walls), 第16章
发表评论
沙发空缺中,还不快抢~