日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解析mediaTypes+viewResolvers+viewResolvers

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解析mediaTypes+viewResolvers+viewResolvers 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

spring在解析視圖的時候有兩個重要的接口:ViewResolver?和?View
ViewResolver 中只有一個方法 resolveViewName ,提供 view name 和 實際 view的映射;
View 中兩個方法 getContentType 和 render ,解析請求中的參數并把這個請求處理成某一種 View.

說白了,就是ViewResolver 負責怎么去解析, 而View只代表一種 視圖層的技術。

對于一個請求,應該返回什么樣的視圖是 ViewResolver 來決定的,spring3.0提供的 ViewResolver 包括 AbstractCachingViewResolver,

XmlViewResolver,ResourceBundleViewResolver,UrlBasedViewResolver,InternalResourceViewResolver,VelocityViewResolver/FreeMarkerViewResolver,

ContentNegotiatingViewResolver等。從字面意思我們大致就可以猜出起用途。
我們平時使用ResourceBundleViewResolver或者InternalResourceViewResolver來返回JSP頁面,他們就是其中的兩個 ViewResolver?

下面我主要說說ContentNegotiatingViewResolver?
根據官方文檔:The ContentNegotiatingViewResolver does not resolve views itself but rather delegates to other view resolvers,就是說ContentNegotiatingViewResolver 本身并不自己去解析,他只是分配給其他的ViewResolver 去解析。并選擇一個看起來像是客戶端請求需要返回的一種? View? 返回。


下面來看看我們想要返回的JSON格式的數據,spring3.0中提供了一種View 來支持 JSON,MappingJacksonJsonView ?,在這個View中我們可以封裝數據,

屬性等等,但是怎么讓spring返回這個view呢,還是要通過 ViewResolver 來處理。


我們來看官方文檔里的一份關于ContentNegotiatingViewResolver??的典型配置:

