一:建立第一個項目
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>css
注意點:
<servlet-name>springmvc</servlet-name>
那麼咱們springmvc的核心配置文件名稱 必須是 springmvc-servlet.xml
由於底層明確了文件的名稱是 <servlet-name>-servlet.xml
這個文件的位置 現階段 只能在web-inf 下面web
03.在web-inf文件下建立須要的核心配置文件 springmvc-servlet.xml
頭部信息增長
xmlns:mvc="http://www.springframework.org/schema/mvc"spring
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
04.書寫一個controller(其實就是咱們的servlet) 繼承 AbastractControllerspring-mvc
二:第一個項目的總體流程tomcat
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);mvc
4.3.跟進getHandlerExecutionChain
發現方法中有處理器攔截器
for (HandlerInterceptor interceptor : this.adaptedInterceptors)app
因此mappedHandler(處理器執行鏈)中包含一個即將執行的handler和一些列的interceptor(攔截器)jsp
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/>
5、springmvc的流程圖:
(1)
工做yuanl
(2)
(3)--------------------------------------------------------------------------------------------------------------------------------------------------
(4)底層代碼實現圖:
6、springMVC的工做原理:
SpringMVC的工做原理: