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獲取的請求該怎樣分發向哪裡傳送)
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。下圖顯示了這種關係:
以下示例配置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。