SpringMVC框架是圍繞一個DispatherServlet來設計的。這個Servlet會把請求分發給各個處理器,並支持可配置的處理器映射、視圖渲染、本地化、時區與主題渲染等,甚至還支持文件上傳。處理器是應用中使用註解@Controller和@RequestMapping的類和方法,Spring爲處理器方法提供了極其靈活的配置。前端
「對擴展開放」是Spring web MVC 框架的一個重要的設計原則,而對應Spring整個框架來講,其設計原則是「對擴展開放,對修改關閉」。java
從這張圖能夠清晰的看出,DispatherServlet本質上就是一個Servlet。web
引伸:Servlet生命週期spring
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app> |
1.Servlet 是個接口api
public void init(ServletConfig config) throws ServletException;
2.GenericServlet 中實現了初始化方法。mvc
public void init(ServletConfig config) throws ServletException {app
this.config = config;
this.init();//空方法,留給子類實現
}
3.HttpServlet 沒有對初始化相關的方法進行覆蓋。框架
4.HttpServletBean,重寫了init()方法。ide
其中又調用了一個initServletBean();方法,這本類中也是個空實現。this
5.FrameworkServlet 重寫了上邊留空的方法:initServletBean();
在initServletBean方法中最重要的就是調用了一個initWebApplicationContext() 方法。
initWebApplicationContext()內部調用了onRefresh(), 這個方法在本類中爲空實現,留給子類去實現。
6.DispatcherServlet,找到onRefresh()
@Override
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
至此,DispatherServlet初始化完畢!
①:DispatcherServlet是springmvc中的前端控制器(front controller),負責接收request並將request轉發給對應的處理組件.
②:HanlerMapping是springmvc中完成url到controller映射的組件.DispatcherServlet接收request,而後從HandlerMapping查找處理request的controller.
③:Cntroller處理request,並返回ModelAndView對象,Controller是springmvc中負責處理request的組件(相似於struts2中的Action),ModelAndView是封裝結果視圖的組件.
④ ⑤ ⑥:視圖解析器解析ModelAndView對象並返回對應的視圖給客戶端.
HandlerMapping
HandlerExecutionChain
HandlerInterceptor
HandlerAdapter
View