1. 程式人生 > >Spring MVC 學習 ——

Spring MVC 學習 ——

版本5.1.3.RELEASE

這部分文件包括對基於Servlet API構建並部署到Servlet容器的Servlet-stack Web應用程式的支援。各個章節包括Spring MVC,View Technologies,CORS支援和WebSocket支援。對於反應堆疊Web應用程式,請參閱Web on Reactive Stack。

1. Spring Web MVC

Spring Web MVC是構建在Servlet API上的原始Web框架,從一開始就包含在Spring Framework中。正式名稱“Spring Web MVC”來自其源模組(spring-webmvc)的名稱,但它通常被稱為“Spring MVC

”。

與Spring Web MVC並行,Spring Framework 5.0引入了一個反應堆疊Web框架,其名稱“Spring WebFlux”也基於其源模組(spring-webflux)。本節介紹Spring Web MVC。下一節將介紹Spring WebFlux。

有關基本資訊以及與Servlet容器和Java EE版本範圍的相容性,請參閱Spring Framework Wiki。

1.1. Spring MVC 的前端控制器

Spring MVC和許多其他Web框架一樣,圍繞前端控制器模式設計,其中中央Servlet DispatcherServlet(Servlet 前端控制器)為請求處理提供共享演算法(簡單來說就是前端控制器提供了一個演算法告訴app獲取的請求該怎樣分發向哪裡傳送)

,而實際工作由可配置委託元件(XML等)執行(翻譯:實際的工作主要看配置檔案怎樣分配)。該模型非常靈活,支援多種工作流程。

DispatcherServlet與任何Servlet一樣,需要使用Java配置或web.xml根據Servlet規範進行宣告和對映。反過來,DispatcherServlet使用Spring配置來發現請求對映,檢視解析,異常處理等所需的委託元件

下面的Java配置示例註冊並初始化DispatcherServlet,它由Servlet容器自動檢測(相關配置後面將介紹):

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletCxt) {

        // Load Spring web application configuration
        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
        ac.register(AppConfig.class);
        ac.refresh();

        // Create and register the DispatcherServlet
        DispatcherServlet servlet = new DispatcherServlet(ac);
        ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/app/*");
    }
}

除了直接使用ServletContext API之外,您還可以擴充套件AbstractAnnotationConfigDispatcherServletInitializer並覆蓋特定方法

以下web.xml配置示例註冊並初始化DispatcherServlet:

<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使用Spring配置來引導自身和嵌入式Servlet容器,而不是掛鉤到Servlet容器的生命週期。在Spring配置中檢測Filter和Servlet宣告,並在Servlet容器中註冊。有關更多詳細資訊,請參閱Spring Boot官方文件。

Context 層次結構

DispatcherServlet需要一個WebApplicationContext(普通ApplicationContext的擴充套件)來進行自己的配置。WebApplicationContext有一個指向ServletContext的連結以及與之關聯的Servlet。它還繫結到ServletContext,以便應用程式可以使用RequestContextUtils上的靜態方法來查詢WebApplicationContext,如果它們需要訪問它的話。

對於許多應用程式,擁有單個WebApplicationContext很簡單且足夠。也可以有一個上下文層次結構,其中一個根WebApplicationContext在多個DispatcherServlet(或其他Servlet)例項之間共享,每個例項都有自己的子WebApplicationContext配置

根WebApplicationContext通常包含基礎結構bean,例如需要跨多個Servlet例項共享的資料儲存庫和業務服務。這些bean是有效繼承的,可以在特定於Servlet的子WebApplicationContext中重寫(即重新宣告),它通常包含給定Servlet本地的bean。下圖顯示了這種關係:

mvc context hierarchy

以下示例配置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/*" };
    }
}

如果不需要application context hierarchy,則應用程式可以通過getRootConfigClasses()返回所有配置,並從getServletConfigClasses()返回null。