Spring 5.2.2 MVC (1)

    通過三個多月的核心技術和數據訪問已經告一段落,接下來一段時間講Spring MVC工做機制和原理。java


       Spring Web MVC是基於Servlet API構建的原始Web框架,從一開始就包含在Spring框架中。正式名稱「Spring Web MVC」來自其源模塊(spring-webmvc)的名稱,但它一般稱爲「Spring MVC」。web

      與Spring Web MVC並行,Spring Framework 5.0引入了一個反應式堆棧Web框架,其名稱「Spring WebFlux」也基於其源模塊(spring-webflux)。算法


DispatcherServletspring

      和許多其餘web框架同樣,Spring MVC是圍繞前controller 模式設計的,其中一個重要的Servlet   爲 DispatcherServlet,請求處理提供了一個共享算法,而實際工做則由可配置的委託組件執行。該模型靈活,支持多種工做流。typescript

    DispatcherServlet做爲Servlet,都須要使用Java配置或web.xml根據Servlet規範聲明和映射。反過來DispatcherServlet使用Spring配置來發現請求映射、view解析、異常處理等所需的委託組件。微信

     如下Java配置示例註冊並初始化DispatcherServlet,它由Servlet容器自動檢測:mvc

public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override public void onStartup(ServletContext servletCxt) {
// 加載Spring web應用程序配置 AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext(); ac.register(AppConfig.class); ac.refresh();
// 建立並註冊DispatcherServlet DispatcherServlet servlet = new DispatcherServlet(ac); ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet); registration.setLoadOnStartup(1); registration.addMapping("/app/*"); }}

如下web.xml配置示例註冊並初始化DispatcherServletapp

<web-app>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/app-context.xml</param-value> </context-param>
<servlet> <servlet-name>app</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>app</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping>
</web-app>

    Spring Boot遵循不一樣的初始化順序。Spring Boot沒有鏈接到Servlet容器的生命週期中,而是使用Spring配置來引導自身和嵌入式Servlet容器。在Spring配置中檢測到過濾器和Servlet聲明,並將其註冊到Servlet容器中。框架


Context結構ide

    DispatcherServlet須要WebApplicationContext(純粹ApplicationContext的擴展)做爲本身的配置。WebApplicationContext具備一個到ServletContext和Servlet的關聯連接。它還綁定到ServletContext,這樣應用程序能夠在RequestContextUtils上使用靜態方法,以便在須要訪問WebApplicationContext時查找它。

     對於許多應用程序來講,擁有一個WebApplicationContext是簡單和足夠的。也能夠有一個上下文層次結構,其中一個root WebApplicationContext在多個DispatcherServlet(或其餘Servlet)實例中共享,每一個實例都有本身的子WebApplicationContext配置。

     root WebApplicationContext一般包含基礎設施bean,例如須要跨多個Servlet實例共享的數據存儲庫和業務服務。這些bean是有效繼承的,能夠在特定於Servlet的子WebApplicationContext中重寫(即從新聲明),該子WebApplicationContext一般包含給定Servlet的本地bean。下圖顯示了這種關係:


如下示例配置WebApplicationContext 層級結構:

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { RootConfig.class }; }
@Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { App1Config.class }; }
@Override protected String[] getServletMappings() { return new String[] { "/app1/*" }; }}

若是不須要應用程序上下文層次結構,則應用程序能夠經過getRootConfigClasses()返回全部配置,並經過getServletConfigClasses()返回null

下面的示例顯示了web.xml的等效項:

<web-app>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/root-context.xml</param-value> </context-param>
<servlet> <servlet-name>app1</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/app1-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>app1</servlet-name> <url-pattern>/app1/*</url-pattern> </servlet-mapping>
</web-app>

若是不須要應用程序上下文層次結構,則應用程序能夠僅配置「root」上下文,並將contextConfigLocation Servlet參數保留爲空。


明天講基於DispatchSevlet的 特殊Bean、Web MVC 配置、sevlet 配置等。


歡迎關注和轉發Spring中文社區(加微信羣,能夠關注後加我微信):




本文分享自微信公衆號 - Spring中文社區(gh_81d233bb13a4)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索