文章目錄
- DispatcherServlet
-
- 參考
DispatcherServlet
Spring MVC 基于模型-視圖-控制器(Model-View-Controller,MVC)模式實作,用于建構松散耦合的 Web 應用。
Spring MVC 架構是圍繞 DispatcherServlet 設計的,DispatcherServlet 用來處理所有的 HTTP 請求和響應。
DispatcherServlet 傳入 HTTP 請求的事件序列
- 收到一個 HTTP 請求後,DispatcherServlet 根據 HandlerMapping 來選擇并且調用适當的控制器
- 控制器接受請求,并基于使用的 GET 或 POST 方法來調用适當的 service 方法。service 方法将設定基于定義的業務邏輯的模型資料,并傳回視圖名稱到 DispatcherServlet 中
- DispatcherServlet 會從 ViewResolver 擷取幫助,為請求檢取定義視圖
- 一旦确定視圖,DispatcherServlet 将把模型資料傳遞給視圖,最後呈現在浏覽器中
配置 DispatcherServlet
- 通過在 web.xml 配置 DispatcherServlet
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
- 借助 Servlet3 規範和 Spring 3.1 的功能增強,繼承
的任意類會自動配置 DispatcherServlet 和 Spring 應用上下文AbstractAnnotationConfigDispatcherServetInitializer
public abstract class AbstractAnnotationConfigDispatcherServletInitializer
extends AbstractDispatcherServletInitializer {
@Override
@Nullable
protected WebApplicationContext createRootApplicationContext() {
Class<?>[] configClasses = getRootConfigClasses();
if (!ObjectUtils.isEmpty(configClasses)) {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(configClasses);
return context;
}
else {
return null;
}
}
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
Class<?>[] configClasses = getServletConfigClasses();
if (!ObjectUtils.isEmpty(configClasses)) {
context.register(configClasses);
}
return context;
}
@Nullable
protected abstract Class<?>[] getRootConfigClasses();
@Nullable
protected abstract Class<?>[] getServletConfigClasses();
}
兩個應用上下文
- 當 DispatcherServlet 啟動時,會建立 Spring 應用上下文,并加裝配置檔案或配置類中所聲明的 bean,如控制器、視圖解析器以及處理器映射。
- ContextLoaderListener 也會建立 Spring 應用上下文,如驅動應用後端的中間層和資料層元件。
AbstractAnnotationConfigDispatcherServetInitializer
會同時建立 DispatcherServlet 和 ContextLoaderListener。
getRootConfigClasses()
方法傳回的帶有 @Configuration 注解的類将會用來定義 ContextLoaderListener 應用上下文的 bean。
getServletConfigClasses()
方法傳回的帶有 @Configuration 注解的類将會用來定義 DispatcherServlet 應用上下文的 bean。
參考
GitHub 代碼
Spring 實戰(第4版)