django啟動時執行某個方法、1 DispatcherServlet
1.1 DispatcherServlet繼承結構
SpringBoot項目、
ServletConfig對象獲取Init標簽中的配置信息
1.1.1 HttpServletBean
HttpServletBean復習了init方法,主要做一些初始化的工作麻將web.xml中配置的參數
設置到Servlet中。比如servlet標簽中的子標簽init-param標簽中配置的參數
1.1.1.1 ServletConfigPropertyValues
ServletConfigPropertyValues是HttpServletBean的靜態內部類。在其構造方法中通
過傳遞的ServletConfig對象對web.xml文件中的DispatcherServlet節點中的參數及
及逆行解析處理
1.1.1.2 BeanWrapper bw =PropertyAccessorFactory.forBeanPropertyAccess(this):
將 HttpServletBean 類型轉換為 BeanWrapper 類型,從而能對 init-parameter 的
值進行注入。
1.1.1.3 bw.registerCustomEditor(Resource.class,
newResourceEditor(resourceLoader,getEnvironment())):
注冊自定義屬性編輯器,遇到 Resource 類型的屬性將會使用 ResourceEditor 進行解析
1.1.1.4 initBeanWrapper(bw):該方法并未做什么,為了留給子類覆蓋。
1.1.1.5 bw.setPropertyValues(pvs,true): 設置 DispatcherServlet 屬性
1.1.1.6 initServletBean(): 調用在 FrameworkServlet 中覆蓋的該方法
* 當spingmvc啟動時會調用init方法獲取inint標簽中屬性的值,將值封裝到
ProperValues中
1.1.2 FrameworkServlet
將 Servlet 上下文與 Spring 容器上下文關聯。其實也就是初始化 FrameworkServlet
的屬 性webApplicationContext , 這 個 屬 性 代 表 SpringMVC 上 下 文 對 象 , 實
際 類 型ConfigurableWebApplicationContext。如果項目中用到spring了那么它有個
父容器,既web.xml 中配置的 ContextLoaderListener 監聽器初始化的容器上下文。
1.1.2.1 this.webApplicationContext = initWebApplicationContext():
可以看到,最重要的就是
this.webApplicationContext=initWebApplicationContext(); 這段代碼,這個方法的
作用是創建或刷新 WebApplicationContext 實例。如果項目中使用 到了 spring,則
進行父子容器關聯。
1.1.2.2 initWebApplicationContext()方法:
如果項目中使用 spring 框架,并且在 web.xml 文件中配置了 Listener 來啟動 spring。那 么在監 聽器中 spring 會創建 WebApplicationContext 容器。 此時會將 該容器轉換 為 ConfigurableWebApplicationContext 即 SpringMVC 容器。
如果沒有在 web.mxl 文件中配置 Listener 那么此時 webApplicationContext 為 空 則 去
ServletContext 中 根 據 attrname 查 找 。 如 果 為 找 到 , 執 行
createWebApplicationContext 方法來創建 SpringMVC 的容器。
1.1.2.3 createWebApplicationContext(rootContext):
1.1.2.4 createWebApplicationContext(ApplicationContext parent)
1.1.2.5 configureAndRefreshWebApplicationContext
(ConfigurableWebApplicationContextwac):
1.1.2.6 refresh():
解析配置文件初始化 SpringMVC 的 IOC 容器環境。 解析 springmvc 配置文件:
初始化所有的bean對象
解析命名空間
1.1.3DispatcherServlet
1.1.3.1 ContextRefreshListener
1.1.3.2 onRefresh(ApplicationContextcontext):
1.1.3.3 initStrategies(ApplicationContextcontext): 初始化 SpringMVC 其他組件:如多
部件解析器、處理器映射器、處理器適配器、視圖解析器等。
2 HandlerMapping接口
2.1 初始化HandlerMapping接口
2.1.1initStrategies
2.1.2initHandlerMappings
2.2HandlerMapping 接口介紹
作用是根據當前請求的找到對應的Handler(HandlerMethod(Controller 中的方法)、
Controller 對 象 ),并將Hanler與一堆HandlerInterceptor (攔截器)封裝到
HandlerExecutionChain 對象中。在HandlerMapping接口的內部只有一個方法
HandlerExecutionChaingetHandler(HttpServletRequestrequest);
2.3HandlerMapping 接口實現類
HandlerMapping 實現類有兩個分支,分別繼承自
AbstractHandlerMethodMapping(得 到 HandlerMethod)和
AbstractUrlHandlerMapping(得到 Controllert),它們又統一繼承于
AbstractHandlerMapping。
2.3.1 AbstractHandlerMapping抽象類
它實現了 HandlerMapping 接口中的 getHandler() 方法
2.3.1.1 AbstractHandlerMethodMapping
AbstractHandlerMethodMapping 這個分支獲取的 Handler 的類型是
HandlerMethod,即 這個Handler 是一個方法,它保存了方法的信息(如
Method),這樣一個 Controller 就可 以處理多個請求了。
上述代碼中 lookupHandlerMethod() 方法主要工作是在 Map<T, HandlerMethod>
handlerMethods 中找到 HandlerMethod,這里的 T 是 HandlerMappingInfo,它
封裝了 @RequestMapping 注解中的信息(url),HandlerMethodshurl對應的方法。
2.3.1.2 AbstractUrlHandlerMapping 抽象類
AbstractUrlHandlerMapping 這個分支獲取的 Handler 的類型實際就是一個
Controller類。
3 HandlerAdapter 接口
SpringMVC 中使用適配器模式來解決不同的 Handler 的執行。根據 Handler 來找到支
持它的HandlerAdapter,通過 HandlerAdapter 執行這個 Handler 得到
ModelAndView 對 象。
3.1接口中的抽象方法
booleansupports(Objecthandler); 判斷是否支持傳入的 Handler ModelAndView
handle(HttpServletRequest request, HttpServletResponse response, Object
handler) :用來使用 Handler 處理請求
long getLastModified(HttpServletRequest request, Object handler); 用 來 獲 取 資
料 的 Last-Modified 值
3.2 HandlerAdapter繼承結構
3.3 AbstractHandlerMethodAdapter 抽象類
利用 RequestMappingHandlerMapping 獲取的 Handler 是 HadnlerMethod 類型,
它代 表 Controller 里要執行的方法。handlerInternal 是子類
RequestMappingHandlerAdapter 中的 方法。
3.4 RequestMappingHandlerAdapter 類
RequestMappingHandlerAdapter 實際就是執行@RequestMapping 注解的方法
3.4.1 handleInternal 方法
在 handlerInternal 方法中通過調用 invokeHandleMethod 方法執行
HandlerMethod 并返回 一個 ModelAndView。
3.4.2invokeHandleMethod 方法
3.5 HttpRequestHandlerAdapter 類
HttpRequestHandlerAdapter 。 是 HttpRequestHandler 的 適 配 器 可 以 執 行
HttpRequestHandler 類型的 Handler。其實就是 Controller 中的 handleRequest 方法
3.6 SimpleControllerHandlerAdapter 類
SimpleControllerHandlerAdapter 是 Controller 實現類的適配器類,其本質也是執行
Controller 中的 handleRequest 方法。
3.7 SimpleServletHandlerAdapter 類
SimpleServletHandlerAdapter 其實是一個 Servlet 的適配器,其最終執行的方法是
Servlet 的 service 方法、
3.8Debug 走讀 DispatcherServlet 中初始化處理器適配器
3.8.1在配置文件中配置<mvc:annotation-driven/>
{org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
dapter#0=org.springframework.web.servlet.mvc.method.annotation.RequestMapping
HandlerAdapter@4e afea11, org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter=org.springframew
ork.we b.servlet.mvc.HttpRequestHandlerAdapter@1a4d6190, org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter=org.springfra
mewor k.web.servlet.mvc.SimpleControllerHandlerAdapter@710d6556}
3.8.2未在配置文件中配置<mvc:annotation-driven/>
[org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@508cddf9,
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@688a3991,
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
@6f15d959]
4 ViewResolver 接口
根據視圖的名稱將其解析為 View 類型的視圖,如通過 ModelAndView 中的視圖名稱 將
其解析成 View,View 是用來渲染頁面的,也就是將 Model 填入模板中,生成 html 或
其他格式的文件。
4.1接口中抽象方法
ViewresolveViewName(StringviewName,Localelocale)throwsException;
4.3AbstractCachingViewResolver 抽象類
AbstractCachingViewResolver 是帶有緩存的 ViewResolver,它每次解析時先從緩存里
查 找,如果找到視圖就返回,沒有就創建新的視圖,且創建新視圖的方法由其子類實現。
4.3.2 createView方法
通過調用不同的子類中的 loadView 來指定不同視圖解析器處理視圖。
4.4ResourceBundleViewResolver 類
ResourceBundleViewResolver 根據 views.properties 文件來解析視圖,這個文件應位于
classpath 路徑下
4.5XmlViewResolver 類
XmlViewResolver 根據 xml 文件來解析視圖
4.6UrlBasedViewResolver 類
UrlBasedViewResolver 提供了拼接 URL 的方式來解析視圖,通過 prefix 屬性拼接一 個
前綴,通過 suffix 屬性拼接一個后綴,就得到了視圖的 URL。還可以加入 redirect: 與、
forword: 前綴,使用 redirect: 前綴會調用 HttpServletResponse 對象的
sendRedirect() 方法 進行重定向,使用 forword: 前綴會利用 RequestDispatcher 的
forword 方式跳轉到指定的地 址。另外,使用時還要指定 viewClass 屬性,表示要解析
成哪種 View。
4.7InternalResourceViewResolver 類
InternalResourceViewResolver 是 UrlBasedViewResolver 的 子 類 , 將
InternalResourceView 作為默認的 View 類,但如果當前 classpath 中有 jstl 的 jar 包
時則 使用 JstlView 作為 view 來渲染。
4.7.1 UrlBasedViewResolver 類
4.7.2InternalResourceViewResolver 類
5 View接口
視圖渲染器,在該接口中定義了渲染視圖的抽象方法。 何為渲染:所謂渲染其實就是將
Model 中的數據放到 HttpServletRequest 中傳遞 jsp。
void render(Map<String, ?> model, HttpServletRequest request,
HttpServletResponse response)throwsException;
5.1 結構結構
5.2 InternalResourceView 類
繼承自 AbstractUrlBasedView 抽象類的類,表示 JSP 視圖
5.3Debug 走讀 ViewResolver
5.3.1DispatcherServlet 初始化視圖解析器
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态