天天看點

【Spring入門-05】DispatcherServletDispatcherServlet

文章目錄

  • DispatcherServlet
    • 參考

DispatcherServlet

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

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

【Spring入門-05】DispatcherServletDispatcherServlet

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版)