1. 程式人生 > >spring mvc 在同一個controller 中同時返回多種格式的資料 (xml json atom)

spring mvc 在同一個controller 中同時返回多種格式的資料 (xml json atom)

 在本篇文章中,我們來學習spring MVC中返回的資料格式,這種方式在寫介面時,非常適用也非常實用,

其實在spring mvc 中本身對資料的返回格式已經封裝的非常好,同時支援多種格式,使用到的是 內容協商者 也就是如下類:  (詳細配置如下) org.springframework.web.servlet.view.ContentNegotiatingViewResolver -- spring-servlet.xml 配置檔案 <?xml version="1.0" encoding="UTF-8"?><beansxmlns="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-scanbase-package="org.wash.*"/><beanclass="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"><propertyname="mediaTypes"><map><entrykey="atom"value="application/atom+xml"/><entrykey="html"value="text/html"/><entrykey="json"value="application/json"/></map></property><propertyname="viewResolvers"><list><beanclass="org.springframework.web.servlet.view.BeanNameViewResolver"/><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"></property><propertyname="prefix"value="/WEB-INF/views/"/><propertyname="suffix"value=".jsp"/></bean></list></property><propertyname="defaultViews"><list><beanclass="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/></list></property></bean> 注意事項:  一定要記得在上述檔案中新增 <mvc:annotation-driven/> 否則會出現 406 狀態碼 model 層: @XmlRootElementpublicclassSchoolModelimplements java.io.Serializable{privateString name;privateint sum;privateint history;// 歷史privateDate createTime;//建立時間publicSchoolModel(){super();}@XmlElementpublicString getName(){return name;}..........} 注意事項:  其中 @XmlRootElement 和 @XmlElement 註解表示該model 支援xml格式的資料,也就是說,如果想要 返回xml格式的資料,應該在model名新增@ XmlRootElement 與 屬性的 get.....() 方法新增 @XmlElement註解 controller 層 @Controller@RequestMapping(value ="/user")publicclassOneController{/**     * 支援返回json格式的資料     * @return     */@RequestMapping(value="/showSaveUser",method=RequestMethod.GET)@ResponseBodypublicUserModel showUserInfo(){UserModel user =newUserModel();        user.setAge(12);        user.setEmail("[email protected]");        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":"[email protected]","age":12} ② 訪問地址: http://localhost/IntentWash/user/showSaveUser.xml ② 返回結果: <userModel><age>12</age><email>[email protected]</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>[email protected].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檢視會出現問題,而且瀏覽器在瀏覽網頁時也有可能出現問題,