Spring 3.x MVC 入門3 -- 使用內(nèi)容協(xié)商來實現(xiàn)多視圖
ContentNegotiatingViewResolver
這個解析器是做什么用的?
RESTful服務(wù)中很重要的一個特性即是同一資源,多種表述我們使用ContentNegotiatingViewResolver就可以做到,這個視圖解析器允許你用同樣的內(nèi)容數(shù)據(jù)來呈現(xiàn)不同的view
如下面描述的三種方式:
方式1 使用擴展名
http://www.test.com/user.xml 呈現(xiàn)xml文件
http://www.test.com/user.json 呈現(xiàn)json格式
http://www.test.com/user 使用默認view呈現(xiàn),比如jsp等
-----------------------------------------------------------------------------------------------------
方式2 使用http request header的Accept
GET /user HTTP/1.1
Accept:application/xml
GET /user HTTP/1.1
Accept:application/json
….
-----------------------------------------------------------------------------------------------------
方式3 使用參數(shù)
http://www.test.com/user?format=xml
http://www.test.com/user?format=json
這三種方式各自的優(yōu)缺點這里就不再介紹了
如何使用ContentNegotiatingViewResolver?
假設(shè)我們有這么一個目標(biāo):
/user/{userid}.json 用于返回一個描述User的JSON
/user/{userid} 用于返回一個展示User的JSP頁面
/user/{userid}.xml 用于返回一個展示User的XML文件
配置文件說明 (具體例子下篇文章放上)
我們知道有accept header,擴展名以及參數(shù)這三種方式,配置文件中
這里是解析器的執(zhí)行順序,如果有多個的話(前面多次解釋過)
<property name="order" value="1"></property>
--------------------------------------------------------------------------------------------------------------
如果所有的mediaType都沒匹配上,就會使用defaultContentType
<property name="defaultContentType" value="text/html" />
這里是是否啟用擴展名支持,默認就是true
例如 /user/{userid}.json
<property name="favorPathExtension" value="true"></property>
這里是是否啟用參數(shù)支持,默認就是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>
我們的例子是采用.json , .xml結(jié)尾的,所以關(guān)掉兩個
--------------------------------------------------------------------------------------------------------------
這里是擴展名到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>
注:
ContentNegotiatingViewResolver是根據(jù)客戶提交的MimeType(如 text/html,application/xml)來跟服務(wù)端的一組viewResover的MimeType相比較,如果符合,即返回viewResover的數(shù)據(jù).
而 /user/123.xml, ContentNegotiatingViewResolver會首先將 .xml 根據(jù)mediaTypes屬性將其轉(zhuǎn)換成 application/xml,然后完成前面所說的比較.
ContentNegotiatingViewResolver的處理流程(左上角入口)

浙公網(wǎng)安備 33010602011771號