ContentNegotiatingViewResolver這個(gè)解析器是做什么用的? RESTful服務(wù)中很重要的一個(gè)特性即是同一資源,多種表述我們使用ContentNegotiatingViewResolver就可以做到,這個(gè)視圖解析器允許你用同樣的內(nèi)容數(shù)據(jù)來(lái)呈現(xiàn)不同的view
如下面描述的三種方式:
方式1 使用擴(kuò)展名 http://www./user.xml 呈現(xiàn)xml文件 http://www./user.json 呈現(xiàn)json格式 http://www./user 使用默認(rèn)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./user?format=xml http://www./user?format=json
這三種方式各自的優(yōu)缺點(diǎn)這里就不再介紹了 如何使用ContentNegotiatingViewResolver? 假設(shè)我們有這么一個(gè)目標(biāo): /user/{userid}.json 用于返回一個(gè)描述User的JSON /user/{userid} 用于返回一個(gè)展示User的JSP頁(yè)面 /user/{userid}.xml 用于返回一個(gè)展示User的XML文件
配置文件說(shuō)明 (具體例子下篇文章放上) 我們知道有accept header,擴(kuò)展名以及參數(shù)這三種方式,配置文件中
這里是解析器的執(zhí)行順序,如果有多個(gè)的話(前面多次解釋過(guò)) <property name="order" value="1"></property>
--------------------------------------------------------------------------------------------------------------
如果所有的mediaType都沒(méi)匹配上,就會(huì)使用defaultContentType <property name="defaultContentType" value="text/html" />
這里是是否啟用擴(kuò)展名支持,默認(rèn)就是true 例如 /user/{userid}.json <property name="favorPathExtension" value="true"></property> 這里是是否啟用參數(shù)支持,默認(rèn)就是true 例如 /user/{userid}?format=json <property name="favorParameter" value="false"></property> 這里是否忽略掉accept header,默認(rèn)就是false 例如 GET /user HTTP/1.1 Accept:application/json <property name="ignoreAcceptHeader" value="true"></property>
我們的例子是采用.json , .xml結(jié)尾的,所以關(guān)掉兩個(gè)
-------------------------------------------------------------------------------------------------------------- 這里是擴(kuò)展名到mimeType的映射, 例如 /user/{userid}.json 中的 .json 就會(huì)映射到 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)來(lái)跟服務(wù)端的一組viewResover的MimeType相比較,如果符合,即返回
viewResover的數(shù)據(jù).
ContentNegotiatingViewResolver的處理流程(左上角入口)
|
|
來(lái)自: 老鼠愛(ài)上美貓 > 《spring》