国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Spring MVC各個視圖解析器的含義

2019-11-06 06:04:02
字體:
來源:轉載
供稿:網友
所有的We MVC框架都有一套它自己的解析視圖的機制,SPRing MVC也不例外,它使用ViewResolver進行視圖解析,讓用戶在瀏覽器中渲染模型。ViewResolver是一種開箱即用的技術,能夠解析jsp、Velocity模板和XSLT等多種視圖。    Spring處理視圖最重要的兩個接口是ViewResolver和View。ViewResolver接口在視圖名稱和真正的視圖之間提供映射; 而View接口則處理請求將真正的視圖呈現給用戶。    1.幾種常見的ViewResolver視圖解析器    在Spring MVC 4控制器中,所有的處理方法必須返回一個邏輯視圖名稱,無論是顯式的(返回String,View或ModelAndView)還是隱式的。Spring中的視圖由視圖解析器處理這個邏輯視圖名稱,Spring有以下幾種視圖解析器:  AbstractCachingViewResolver:用來緩存視圖的抽象視圖解析器。通常情況下,視圖在使用前就準備好了。繼承改解析器就能夠使用視圖緩存。xmlViewResolver :XML視圖解析器。它實現了ViewResolver接口,接受相同DTD定義的XML配置文件作為Spring的XML bean工廠。ResourceBundleViewResolver:它使用了ResourceBundle定義下的bean,實現了ViewResolver接口,指定了綁定包的名稱。通常情況下,配置文件會定義在classpath下的properties文件中,默認的文件名字是views.properties。UrlBasedViewResolver:它簡單實現了ViewResolver接口,它不用顯式定義,直接影響邏輯視圖到URL的映射。它讓你不用任何映射就能通過邏輯視圖名稱訪問資源。InternalResourceViewResolver:國際化視圖解析器。VelocityViewResolver /FreeMarkerViewResolver:Velocity或FreeMarker視圖解析器。ContentNegotiatingViewResolver:內容談判視圖解析器    在JSP視圖技術中,Spring MVC經常會使用 UrlBasedViewResolver視圖解析器,該解析器會將視圖名稱翻譯成URL并通過RequestDispatcher處理請求后渲染視圖。<bean id="viewResolver"        class="org.springframework.web.servlet.view.UrlBasedViewResolver">    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>    <property name="prefix" value="/WEB-INF/views/"/>    <property name="suffix" value=".jsp"/></bean>    假如我們配置了如上所示的URL視圖解析器,我們返回了一個叫“favmvc”的視圖名稱,視圖解析器就會將請求轉發到RequestDispatcher,然后跳轉到/WEB-INF/views/favmvc.jsp頁面。    假如我們想要在應用中使用不同的視圖技術,我們就應該使用 ResourceBundleViewResolver。<bean id="viewResolver"        class="org.springframework.web.servlet.view.ResourceBundleViewResolver">    <property name="basename" value="views"/>    <property name="defaultParentView" value="parentView"/></bean>    ResourceBundleViewResolver對于每個要處理的視圖,都會檢查 ResourceBundle中basename的唯一性,它使用 [viewname].(class)作為視圖類,[viewname].url作為視圖的url。    2. 鏈式視圖解析器(Chaining ViewResolvers)    Spring支持同時配置多個視圖解析器,也就是鏈式視圖解析器。這樣,在某些情況下,就能夠重寫某些視圖。如果我們配置了多個視圖解析器,并想要給視圖解析器排序的話,設定 order 屬性就可以指定解析器執行的順序。order的值越高,解析器執行的順序越晚。    下面代碼所示的例子由兩個視圖解析器組成。 InternalResourceViewResolver總是最后一個執行,而 XmlViewResolver則指定解析XML視圖(InternalResourceViewResolver不支持Excel視圖)。<bean id="jspViewResolver" 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><bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">    <property name="order" value="1"/>    <property name="location" value="/WEB-INF/views.xml"/></bean><!-- in views.xml --><beans>    <bean name="report" class="org.springframework.example.ReportExcelView"/></beans>    如果視圖解析器沒有指定視圖的話,Spring就會檢查其它的視圖解析器,直到有一個完整的包含視圖的視圖解析器。如果一個完整的視圖解析器也沒有找到的話,Spring就會拋出 ServletException。    視圖解析器規定如果沒有找到視圖就返回null。但不是所有的視圖解析器都這么做,因為在某些情況下,解析器并不能檢測是否存在視圖。比如InternalResourceViewResolver在內部使用RequestDispatcher時,調度轉發是判斷JSP是否存在的唯一方法,但該action卻只能執行一次。VelocityViewResolver和其它的一些解析器也這樣,區分這些視圖解析器能否在找不到視圖的情況下返回null,最好的方法就是看官方文檔中它是否支持了。由于 InternalResourceViewResolver總會返回視圖,在視圖鏈中使用InternalResourceViewResolver就能讓你避免這些問題。    3.  重定向視圖    在controller控制器中強制重定向的方法就是創建并返回Spring的RedirectView實例。在這種情況下,DispatcherServlet不再使用正常的視圖機制,因為它已經返回了重定向視圖,DispatcherServlet只是告訴視圖去顯示。    RedirectView會調用 HttpServletResponse.sendRedirect()方法,然后它就作為HTTP重定向返回給客戶端瀏覽器。默認情況下,所有的模板屬性變量都認為是重定向URL,其余的屬性自動附加為查詢參數。    redirect前綴    盡管RedirectView工作機制很好,但如果控制器本身創建RedirectView時,毫無疑問控制器本身知道該如何重定向。這樣做并不好,控制器不應該關心響應如何處理,它只是處理被注入的視圖名稱。    當我們在返回視圖名稱時,如果使用了“redirect:”前綴(如“redirect : /login”),UrlBasedViewResolver視圖控制器會識別這是一次特殊的重定向,并把redirect后面的視圖名稱當做重定向的地址。    假如我們在http://favccxx.com應用中返回“redirect:/favboy”視圖時, 系統會重定向到http://favccxx.com/favboy。但如果我們返回了“redirect:http://favsoft.me”這樣的視圖時,系統會重定向到http://favsoft.me的視圖上。    forward前綴    forward前綴視圖是另一種通過URLBasedViewResolver機制處理到的轉向機制,它在視圖名稱周圍創建InternalResourceView,因此這個前綴跟InternalResourceViewResolver和InternalResourceView無關。但這個前綴在你想使用其它視圖技術但想強制通過Servlet/JSP引擎處理資源進行轉向時是有用的。    redirect與forward的區別       redirect方式相當 于"response.sendRedirect()".這種方式外部特征就是瀏覽器地址欄最后顯示的路徑是轉發后的新的路徑.工作方式是這樣的,服務器端會首先發一個response給瀏覽器,然后瀏覽器收到這個response后再發一個requeset給服務器,然后服務器發新的response給瀏覽器。這時頁面收到的request是一個新從瀏覽器發來的.這種方式的結果是:    A.在轉發前后有兩個不同的request對象,轉發前后的兩個控制器在request上的參數(request.getParameter())和request屬性(request.getAttribute())不能共享。    B.如果轉發前后的兩個控制器都配置在spring 攔截器范圍內,這樣攔截器會攔截前后兩個request,即會攔截兩次。    C.最后返回到瀏覽器后,因為地址欄顯示的是轉發后的url,所以刷新頁面時只會執行后面的url映射的控制器。    forward方式相當于 request.getRequestDispatcher().forward(request,response) .這種方式的外部特征是瀏覽器地址顯示的路徑是轉發前的路徑。工作方式是這樣,forward 發生在服務器內部,在前一個控制器處理完畢后,直接進入下一個控制器處理,并將最后的response發給瀏覽器。這種方式的結果是:    A.轉發前后是同一個request,后一個控制器可共享前一個控制器的參數與屬性。    B.因為是同一個request,攔截器只會攔截前一個url,如果前一個url在映射時未配置到攔截器攔截,則攔截后一個url,即只攔截一次。    C.最后返回到瀏覽器后,因為地址欄顯示的是轉發前的url,所以刷新頁面時會依次執行前后兩個控制器。   總結:本文介紹了Spring MVC 4中常見的幾種視圖解析器,以及如何配置視圖解析器包括鏈式視圖解析器,最后除了正常視圖映射機制外,我們還能夠通過redirect/forward視圖轉向機制完成視圖的重定向。本文偏向原理性介紹,關于視圖解析機制在工作中的使用,并沒有做過多的介紹,目的是讓讀者能夠了解ViewResolver的工作機制。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 略阳县| 上林县| 大埔县| 凤冈县| 嫩江县| 鄯善县| 蒙城县| 楚雄市| 鹤岗市| 巴林右旗| 雷波县| 新邵县| 永新县| 罗平县| 桃园县| 霍城县| 木兰县| 延寿县| 疏勒县| 石台县| 沛县| 黄大仙区| 九寨沟县| 丰顺县| 吴堡县| 禹城市| 沛县| 老河口市| 新竹市| 右玉县| 清水河县| 桃源县| 中宁县| 沙湾县| 淅川县| 泾阳县| 嘉鱼县| 鄂州市| 秦安县| 泰顺县| 翁源县|