spring mvc 在同一個controller 中同時返回多種格式的資料 (xml json atom)
阿新 • • 發佈:2019-01-05
在本篇文章中,我們來學習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 層:
@XmlRootElement
publicclassSchoolModelimplements java.io.Serializable{
privateString name;
privateint sum;
privateint history;// 歷史
privateDate createTime;//建立時間
publicSchoolModel(){
super();
}
@XmlElement
publicString 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)
@ResponseBody
publicUserModel 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檢視會出現問題,而且瀏覽器在瀏覽網頁時也有可能出現問題,