本人博客已移至: www.andyqian.com 此处不再更新.........
在本篇文章中,我们来学习spring MVC中返回的数据格式,这种方式在写接口时,非常适用也非常实用,
其实在spring mvc 中本身对数据的返回格式已经封装的非常好,同时支持多种格式,
使用到的是 内容协商者 也就是如下类: (详细配置如下)
org.springframework.web.servlet.view.ContentNegotiatingViewResolver
-- spring-servlet.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="org.wash.*"/>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="atom" value="application/atom+xml"/>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
</list>
</property>
</bean>
注意事项: 一定要记得在上述文件中添加
<mvc:annotation-driven/> 否则会出现 406 状态码
model 层:
@XmlRootElement
public class SchoolModel implements java.io.Serializable {
private String name;
private int sum;
private int history; // 历史
private Date createTime; //创建时间
public SchoolModel() {
super();
}
@XmlElement
public String getName() {
return name;
}
..........
}
注意事项:
其中 @XmlRootElement 和 @XmlElement 注解表示该model 支持xml格式的数据,也就是说,如果想要
返回xml格式的数据,应该在model名添加@ XmlRootElement 与 属性的 get.....() 方法添加 @XmlElement注解
controller 层
@Controller
@RequestMapping(value = "/user")
public class OneController {
/**
* 支持返回json格式的数据
* @return
*/
@RequestMapping(value="/showSaveUser",method=RequestMethod.GET)
@ResponseBody
public UserModel showUserInfo(){
UserModel user = new UserModel();
user.setAge(12);
user.setEmail("9023023@qq.com");
user.setUsername("testUserName");
return user;
}
}
注意事项:
应该在输出格式的数据方法上面添加@ResposeBody注解,该注解会自动生效,与spring-servlet.xml 文件中
的
<
mvc:annotation-driven
/>
对应,
支持json/xml格式的还需要第三方jar包的支持,有如下几个:
com.fasterxml.jackson.annotations.jar
com.fasterxml.jackson.core.jar
jackson-databind-2.2.3
① 访问地址为:
http://localhost/IntentWash/user/
showSaveUser.json
①
访问结果
{"username":"testUserName","email":"9023023@qq.com","age":12}
② 访问地址: http://localhost/IntentWash/user/
showSaveUser.xml
② 返回结果:
<userModel>
<age>12</age>
<email>9023023@qq.com</email>
<username>testUserName</username>
</userModel>
③ 访问地址:
http://localhost/IntentWash/user/
showSaveUser.atom
③ 返回结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<userModel>
<age>12</age>
<email>9023023@qq.com</email>
<username>testUserName</username>
</userModel>
④ 访问地址:
http://localhost/IntentWash/user/
showSaveUser (默认)
注意在方法中不带后缀为默认返回格式,默认返回格式取决于 请求 Accept,
如果 accept=application/xml 则默认返回 xml格式的数据,
如果 accpet=application/json 则默认返回json格式的数据
注意事项:
①
chrome 浏览器用户可以添加
ModHeader
插件来模拟 添加 requet Header中的accept ,来测试程序是否符合预期反返回结果
② 在测试完以后,一定要记得删除掉添加的 accept,否则 controller 中正常跳转到view视图会出现问题
,而且浏览器在浏览网页时也有可能出现问题,