springMVC:
一:創建第一個項目
01.引入需要的jar包
web webmvc context context-support
02.在web.xml文件中 配置我們需要的核心控制器 DispatcherServlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
注意點:
<servlet-name>springmvc</servlet-name>
那么我們springmvc的核心配置文件名稱 必須是 springmvc-servlet.xml
因為底層明確了文件的名稱是 <servlet-name>-servlet.xml
這個文件的位置 現階段 只能在web-inf 下面
03.在web-inf文件下創建需要的核心配置文件 springmvc-servlet.xml
頭部信息增加
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
04.書寫一個controller(其實就是我們的servlet) 繼承 AbastractController
二:第一個項目的整體流程
01.用戶在index.jsp頁面中點擊Hello超鏈接
02.點擊之后請求路徑是 /hello <a href="hello">Hello</a>
03.會被我們web.xml文件中配置的DispatcherServlet攔截
04.默認執行doDispatch()
HandlerExecutionChain mappedHandler = null; 處理器執行鏈
mappedHandler = this.getHandler(processedRequest); 根據用戶的請求獲取處理器執行鏈
4.1.跟進getHandler()看到了
for (HandlerMapping hm : this.handlerMappings)
handlerMappings是一個List<HandlerMapping>
HandlerExecutionChain handler = hm.getHandler(request);
hm是List<HandlerMapping>是集合中的一個元素===》HandlerMapping
根據用戶的請求在處理器映射器中查詢Handler
4.2.跟進getHandler()看到了
Object handler = getHandlerInternal(request); 獲取需要執行的Handler
HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request);
4.3.跟進getHandlerExecutionChain
發現方法中有處理器攔截器
for (HandlerInterceptor interceptor : this.adaptedInterceptors)
所以mappedHandler(處理器執行鏈)中包含一個即將執行的handler和一些列的interceptor(攔截器)
05.HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
獲取處理器適配器
跟進 getHandlerAdapter()
for (HandlerAdapter ha : this.handlerAdapters)
handlerAdapters是一個List<HandlerAdapter>
ha就是List<HandlerAdapter>其中一個元素 就是HandlerAdapter
if (ha.supports(handler)) {
return ha;
}
5.1:跟進supports
進入了HandlerAdapter====》是一個接口!
接口有5個實現類!默認執行3個!
在webmvc的jar包中的根目錄下找到DispatcherServlet.properties
默認的處理器映射器的配置
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
默認的處理器適配器的配置
org.springframework.web.servlet.HandlerAdapter
=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
5.2:回到doDispatch()
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
跟進handle()發現 HandlerAdapter====》是一個接口的handle()有5個實現
首先進入HttpRequestHandlerAdapter,我們的HelloController和HttpRequestHandler沒關系,繼續執行下一個Adapter
進入SimpleControllerHandlerAdapter,我們的HelloController繼承了AbstractController,
AbstractController實現了Controller! 產生了關系!
5.3:跟進SimpleControllerHandlerAdapter類中的handler()
return ((Controller) handler).handleRequest(request, response);
只有轉換成Controller才有handleRequest這個方法!
關鍵是我們的HelloController中的方法名稱是handleRequestInternal()
001.只有轉換成Controller才有handleRequest這個方法!
002.AbstractController重寫了Controller的handleRequest
003.但是返回的是一個handleRequestInternal()
004.我們的HelloController中的方法名稱是handleRequestInternal()
005.所以執行Controller的handleRequest就是執行HelloController中的handleRequestInternal()
三:配置視圖解析器
為什么?
01.我們controller中肯定會返回很多頁面
02.頁面的前綴/WEB-INF ==>安全
03.后綴都是以.jsp結尾
我們現在統一把所有的前綴和后綴寫在一個地方!
只要是后台有返回頁面,我會自動的給頁面加前綴和后綴!
這時候就需要我們配置視圖解析器
有疑問?
通關觀察dispatcherServlet.properties文件我們看到了有默認的試圖解析器
就是InternalResourceViewResolver!
那為什么我們還需要設置?
因為我們需要對InternalResourceViewResolver視圖解析器中的屬性賦值!
InternalResourceViewResolver的父類中 UrlBasedViewResolver的屬性沒有值
private String prefix = "";
private String suffix = "";
四:靜態資源的訪問
問題的引入:
01.我們在web.xml文件中配置核心控制器的url-pattern是什么? 是 /
02./ 不能匹配 .jsp .js .css .png....后綴路徑
03.如果我們項目中需要這些文件,是不能使用的!
所以需要設置允許靜態資源的訪問!
解決方式3種
01.去tomcat服務器中找到conf/web.xml中有如下配置
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern> 不會匹配靜態文件
</servlet-mapping>
在web.xml文件中配置
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
問題?
如果我們的圖片后綴比較多!那么我們的web.xml文件中的節點是不是很多!
02.在springmvc核心配置文件中配置 推薦使用
注釋掉web.xml文件中的配置
03.在springmvc核心配置文件中配置
<mvc:default-servlet-handler/>
五、springmvc的流程圖:
(1)
工作yuanl
(2)
(3)--------------------------------------------------------------------------------------------------------------------------------------------------
(4)底層代碼實現圖:
六、springMVC的工作原理:
SpringMVC的工作原理:
- SpringMVC所有的請求都提交給DispatcherServlet,它會委托應用系統的其它模塊負責對請求進行真正的處理工作。
- DispatcherServlet查詢一個或多個HandleMapping,找到處理請求的Controller.
- DispatcherServlet提交到目標Controller.
- Controller進行業務邏輯處理后,會返回一個ModelAndView
- Dispatcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
- 視圖對象負責渲染返回給客戶端。