日韩性视频-久久久蜜桃-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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 嫩草在线观看视频 | 好姑娘在线观看高清完整版电影 | 中文字幕久久熟女蜜桃 | 成人精品视频一区二区三区尤物 | 五月婷婷狠狠爱 | 大肉大捧一进一出好爽视频动漫 | 日韩有码中文字幕在线观看 | 国产小视频免费观看 | 亚洲精品乱码久久久久久写真 | 国产伦精品一区二区三区视频免费 | 九七精品 | 国产一级片自拍 | 一区二区三区在线观看免费 | 伊人热久久 | 伊人成人在线观看 | 亚洲精品日产精品乱码不卡 | 大肉大捧一进一出好爽动态图 | 欧美日韩精品一区二区三区 | 亚洲女人天堂色在线7777 | 欧美成人精品在线观看 | 日韩xxx高潮hd | 自拍欧美亚洲 | 蜜桃久久av| 欧美做爰全过程免费看 | 看黄色a级片 | 欧美精品在线免费 | 欧美群妇大交乱 | 日韩综合中文字幕 | 国产成人免费av | 日韩久久成人 | 在线观看一区二区三区四区 | 欧美性猛交xxxxx水多 | 日本欧美一本 | 一起草最新网址 | 亚洲视频在线观看网站 | 六月婷婷色 | 国产成人无码久久久精品天美传媒 | 国产精品二区三区 | 亚洲精品2| 日不卡 | 亚洲人高潮女人毛茸茸 | 欧美老肥妇做.爰bbww视频 | 男人操女人的视频 | 久久无码人妻精品一区二区三区 | 日韩区欧美区 | 91精品人妻一区二区三区蜜桃2 | 亚洲欧美精品一区 | 麻豆视频一区二区三区 | 欧美视频一级 | 久久精品网 | 日本黄网在线观看 | 中文字幕一区二区三区门四区五区 | 久久大伊人| 激情总合网 | 色婷婷国产精品综合在线观看 | 国产九色91回来了 | 疯狂伦交| 精品久久网站 | 日本性高潮视频 | 91香蕉视频在线看 | 亚洲AV无码精品一区二区三区 | 国产伦精品一区二区三区照片91 | 1区2区3区在线观看 久久久久久久久久久影院 成人网址在线观看 | 亚洲视频国产精品 | 国产亚洲性欧美日韩在线观看软件 | av免费观看入口 | 91拔萝卜视频| 毛片www| 国产特级毛片aaaaaa | av不卡在线免费观看 | 91看黄| 亚洲3p | 日韩中文字幕av在线 | 久久精品天天中文字幕人妻 | 黄色精品在线观看 | 成年人爱爱视频 | 国产乱了高清露脸对白 | 国产又粗又猛又黄又爽无遮挡 | 国产成人无码av在线播放dvd | 国产黄页 | 黑人一级黄色片 | 日产精品久久久 | 欧美日韩视频无码一区二区三 | 91成人免费观看 | 欧美精品久久96人妻无码 | 亚洲精品国产99 | 日韩亚射吧 | av免费在线网站 | 色av导航| 日韩激情在线视频 | 成人福利视频在线 | 免费网站在线观看黄色 | 天堂av中文| 亚洲影视一区 | 国产精选自拍 | 久久精品女人 | 成年人看片网站 | 日韩高清毛片 | 欧美精品激情 |