Java代碼??

  • <bean?class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">??

  • <!--?設置為true以忽略對Accept?Header的支持-->
  • ?<property name="ignoreAcceptHeader" value="true"/>

    <!--?在沒有擴展名時即:?"http://www.sxrczx.com/rest"?時的默認展現形式?-->

    ?<property name="defaultContentType" value="text/html"/>

    <!--?擴展名至mimeType的映射,即?http://www.sxrczx.com/rest.json?映射為?application/json?-->
  • ??<property?name="mediaTypes">??

  • ????<map>??

  • ??????<entry?key="atom"?value="application/atom+xml"/>??

  • ??????<entry?key="html"?value="text/html"/>??

  • ??????<entry?key="json"?value="application/json"/>??

  • ????</map>??

  • ??</property>

  • <!--?用于開啟?http://www.sxrczx.com/rest?format=json?的支持?--><property?name="favorParameter"?value="false"/>
  • ??<property?name="viewResolvers">??

  • ????<list>??

  • ??????<bean?class="org.springframework.web.servlet.view.BeanNameViewResolver"/>??

  • ??????<bean?class="org.springframework.web.servlet.view.InternalResourceViewResolver">??

  • <!--

  • ? ? ? ??<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

  • -->

  • ????????<property?name="prefix"?value="/WEB-INF/jsp/"/>??

  • ????????<property?name="suffix"?value=".jsp"/>??

  • ??????</bean>??

  • ????</list>??

  • ??</property>??


  • ??<property?name="defaultViews">??

  • ????<list>??

  • ? ? ??<!-- for application/json -->

  • ??????<bean?class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"?/> ?

  • ??????<!--?for?application/xml?-->??????<!--????????<bean?class="org.springframework.web.servlet.view.xml.MarshallingView"?>?????????????<property?name="marshaller">????????????????<bean?class="org.springframework.oxm.xstream.XStreamMarshaller"/>????????????</property>??????</bean>-->
  • ????</list>??

  • ??</property>??

  • </bean>??

  • ??

  • <bean?id="content"?class="com.springsource.samples.rest.SampleContentAtomView"/>??


  • 關于 mediaTypes 這個屬性我稍后分析,先看viewResolvers和defaultViews這兩個屬性,viewResolvers中定義了兩個 ViewResolver ,defaultViews定義了一個默認的返回視圖。

    但是ContentNegotiatingViewResolver? 是怎么決定使用哪個ViewResolver 以及 返回什么樣的 View呢? 通過跟蹤源碼和查看API文檔可以很容易發現。

    ?

    API中寫道:

    This view resolver uses the requested media type to select a suitable View for a request. This media type is determined by using the following criteria:

    1. If the requested path has a file extension and if the setFavorPathExtension(boolean) property is true, the mediaTypes property is inspected for a matching media type.
    2. If the request contains a parameter defining the extension and if the setFavorParameter(boolean) property is true, the mediaTypes property is inspected for a matching media type.?

    The default name of the parameter is format and it can be configured using the parameterName property.
    3. If there is no match in the mediaTypes property and if the Java Activation Framework (JAF) is both enabled and present on the class path, FileTypeMap.getContentType(String) is used instead.
    4. If the previous steps did not result in a media type, and ignoreAcceptHeader is false, the request Accept header is used.
    Once the requested media type has been determined, this resolver queries each delegate view resolver for a View and determines if the requested media type is compatible with the view's content type). The most compatible view is returned.

    ?

    1. spring檢查setFavorPathExtension(boolean)?,如果這個屬性為true(默認為true),它檢查請求的后綴名,來返回一種 mediaType ,

    而后綴名和mediaType是通過ContentNegotiatingViewResolver??配置中的mediaTypes指定的,這個我開始也不確定,后來跟蹤源碼發現確實是這樣映射的。

    ?

    2.spring檢查?setFavorParameter(boolean)?這個屬性是否為true(默認為false),而如果你打開這個屬性,那么默認的參數名應為 format ,

    spring通過你傳過去的參數決定返回哪種mediaType。

    ?

    3.如果前兩步沒有找到合適的mediaType,則啟動**機制去找,這個看不懂,也不用管了。

    ?

    4.如果前三步都沒有找到合適的mediaType,并且?ignoreAcceptHeader?這個屬性為false(默認為false),spring則根據 ?你請求頭里面設置的 ?ContentType 來找適合的 mediaType。

    ?

    那么現在我們明白了?ContentNegotiatingViewResolver???resolves a view based on the request file name or?Accept?header. ?

    ?就是ContentNegotiatingViewResolver??根據文件名和請求頭類型來決定返回什么樣的View。而mediaTypes這個屬性存儲了 你請求后綴名 或者 參數 所對應 的mediaType。

    ?

    所以要想返回JSON數據所代表的MappingJacksonJsonView ??,我們要么在請求頭中設置contentType為application/json,要么使用 **.json ? 或者 ?**?format=json?

    (這是我的猜測,我猜spring接收到format中的參數后也會去那個map中找)這種請求,其中json這個名字你可以任意換,只要在配置文件中統一就可以了。

    ?

    下面是我項目中具體的使用:

    ?

    XML中的配置:

    Xml文件代碼??

  • <bean?class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">????

  • ????<property?name="mediaTypes">????

  • ??????<map>????

  • ????????<entry?key="html"?value="text/html"/>????

  • ????????<entry?key="spring"?value="text/html"/>??

  • ????????<entry?key="json"?value="application/json"/>????

  • ??????</map>????

  • ????</property>??

  • ????<property?name="viewResolvers">????

  • ??????<list>??

  • ????????<bean?class="org.springframework.web.servlet.view.InternalResourceViewResolver">????

  • ??????????<property?name="prefix"?value="/"/>??

  • ??????????<property?name="suffix"?value=".jsp"/>??

  • ????????</bean>??

  • ??????</list>??

  • ????</property>??

  • ????<property?name="defaultViews">??

  • ????????<list>??

  • ????????????<bean?class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>??

  • ????????</list>??

  • ????</property>??

  • </bean>??

  • ?

    ?

    前臺調用:

    Js代碼??

  • <script?type="text/javascript">??

  • $(function()?{??

  • ????jQuery.ajax({??

  • ????????url?:?'index.json',??

  • ????????contentType?:?"application/json",//application/xml??

  • ????????processData?:?true,//contentType為xml時,些值為false??

  • ????????dataType?:?"json",//json--返回json數據類型;xml--返回xml??

  • ????????data?:?{??

  • ????????????tag?:?'tag123'??

  • ????????},??

  • ????????success?:?function(data)?{??

  • ????????????document.write(data.applyList.length);??

  • ????????},??

  • ????????error?:?function(e)?{??

  • ????????????document.write('error');??

  • ????????}??

  • ????});??

  • });??

  • </script>??

  • ?

    后臺Controller:

    ?

    Java代碼??

  • @RequestMapping(value?=?"/index.json")??

  • public?ModelAndView?queryAppliesForJson()?{??

  • ???????ModelAndView?mav?=?new?ModelAndView("query_list_paginition");??

  • ????List<ChangeApply>?applyList?=?changeApplyService.findAllApplies();??

  • ????mav.addObject("applyList",?applyList);??

  • ???????return?mav;??

  • }??

  • ?

    這么前臺JavaScript會接收到JSON字符串。 而且這樣設計也符合spring提倡的 RESTful 風格。我們在任何地方只要發出對應的請求,服務器就會給我們返回需要的數據。

    ?

    ....陸續增加中,下次我可能會寫從源碼角度去分析。


    轉載于:https://my.oschina.net/liangzhenghui/blog/408358

    總結

    以上是生活随笔為你收集整理的解析mediaTypes+viewResolvers+viewResolvers的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 麻豆av一区 | 欧美日韩在线成人 | 日本少妇大战黑人 | 色香影院 | 久草超碰| 免费亚洲精品 | 99国产精品国产精品九九 | 国产精品传媒 | 国产欧美激情视频 | 极品一区 | 麻豆精品自拍 | 鲁鲁狠狠狠7777一区二区 | 亚洲无av在线中文字幕 | 五月婷婷久久综合 | 欧美午夜理伦三级在线观看 | 精品99视频 | av免费片| 免费毛片基地 | 亚洲av无码国产精品久久 | 午夜伦理剧场 | 四虎视频在线 | 亚洲午夜色 | 一个色在线 | 欧美精品免费一区二区三区 | 亚洲啪 | 午夜影院在线观看免费 | 97xxxx | chinese hd av| www.色图| 麻豆自拍偷拍 | 特色特色大片在线 | 久久资源在线 | 97超碰国产精品无码蜜芽 | 午夜不卡在线 | 九九热精品视频在线 | 国产在线拍揄自揄拍 | 一级黄色大片在线观看 | 成人av免费网址 | 老女人人体欣赏a√s | 污污的视频在线观看 | 亚洲色图欧美 | 九九影视理伦片 | 强制高潮抽搐哭叫求饶h | 你懂的欧美| 欧美黄色录像带 | 亚洲欧洲成人在线 | 日韩成人福利视频 | 日本视频免费在线播放 | 一区二区三区免费在线观看视频 | 国产一区二区三区观看 | 国产精品高潮呻吟久久 | 欧美三个黑人玩3p | 午夜免费av | www.成人在线视频 | 日韩成人午夜影院 | 麻豆国产av超爽剧情系列 | 朝桐光av在线一区二区三区 | av免费看网址| 在线看片你懂 | 精品人妻一区二区三区视频 | 亚洲成人999 | 在线观看免费视频一区二区 | 人人人人爽| 欧洲成人一区二区三区 | 日韩有码在线播放 | 人人爽人人爽人人 | 97xxxx| 天天操天天爽天天干 | 黄色资源在线 | 久久免费少妇高潮99精品 | 香蕉一级视频 | 成人免费视频a | 91热爆视频| 手机看片日韩在线 | 在线免费观看黄色片 | 欧美精品99久久久 | 五月激情综合 | 欧美国产精品一区二区三区 | 免费看aaaaa级少淫片 | 国产一级二级毛片 | 欧美深夜在线 | 国产www视频 | 国产精品第56页 | 福利姬在线播放 | 久操视频精品 | 亚洲字幕成人中文在线观看 | 色噜噜亚洲 | 91亚洲国产成人久久精品网站 | 尹人成人网 | 亚洲天堂视频在线观看 | 中文字幕一二三区 | 一级女性全黄久久生活片免费 | 色婷婷亚洲一区二区三区 | 97超碰碰 | 欧美精品福利 | 国产一级久久久久毛片精品 | 天天看夜夜看 | 污污动态图 | 吃瓜网今日吃瓜 热门大瓜 色婷在线 |