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

时间:2023-01-23 21:55:23

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