spring mvc 在同一个controller 中同时返回多种格式的数据 (xml json atom)

时间:2022-01-09 21:55:57

本人博客已移至: 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 层:
@XmlRootElementpublic 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.jarcom.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视图会出现问题,而且浏览器在浏览网页时也有可能出现问题,