springmvc<一>一種資源返回多種形式【ContentNegotiatingViewResolver】
restful服務中一個重要的特性就是一種資源可以有多種表現形式,在springmvc中可以使用ContentNegotiatingViewResolver這個檢視解析器來實現這種方式。
描述資源的三種形式
一、使用副檔名
http://localhost:8080/test/user.xml 以xml格式呈現
http://localhost:8080/test/user.json 以json格式呈現
http://localhost:8080/test/user 以預設檢視呈現,如jsp
二、使用http request header的Accept
GET /user HTTP/1.1
Accept:application/xml 請求時設定返回形式是xml,如使用ajax請求,則需要設定contentType:application/xml
GET /user HTTP/1.1
Accept:application/json 請求時設定返回形式是json,如使用ajax請求,則需要設定contentType:application/json
三、使用引數
http://localhost:8080/test/user?format=json
http://localhost:8080/test/user?format=xml
上面瞭解了同一種資源的三種呈現方式,即json、xml、jsp,那麼我們要如何使用ContentNegotiatingViewResolver類配置,使客戶端請求的方式不同,返回同一種資源的三種方式呢?
ContentNegotiatingViewResolver配置
ContentNegotiatingViewResolver是檢視解析器,我們在使用jsp這個檢視的時候也配置了一個檢視解析器InternalResourceViewResolver,他們都是檢視解析器,後者著重在配置一個預設的檢視解析即jsp;ContentNegotiatingViewResolver本身不會解析,他會分配其他的viewResolver去解析,並選擇一個看起來像是客戶端請求需要返回的一種 View 返回。
下面是ContentNegotiatingViewResolver的具體配置
<!--springmvc中根據字尾不同返回不同格式的配置 如,XXX.json 返回json格式 XXX.xml 返回xml格式 xxx 返回jsp--> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <!--這裡是解析器的執行順序,如果有多個的話,配置的數值越小,則越早執行--> <property name="order" value="1" /> <!-- 這裡是是否啟用副檔名支援,預設就是true 例如 /user/{userid}.json --> <property name="favorPathExtension" value="true"></property> <!--這裡是是否啟用引數支援,預設就是true 例如 /user/{userid}?format=json --> <property name="favorParameter" value="false"></property> <!--這裡是否忽略掉accept header,預設就是false 例如 GET /user HTTP/1.1 Accept:application/json --> <property name="ignoreAcceptHeader" value="true"></property> <!-- 這裡是副檔名到mimeType的對映, 例如 /user/{userid}.json 中的 .json 就會對映到 application/json --> <property name="mediaTypes"> <map> <entry key="json" value="application/json" /> <entry key="xml" value="application/xml" /> </map> </property> <!--檢視--> <property name="defaultViews"> <list> <!--json檢視--> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean> <!--xml檢視--> <bean class="org.springframework.web.servlet.view.xml.MarshallingView" <constructor-arg> <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> <property name="classesToBeBound"> <list> <value>com.cn.my.entity.Course</value> <value>com.cn.my.entity.CourseList</value> </list> </property> </bean> </constructor-arg> </bean> </list> </property> </bean>
order:如果存在多個viewResolver則order值小的被使用,如果沒有合適的viewResolver則會使用另外的;
favorPathExtension:是否支援副檔名,預設為true(支援),副檔名指的xxx.json、xxx.xml等形式
favorParameter:是否啟用引數支援,預設為true(支援),即xxx?format=json、xxx?format=xml等形式,這裡的引數名預設為format,可以通過配置改變。
ignoreAcceptHeader:是否忽略accept header,預設是false(不忽略),即請求時指定的contentType:application/json等,由於我這裡要使用副檔名的形式返回,所以把另外兩項都關閉了,可視不同情況,使用不同設定;
mediaTypes:配置副檔名到mimeType的對映,這裡配置了json和xml的對映;
defaultViews:配置檢視,這裡配置了json和xml的檢視,json使用的jackson;
最後,我還配置一個另外一個檢視解析器,InternalResourceViewResolver,
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="2" />
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>
這是jsp的檢視解析器,order屬性配置為了2,在無法匹配到json、xml的情況下,會返回jsp的檢視。
下面是controller的方法
package com.cn.my.controllor; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import com.cn.my.entity.Course; import com.cn.my.entity.CourseList; @Controller @RequestMapping("/mul") public class MultiView { @RequestMapping("/simple/{coursId}") public String method1(@PathVariable("coursId") String coursId,ModelMap model){ Course c=new Course(); c.setId(coursId); c.setContent("這是測試內容"); c.setName("李四"); model.put("course", c); return "course"; } }
這裡使用的restful服務中的uri的格式,用到了@PathVariable註解,這裡方法返回的String,且沒有@ResponseBody註解,在前邊的返回json一文中有返回json的配置,需要@ResponseBody註解,詳細的可以參看前邊,同時在方法引數中有ModelMap,為什麼這裡要返回一個字串呢,目的是為了統一,我們知道如果要返回到jsp檢視,那麼這裡要返回的一個代表邏輯檢視名的字串,為了使三種方式統一,這裡返回的是字串,如果不返回到jsp也可以返回一個實際的物件。
下面看測試結果,
請求:http://localhost:8081/springmvc/mul/simple2/1212.json
請求:http://localhost:8081/springmvc/mul/simple2/1212.xml
請求:http://localhost:8081/springmvc/mul/simple2/1212
最後一個jsp的檢視,本來是要在jsp頁面中輸出內容的,我這裡沒做,只是輸出了一段話。請諒解!
從上邊的測試結果來看,我們分別使用了三種不同的請求方式去請求同一個資源,返回了各自的形式,這種方式很適合用在不同的系統呼叫同一個系統時,可能別的系統處理資料的方式不一樣,我們使用上邊的配置可以實現一套程式碼,返回不同的形式。
最後
在配置預設的jsp解析器的時候也可以照下面的配置方式,
<!--springmvc中根據字尾不同返回不同格式的配置 如,XXX.json 返回json格式 XXX.xml 返回xml格式 xxx 返回jsp --> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <!--這裡是解析器的執行順序,如果有多個的話,配置的數值越小,則越早執行--> <property name="order" value="1" /> <!-- 這裡是是否啟用副檔名支援,預設就是true 例如 /user/{userid}.json --> <property name="favorPathExtension" value="true"></property> <!--這裡是是否啟用引數支援,預設就是true 例如 /user/{userid}?format=json --> <property name="favorParameter" value="false"></property> <!--這裡是否忽略掉accept header,預設就是false 例如 GET /user HTTP/1.1 Accept:application/json --> <property name="ignoreAcceptHeader" value="true"></property> <!-- 這裡是副檔名到mimeType的對映, 例如 /user/{userid}.json 中的 .json 就會對映到 application/json --> <property name="mediaTypes"> <map> <entry key="json" value="application/json" /> <entry key="xml" value="application/xml" /> </map> </property> <!--檢視解析器--> <property name="viewResolvers"> <list> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> </bean> </list> </property> <!--檢視--> <property name="defaultViews"> <list> <!--json檢視--> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean> <!--xml檢視--> <bean class="org.springframework.web.servlet.view.xml.MarshallingView" <constructor-arg> <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> <property name="classesToBeBound"> <list> <value>com.cn.my.entity.Course</value> <value>com.cn.my.entity.CourseList</value> </list> </property> </bean> </constructor-arg> </bean> </list> </property> </bean>
宣告:我這裡的環境是spring4.1
參考:
http://blog.csdn.net/z69183787/article/details/41654603
上邊有很好的解釋。
有不正之處歡迎指正,謝謝!
相關推薦
springMVC一種資源返回多種形式【ContentNegotiatingViewResolver】
estful服務中一個重要的特性就是一種資源可以有多種表現形式,在springmvc中可以使用ContentNegotiatingViewResolver這個檢視解析器來實現這種方式。 描述資源的三種形式 一、使用副檔名 二、使用http r
springmvc<一>一種資源返回多種形式【ContentNegotiatingViewResolver】
restful服務中一個重要的特性就是一種資源可以有多種表現形式,在springmvc中可以使用ContentNegotiatingViewResolver這個檢視解析器來實現這種方式。 描述資源的三種形式 一、使用副檔名 http://localhost:8080/test/user.xml
Linux I2C(一)之常用的幾種實例化(i2c_client ) 【轉】
掃描 sent near 通過 完成 check 根據 pup views 轉自:http://blog.csdn.net/lugandong/article/details/48092397 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)
一、微服務(Microservices)【翻譯】
1、說明 本文轉載自 http://www.cnblogs.com/liuning8023/p/4493156.html 經典好文! 2、微服務 “微服務架構(Microservice Architecture)”一詞在過去幾年裡廣泛的傳播,它用於描述一種設計應用程式的特別方式,作為一套獨
####jquery click點選一次執行兩次解決方法【遇到】【解決(先接觸繫結,再繫結):$('#addImg').unbind('click').click(function () {})】
====專案例項: <%--$("body").on("click", "#toggle-button${activityDTO.id}", function (e) {--%> // 一次點選兩次觸發事件 <%--$("body").on("click", "#switc
支付寶一鍵跳轉分站託管教程【附圖】
【分站託管】 我們提供伺服器,域名請自行購買,解析A記錄到分配給你的ip,記錄值填* http://t.cn/E7NCiB0 (註冊完後回到首頁-產品-域名註冊) 支援泛解析(*),每個頂級域名下無限個
Datafarne按照某一列的特定規則進行排序【Python】
import pandas as pd if __name__ == '__main__': df = pd.DataFrame({'AAA': range(5), 'BBB': list('
java虛擬機器記憶體管理機制(一):JVM記憶體管理總結【分享】
近期看了看Java記憶體洩露的一些案例,跟原來的幾個哥們討論了一下,深入研究發現JVM裡面還是有不少以前不知道的細節,這裡稍微剖析一下。先看一看JVM的內部結構——如圖所示,JVM主要包括兩個子系統和兩個元件。兩個子系統分別是Class loader子系統和Execution
一隻爬蟲帶你看世界【6】
10. 使用正則表示式來匹配 ip 地址 準備工作:Python中使用正則表示式時,是呼叫 re模組,“import re”,使用其search()方法,該方法用於在字串中搜索正則表示式模式第一次出現的位置。 舉個栗子 >>> import re >
python編程(python開發的三種運行模式)【轉】
阻塞 data tail 驗證 目錄 pro 什麽 read bus 轉自:http://blog.csdn.net/feixiaoxing/article/details/53980886 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)[-]
asp.net mvc 使用Ajax調用Action 返回數據【轉】
action 書寫格式 處理 cli 屬性和方法 根據 txt gif 一個 使用asp.net mvc 調用Action方法很簡單。 一、無參數方法。 1、首先,引入jquery-1.5.1.min.js 腳本,根據版本不同大家自行選擇。 <script src=
Mysql Binlog三種格式介紹及分析【轉】
delete -s 字符 ID color fine alt lte pan 一.Mysql Binlog格式介紹 Mysql binlog日誌有三種格式,分別為Statement,MiXED,以及ROW! 1.Statement:每一條會修改數據的sql
oracle(使用TRUACTE刪除數據時,提示資源正忙)【轉】
ESS 正常 HERE sign order by where terminal spi ora 查詢記錄的鎖定對象,select * from v$locked_object(身份必須是DBA權限),然後找到對應的sid和serial#殺掉了會話;
mysql的五種日期和時間型別【轉載】
[mysql的五種日期和時間型別] mysql(5.5)所支援的日期時間型別有:DATETIME、 TIMESTAMP、DATE、TIME、YEAR。 幾種型別比較如下: 日期時間型別 佔用空間 日期格式 最小值 最大值 零值表示
Android--利用相機或相簿擷取使用者頭像(解決了miui無法擷取,以及部分機型拍照無返回Uri)【上】
宣告:本文的Demo可用於從本地獲取使用者頭像時使用,解決了有些手機系統相機拍照後獲取不到拍攝照片的問題,以及解決小米miui系統呼叫系統裁剪圖片功能camera.action.CROP後崩潰或重新開啟app的問題。 主活動檔案ChooseImageMain
Android--利用相機或相簿擷取使用者頭像(解決了miui無法擷取,以及部分機型拍照無返回Uri)【下】
宣告 本文的Demo可用於從本地獲取使用者頭像時使用,解決了有些手機系統相機拍照後獲取不到拍攝照片的問題,以及解決小米miui系統呼叫系統裁剪圖片功能camera.action.CROP後崩潰或重新開啟app的問題。 修改了部分機型拍照後返回的是縮圖的臨時
Cocos Creator 資源載入流程剖析【三】——Load部分
Load流程是整個資源載入管線的最後一棒,由Loader這個pipe負責(loader.js)。通過Download流程拿到內容之後,需要對內容做一些“載入”處理。使得這些內容可以在遊戲中使用。這裡並不是所有的資源都需要進行一個載入處理,目前只有圖片、Json、Plist、Uuid(Prefab、場景)等資
Cocos Creator 資源載入流程剖析【五】——從編輯器到執行時
我們在編輯器中看到的資源,在構建之後會進行一些轉化,本章將揭開Creator對資源進行的處理。 資源處理的整體規則 首先我們將Creator的開發和執行劃分為以下幾個場景: 編輯器 當我們將資源放到編輯器中時,Creator會為每個資源生成唯一的uuid以及meta檔案,並在專案的library目錄下生成對應
Cocos Creator 資源載入流程剖析【六】——場景切換流程
這裡討論場景切換的完整流程,從我們呼叫了loadScene開始切換場景,到場景切換完成背後發生的事情。整個流程可以分為場景載入和場景切換兩部分,另外還簡單討論了場景的預載入。 載入場景的流程 loadScene主要做了3件事,通過_getSceneUuid獲取要載入場景的資訊,對於原生平臺的非啟動場景
unity5打包機制下,一種資源打ab和資源管理的方案
remove 自己 return game tor 基礎 resource mea easyn unity5打包機制下,一種資源打ab和資源管理的方案。1.打ab: 1.設置平臺 2.清楚所有資源的assetbundlename: string[] abN