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”

相关文章
相关标签/搜索