【Spring入門-05】DispatcherServlet

DispatcherServlet

Spring MVC 基於模型-視圖-控制器(Model-View-Controller,MVC)模式實現,用於構建鬆散耦合的 Web 應用。

Spring MVC 框架是圍繞 DispatcherServlet 設計的,DispatcherServlet 用來處理所有的 HTTP 請求和響應。

DispatcherServlet
DispatcherServlet 傳入 HTTP 請求的事件序列

  1. 收到一個 HTTP 請求後,DispatcherServlet 根據 HandlerMapping 來選擇並且調用適當的控制器
  2. 控制器接受請求,並基於使用的 GET 或 POST 方法來調用適當的 service 方法。service 方法將設置基於定義的業務邏輯的模型數據,並返回視圖名稱到 DispatcherServlet 中
  3. DispatcherServlet 會從 ViewResolver 獲取幫助,爲請求檢取定義視圖
  4. 一旦確定視圖,DispatcherServlet 將把模型數據傳遞給視圖,最後呈現在瀏覽器中

配置 DispatcherServlet

  1. 通過在 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>
  1. 藉助 Servlet3 規範和 Spring 3.1 的功能增強,繼承 AbstractAnnotationConfigDispatcherServetInitializer 的任意類會自動配置 DispatcherServlet 和 Spring 應用上下文
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版)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章