摘要:視圖解析框架同其它框架一樣,是請求驅動的,圍繞中心設計的。中心會分配請求到各個,以及提供其它功能。有個接口對于處理視圖來說是很重要的,一個是,另一個是。如果屬性被設置為的話,就會觸發從中加載所有基類為的,然后存入列表。
Spring Web MVC 視圖解析
Spring web MVC 框架同其它web MVC 框架一樣,是請求驅動的(request driven),圍繞中心Servlet設計的。中心Servlet會分配請求到各個Controllers,以及提供其它功能。Spring的DispatcherServlet就是這種中心Servlet,但做的更多。所有MVC框架都提供定位視圖(address views)的機制,Spring提供view resolvers,讓你能夠在瀏覽器上渲染models,而不會把你束縛在某一特定的視圖技術上。有2個接口(Interface)對于Spring處理視圖來說是很重要的,一個是ViewResolver,另一個是View。 ViewResolver提供視圖名稱與實際視圖的映射關系,View接口定位請求準備和請求處理到視圖技術上。Spring規定,Controller中的所有handler方法,必須解析到一個邏輯視圖,可以是顯式的(通過返回String、View或ModelView)或者是隱式的(基于協商 based on conventions)。在Spring中,視圖由邏輯視圖名稱定位,然后由一個view resolver解析。
Spring自帶的視圖解析器Spring自身帶有若干種view resolver,比如:AbstractCachingViewResolver、XmlViewResolver、ResourceBundleViewResolver、UrlBasedViewResolver、InternalResourceViewResolver、VelocityViewResolver、FreeMarkerViewResolver
、ContentNegotiatingViewResolver,你可以使用1種,或鏈式使用多種。使用方法就是在你的*-Servlet.xml配置文件種加入相關的bean。舉例如下:
J2EE環境下視圖解析器的加載
那么,問題是,Spring是如何從容器中感知到我們想要使用哪些ViewResoler的呢? 答案就在于DispatcherServlet類中的initViewResolvers方法。
DispatcherServlet.java中有一個私有方法,名為initViewResolvers,代碼片段如下,就是用來初始化所有ViewResolvers的。
/** * Initialize the ViewResolvers used by this class. *If no ViewResolver beans are defined in the BeanFactory for this * namespace, we default to InternalResourceViewResolver. */ private void initViewResolvers(ApplicationContext context) { this.viewResolvers = null; if (this.detectAllViewResolvers) { // Find all ViewResolvers in the ApplicationContext, including ancestor contexts. Map
matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false); if (!matchingBeans.isEmpty()) { this.viewResolvers = new ArrayList (matchingBeans.values()); // We keep ViewResolvers in sorted order. OrderComparator.sort(this.viewResolvers); } } else { try { ViewResolver vr = context.getBean(VIEW_RESOLVER_BEAN_NAME, ViewResolver.class); this.viewResolvers = Collections.singletonList(vr); } catch (NoSuchBeanDefinitionException ex) { // Ignore, we"ll add a default ViewResolver later. } } // Ensure we have at least one ViewResolver, by registering // a default ViewResolver if no other resolvers are found. if (this.viewResolvers == null) { this.viewResolvers = getDefaultStrategies(context, ViewResolver.class); if (logger.isDebugEnabled()) { logger.debug("No ViewResolvers found in servlet "" + getServletName() + "": using default"); } } }
如果detectAllViewResolvers屬性被設置為true的話,就會觸發DispatcherServlet從ApplicationContext中加載所有基類為ViewResolver的Beans,然后存入viewResolvers列表。
(initViewResolvers會被確保在WebApplicationContext被初始化好了以后才會被調用的)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67914.html
摘要:概述本章開始進入另一重要的組件,即視圖組件,處理視圖組件使用兩個主要的接口是和。接口的作用是用于處理視圖進行渲染。延用之前的介紹流程,本章分兩部分進行闡述啟動初始化和請求處理。 概述 本章開始進入另一重要的組件,即視圖組件,Spring MVC處理視圖組件使用兩個主要的接口是ViewResolver和View。根據名稱可知,ViewResolver即視圖解析器,其作用是把邏輯視圖名稱解...
摘要:概述本節學習下的功能,簡單來說,該類的作用就是把多個視圖解析器進行組裝,內部使用存儲配置使用的視圖解析器。總結本章介紹了類,根據測試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節學習下ViewResolverComposite的功能,簡單來說,該類的作用就是把多個ViewResolver視圖解析器進行組裝,內部使用list存儲配置使用的視圖解析器。 本系列文章是基于Spri...
摘要:在中,就是前端控制器的任務是將請求發送給控制器。處理器映射會根據請求所攜帶的信息來進行決策一旦選擇了合適的控制器,會將請求發送給選中的控制器。這些信息被稱為模型。因此無需在配置類中顯式聲明任何的控制器具體來講是試圖解析器。 Spring MVC基于模型-視圖-控制器(Model-View-Controller,MVC)模式實現,能夠構建像Spring框架那樣靈活和松耦合的Web應用程序...
摘要:與一樣,該類繼承抽象類,并且通過外部的屬性文件定義邏輯視圖名稱與真正的視圖對象的關系,屬性文件默認是下的,可以通過或屬性來指定,該屬性指的是文件的基名稱,也就是說以屬性值開頭的屬性文件。 概述 本章再學習另外兩個ViewResolver,分別是XmlViewResolver和ResourceBundleViewResolver,從功能上說,這兩個視圖解析器都是從外部資源文件中查找視圖V...
摘要:概述本章繼續學習另一個實現類解析器,該類的主要作用是根據同一請求的某些策略,選擇對應的進行渲染。可以把理解為適配器,對不同類型進行適配。值得注意的是處理的為同一個。本系列文章是基于。實戰需求目標實現后綴名或參數控制,顯示不同的視圖。 概述 本章繼續學習ViewResolver另一個實現類ContentNegotiatingViewResolver解析器,該類的主要作用是根據同一請求的某...
閱讀 1266·2021-11-24 09:39
閱讀 1517·2021-09-07 09:59
閱讀 3479·2019-08-30 15:54
閱讀 2474·2019-08-30 11:00
閱讀 2669·2019-08-29 15:06
閱讀 2160·2019-08-26 13:52
閱讀 427·2019-08-26 13:24
閱讀 2489·2019-08-26 12:20