SpringMVC是Spring框架的一個模塊,springmvc和spring無需通過中間整合層進行整合,是基於mvc的web框架
一、步驟描述及圖解
SpringMVC圖解
第1步 瀏覽器發送請求到前端控制器DispatchServlet
第2步 前端控制器請求HandlerMapping查找Handler,可以根據xml配置、註解進行查找
第3步 處理映射器HandlerMapping向前端控制器返回Handler
第4步 前端控制器請求處理器適配器(HandlerAdapter)執行Handler
第5步 處理器適配器調用Handler
第6步 處理器(Handler)向處理器適配器返回ModelAndView(是spring框架的一個底層對象)
第7步 處理器適配器向前端控制器返回ModelAndView
第8步 前端控制器請求視圖解析器(viewResolver)進行視圖解析,根據邏輯視圖名解析成真正的視圖(如jsp頁面)
第9步 視圖解析器向前端控制器返回view
第10步 前端控制器進行視圖渲染,將模型數據(在ModelAndView對象中)填充到request域
第11步 前端控制器向用戶響應結果
組件解釋:
1、前端控制器 DispatchServlet(框架提供)接收請求、響應結果,相當於轉發器(中央處理器),減少了其它組件之間的耦合
2、處理器映射器 HandlerMapping(框架提供),根據請求的url查找Handler
3、處理器適配器 HandlerAdapter 按照HandlerAdapter 要求的規則去執行Handler
4、處理器Handler(需要開發)編寫時按照HandlerAdapter的要求,這樣適配器才能正確執行Handler
5、視圖解析器ViewResolver(框架提供)進行視圖解析,根據視圖名解析成真正的視圖(view)
6、視圖 view(需要開發)是一個接口,實現類支持不同的view類型(jsp、freemarke…)
二、編碼部分
web.xml配置前端控制器DispatchServlet
<!-- springMvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加載的配置文件(其中配置處理器映射器,適配器等)
如果不配置contextConfigLocation,默認加載的是WEB-INF/servlet名稱-servlet.xml(即springmvc-servlet.xml)
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
1、匹配順序
該標籤處理客戶端請求的順序爲:
(1)完全匹配
<url-pattern>/test/userList.action</url-pattern>
完全匹配就是等值匹配,它是最先被匹配到的客戶端請求。
(2)路徑匹配
<url-pattern>/*</url-pattern> 匹配根路徑下的全部請求
路徑匹配類似於模糊匹配,對於/list、listInfo.do、checkInfo.action、index.jsp、abc.css、my.js等等url請求,都可以被匹配到。這種匹配的順序排在完全匹配後面。
(3)擴展名匹配
<url-pattern>*.action</url-pattern>匹配全部action 結尾的請求
<url-pattern>*.css</url-pattern> 匹配全部 css結尾的請求
<url-pattern>*</url-pattern> 不能用 * ,否則報錯
說明:這種匹配匹配在開發中用的比較多,但不能使用*代替,否則會報錯。
結論:容器會首先查找完全匹配,如果找不到,再查找目錄匹配,如果也找不到,就查找擴展名匹配。
(1)<url-pattern>/</url-pattern>
會匹配到 /toIndex 這種類型的 url ,不會匹配到模式爲 *.jsp 這樣的後綴型 url。
(2)<url-pattern>/*</url-pattern>
會匹配所有路徑型的和後綴型的url。
-->
<!--配置方式
第一種:*.action 訪問以.ation結尾的路徑 由DispatcherServlet進行解析
第二種:/ 所有訪問的地址都由DispatcherServlet進行解析,對於靜態文件的解析需要配置不讓DispatcherServlet解析
使用此種方式可以實現RESTful風格的url
第三種:/* 這樣配置錯誤,使用這種配置最終要轉發一個jsp頁面時仍然會使用DispatcherServlet解析jsp地址,不能根據jsp頁面找到Handler會報錯
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
spring-mvc.xml配置
配置處理器適配器
<!-- 處理器適配器 所有處理器適配器都實現了HandlerAdapter -->
<bean id="simpleControllerHandlerAdapter" class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
此接口實現了controller的Handler接口
配置處理器映射器
<!-- 處理器映射器 簡單url映射
將bean的name作爲url進行查找,需要配置Handler時指定beanname(即url)
-->
<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
配置視圖解析器
<!-- 視圖解析器 解析jsp視圖,默認使用jstl標籤,classpath下得有jstl的包 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
配置Handler
<!-- 配置Handler 這裏的後綴對應web.xml中url-pattern的配置 -->
<bean id="itemsController" name="/queryList.action" class="com.idea.controller.ItemsController"></bean>
簡單的url映射
<bean id="simpleControllerHandlerAdapter" class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter">
<property name="mappings">
<props>
<!-- 對controller進行url映射 填寫controller bean標籤的id,同一個bean可以有多個url -->
<prop key="/query1.action">itemsController</prop>
</props>
</property>
</bean>
多個映射器可以並存,前端控制器會判斷url符合規則的都可以
關於spring註解配置
前端控制器從/org/springframework/web/servlet/DispatcherServlet.properties文件中加載處理器映射器、適配器、視圖解析器等組件,如果不在springmvc.xml中配置,則使用默認加載
在spring版本3.1前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping註解映射器
在spring版本3.1後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping註解映射器
在spring版本3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter註解適配器
在spring版本3.1之後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter註解適配器
通過springmvc源碼分析執行過程
第一步:前端控制器接收請求
調用 doDispatch方法
第二步:doDispatch方法會執行getHandler方法 返回HandlerExecutionChain
第三步:調用處理器適配器處理Handler,返回ModelAndView
第四步:調用視圖解析器得到view
視圖渲染 將model數據填充到Request域
視圖解析器配置,可配置jsp頁面前後綴