springmvc原理

一 : 架構圖

二 : 執行流程

一、   用戶發送請求至前端控制器DispatcherServletcss

二、   DispatcherServlet收到請求調用HandlerMapping處理器映射器。前端

三、   處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。程序員

四、   DispatcherServlet經過HandlerAdapter處理器適配器調用處理器web

五、   執行處理器(Controller,也叫後端控制器)。spring

六、   Controller執行完成返回ModelAndViewjson

七、   HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet後端

八、   DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器設計模式

九、   ViewReslover解析後返回具體Viewspring-mvc

十、DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。架構

十一、DispatcherServlet響應用戶

----------------------------------------------------------

三 :  組件說明

如下組件一般使用框架提供實現:

1,  DispatcherServlet:前端控制器 , 就是一個servlet

a , 用戶請求到達前端控制器,它就至關於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在下降了組件之間的耦合性。

b , 前端控制器的配置

WEB-INF\web.xml中配置前端控制器,就是一個servlet

<servlet>
   <servlet-name>springmvc</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>*.action</url-pattern>
</servlet-mapping>

load-on-startup:表示servlet隨服務啓動;

url-pattern:*.action的請交給DispatcherServlet處理。

contextConfigLocation:指定springmvc配置的加載位置,若是不指定則默認加

WEB-INF/[DispatcherServlet Servlet 名字]-servlet.xml

c , Servlet攔截方式

1)、攔截固定後綴的url,好比設置爲 *.do、*.action, 例如:/user/add.action

此方法最簡單,不會致使靜態資源(jpg,js,css)被攔截。

2)、攔截全部,設置爲/,例如:/user/add  /user/add.action

此方法能夠實現REST風格的url,不少互聯網類型的應用使用這種方式。

可是此方法會致使靜態文件(jpg,js,css)被攔截後不能正常顯示。須要特殊處理。

