SpringMVC框架結構的圖解、架構的處理流程以及三大元件的說明和使用
1.1 框架結構
1.2 架構流程
1.使用者傳送請求至前端控制器DispatcherServlet;
2.DispatcherServlet收到請求呼叫HandlerMapping處理器對映器;
3.處理器對映器根據url找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。結果:Handler;
4.DispatcherServlet通過HandlerAdapter處理器介面卡呼叫處理器執行;
5.執行處理器(Controller,也叫後端控制器)
6.Controller執行完成後返回ModelAndView
7.HandlerAdpater將controller執行結果ModelAndView返回給DispatcherServlet.
8.DispatcherServlet將ModelAndView傳給ViewResloved檢視解析器
9.ViewResloved解析後返回具體View
10.DispatcherServlet對View進行渲染(即將模型資料填充至檢視中)
11.DispatcherServlet相應使用者。
1.3 元件說明
以下元件通常使用框架提供實現:
- DiapatcherServlet:前端控制器
使用者請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它呼叫其他元件處理使用者的請求,dispatcherServlet的存在降低了元件之間的耦合性。
- HandlerMapping:處理器對映器
HandlerMapping負責根據使用者請求找到Handler(即處理器),springmvc提供了不同的對映器實現不同的對映方式。例如:配置檔案方式,實現介面方式,註解方式等。
- Handler:處理器
Handler是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler度具體的使用者請求進行處理。
由於Handler涉及具體的使用者業務請求,所以一般情況需要程式要根據業務需求開發Handler.
- HandlerAdapter:處理器介面卡
通過HandlerAdapter對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理器進行執行。
- ViewReslover:檢視解析器
ViewReslover負責處理結果生成View檢視,ViewReslover首先根據邏輯檢視名解析成物理檢視名即具體的頁面地址,再生成View檢視物件,最後對View進行渲染將處理結果通過頁面展示給使用者。
- View:檢視
springmvc框架提供了很多的View檢視型別的支援,包括jstView、freemakerView、pdfView等。我們最常用的檢視就是jsp。
一般情況下需要通過頁面標籤或頁面模板技術將模型資料通過頁面展示給使用者,需要由程式設計師根據業務需求開發具體的頁面。
說明:在springmvc的各個元件中,處理器對映器、處理器介面卡、檢視解析器成為springmvc的三大元件。
需要使用者開發的元件有handler、view。
1.4 框架預設載入元件
1.5 註解對映器和介面卡
1.5.1 元件掃描器
使用元件掃描器省去在spring容器配置每個controller類的繁瑣。使用<context:component-scan>自動掃描標記@controller的控制器類,配置如下:
<!-- 包的掃描器 --> <context:component-scan base-package="com.huida.controller"></context:component-scan>
多個包中間使用半形逗號分隔。
1.5.2 RequestMappingHandlerMapping
註解式處理器對映器,對類中標記@RequestMapping的方法進行對映,根據RequestMapping定義的url匹配RequestMapping標記的方法,匹配成功返回HandlerMethod物件給前端控制器,HandlerMethod物件中封裝url對應的方法Method。
從spring3.1開始,廢除了DefaultAnnotationHandlerMapping的使用,推薦使用
RequestMappingHandlerMapping完成註解式處理器對映。
配置如下:
<!-- 註解形式的處理器其對映器 --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
包的名字可以在DiapatcherServlet.properties的檔案中找到。
註解描述:
@RequestMapping:定義請求url到處理器功能方法的對映。
1.5.3 RequestMappingHandlerAdapter
註解式處理器,對標記@RequestMapping的方法進行適配。
從spring3.1開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用
RequestMappingHandlerAdapter完成註解式處理器適配。
配置如下:
<!-- 註解形式的處理器介面卡 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
包的名字可以在DiapatcherServlet.properties的檔案中找到。
1.5.4 <mvc:annotation-driven>
springmvc使用<mvc:annotation-driven>自動載入RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在springmvc.xml配置檔案中使用<mvc:annotation-driven>替代註解處理器和介面卡的配置。
注意:如果沒有顯式的配置處理器對映器和處理器介面卡,那麼springMVC會去預設的
DispatcherServlet.properties中查詢。對應的處理器對映器和處理器介面卡去使用,這樣每個請求都要掃描一次他的預設檔案,效率非常低,會降低訪問速度,所以要顯式的配置處理器對映器和處理器介面卡。
1.6 檢視解析器
在springmvc.xml檔案配置如下:
<!-- 配置檢視解析器 地址可以在:配置的檢視解析器的包可以從DispatcherServlet.properties中找 作用:可以在controller中指定頁面路徑的時候不用寫完整的路徑名稱,可以直接寫頁面去掉副檔名的名稱 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 字首 --> <property name="prefix" value="/WEB-INF/jsp"></property> <!-- 字尾 --> <property name="suffix" value=".jsp"/> </bean>
包的名字可以在DiapatcherServlet.properties的檔案中找到。
InternalResourceViewResolver:支援JSP檢視解析。
viewClass:JstlView表示JSP模板頁面需要使用JSTL標籤庫,所以classpath中必須包含jstl的相關jar 包。此屬性可以不設定,預設為JstlView。
prefix 和suffix:查詢檢視頁面的字首和字尾,最終檢視的址為:字首+邏輯檢視名+字尾,邏輯檢視名需要在controller中返回ModelAndView指定,比如邏輯檢視名為hello,則最終返回的jsp檢視地址 “WEB-INF/jsp/hello.jsp”。