3)、攔截全部,設置爲/*,此設置方法錯誤,由於請求到Action,當action轉到jsp時再次被攔截,提示不能根據jsp路徑mapping成功。

----------------------------------------------------------

springmvc配置文件

Springmvc默認加載WEB-INF/[前端控制器的名字]-servlet.xml,也能夠在前端控制器定義處指定加載的配置文件,以下:

<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>

如上代碼,經過contextConfigLocation加載classpath下的springmvc.xml配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.0.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">

----------------------------------------------------------

2,  HandlerMapping:處理器映射器

HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不一樣的映射器實現不一樣的映射方式,例如:配置文件方式,實現接口方式,註解方式等。

a , 配置文件 式

a-1 : BeanNameUrlHandlerMapping:表示將定義的Bean名字做爲請求的url,須要將編寫的controller在spring容器中進行配置,且指定bean的name爲請求的url,且必須以.action結尾。

<!-- 處理器映射器 -->
	<!-- 根據bean的name進行查找Handler 將action的url配置在bean的name中 -->
	<bean
		class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

根據請求的url與spring容器中定義的bean的name進行匹配,從而從spring容器中找到bean實例。

<!-- controller配置 -->
	<bean name="/items1.action" id="itemList1" class="cn.itcast.springmvc.controller.first.ItemList1"/>

請求的URL 爲「上下文/items1.action」將會成功映射到ItemList1控制器。

a -2 : simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的加強版本,它能夠將url和處理器bean的id進行統一映射配置。

<!—簡單url映射 -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/items1.action">controller的bean id</prop>
				<prop key="/items2.action">controller的bean id</prop>
			</props>
		</property>
	</bean>
<bean name="/items1.action" id="itemController" 
class="cn.itcast.springmvc.controller.first.ItemList1"/>
	<bean name="/items2.action" id="itemController" 
class="cn.itcast.springmvc.controller.first.ItemList1"/>

經過訪問URL 爲 "上下文/items1.action" 或者 "上下文/items2.action" 均可以成功映射到ItemList1控制器

----------------------------------------------------------

3,  Handler:處理器

Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。

因爲Handler涉及到具體的用戶業務請求,因此通常狀況須要程序員根據業務需求開發Handler。即Controller

a , 當處理器映射器使用配置式 , 即便用 BeanNameUrlHandlerMapping  進行映射的時候, 處理器須要實現Controller接口, 複寫 handleRequest 方法 , 最終返回ModelAndView

public class ItemList1 implements Controller {

	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
//填充數據
		modelAndView.addObject("itemsList", itemsList);
		//視圖
		modelAndView.setViewName("order/itemsList");
		
		return modelAndView;
	}

   處理器開發完成以後, 須要實例化, 還要配置根據 bean的name屬性進行映射, 才能經過處理器映射器找處處理器

springmvc.xml文件配置以下 :

<!-- controller配置 -->
	<bean name="/items1.action" id="itemList1" 
class="cn.itcast.springmvc.controller.first.ItemList1"/>

name="/items1.action":前邊配置的處理器映射器爲BeanNameUrlHandlerMapping,若是請求的URL 爲「上下文/items1.action」將會成功映射到ItemList1控制器。

----------------------------------------------------------

4,  HandlAdapter:處理器適配器

經過HandlerAdapter對處理器進行執行,這是適配器模式的應用,經過擴展適配器能夠對更多類型的處理器進行執行。處理器適配器調用處理器,返回 ModelAndView 即模型視圖

HandlerAdapter會根據適配器接口對後端控制器進行包裝(適配),包裝後便可對處理器進行執行,經過擴展處理器適配器能夠執行多種類型的處理器,這裏使用了適配器設計模式。

a : 

SimpleControllerHandlerAdapter 簡單控制器處理器適配器,全部實現了org.springframework.web.servlet.mvc.Controller 接口的Bean經過此適配器進行適配、執行。

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

SimpleControllerHandlerAdapter:即簡單控制器處理適配器,全部實現了org.springframework.web.servlet.mvc.Controller 接口的Bean做爲Springmvc的後端控制器。

b :

HttpRequestHandlerAdapter,http請求處理器適配器,全部實現了org.springframework.web.HttpRequestHandler 接口的Bean經過此適配器進行適配、執行。

適配器配置以下:

<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

Controller實現以下:

public class ItemList2 implements HttpRequestHandler {

	@Override
	public void handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
// 填充數據
		request.setAttribute("itemsList", itemsList);
		
		// 視圖
		request.getRequestDispatcher("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response);

從上邊能夠看出此適配器器的handleRequest方法沒有返回ModelAndView,可經過response修改定義響應內容,好比返回json數據:

response.setCharacterEncoding("utf-8");

response.setContentType("application/json;charset=utf-8");

response.getWriter().write("json串");

----------------------------------------------------------

5,  ViewResolver:視圖解析器

ViewResolver負責將處理結果生成View視圖,ViewResolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果經過頁面展現給用戶。 springmvc框架提供了不少的View視圖類型,包括:jstlView、freemarkerView、pdfView等。

通常狀況下須要經過頁面標籤或頁面模版技術將模型數據經過頁面展現給用戶,須要由程序員根據業務需求開發具體的頁面。

springmvc.xml文件配置以下:

<!-- ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
   <property name="prefix" value="/WEB-INF/jsp/"/>
   <property name="suffix" value=".jsp"/>
</bean>

InternalResourceViewResolver:支持JSP視圖解析

viewClass:JstlView表示JSP模板頁面須要使用JSTL標籤庫,因此classpath中必須包含jstl的相關jar 包;

prefix 和suffix:查找視圖頁面的前綴和後綴,最終視圖的址爲:

前綴+邏輯視圖名+後綴,邏輯視圖名須要在controller中返回ModelAndView指定,好比邏輯視圖名爲hello,則最終返回的jsp視圖地址 「WEB-INF/jsp/hello.jsp」

相關文章
相關標籤/搜索