标签:
文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.06.29 | lutianfei | none |
DispatcherServlet前端控制器
DispatcherServlet前端控制器
收到请求调用HandlerMapping处理器映射器
查找Handler处理器
HandlerMapping处理器映射器
根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(即HandlerExecutionChain执行链
)并返回给DispatcherServlet前端控制器
。DispatcherServlet前端控制器
通过HandlerAdapter处理器适配器
调用Handler处理器
HandlerAdapter处理器适配器
去执行Handler处理器
(Controller,也叫后端控制器)。Handler处理器
执行完成给HandlerAdapter处理器适配器
返回ModelAndViewHandlerAdapter处理器适配器
将Handler处理器
执行结果ModelAndView返回给DispatcherServlet前端控制器
ModelAndView
是springmvc框架的一个底层对象,包括 Model和viewDispatcherServlet前端控制器
将ModelAndView传给ViewReslover视图解析器
ViewReslover视图解析器
向DispatcherServlet前端控制器
返回ViewDispatcherServlet前端控制器
对View进行渲染视图(即将模型数据填充至视图中)。 DispatcherServlet前端控制器
向用户响应结果 1、前端控制器DispatcherServlet
(不需要程序员开发)
2、处理器映射器HandlerMapping
(不需要程序员开发)
3、处理器Handler
(需要程序员开发)
4、处理器适配器HandlerAdapter
5、视图解析器View resolver
(不需要程序员开发)
逻辑视图名
解析成物理视图名
即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 6、视图View
(需要程序员开发jsp)
页面标签
或页面模版技术
将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。需求: springmvc和mybaits使用一个案例(商品订单管理)。
环境准备
<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.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 处理器映射器 -->
<!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
通过查看原代码:
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
适配器执行。public class ItemsController1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List<Items> itemsList = new ArrayList<Items>();
//向list中填充静态数据
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
itemsList.add(items_1);
itemsList.add(items_2);
//返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList", itemsList);
//指定视图
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
处理器映射器根据url找不到Handler,报下边的错误。说明url访问地址错误。
处理器映射器根据url找到了Handler,转发的jsp页面找到,报下边的错误,说明jsp页面地址错误了。
ItemsController1.java
文件中的modelAndView指定的视图地址即可。 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
问题:url配置是在bean中完成的
url和handler集中配置的映射器(简单映射器):org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
结论:多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。
<!-- 配置Handler -->
<bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1" />
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求: 编写的Handler实现 Controller接口。
另一种适配器:org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
<!-- 另一个非注解的适配器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/queryItems1.action"> itemsController1</prop>
<prop key="/queryItems2.action"> itemsController2</prop>
</props>
</property>
</bean>
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");*/
在 DispatcherSerlvet.properties 中
前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,使用默认加载的。
在spring**3.1之前使用的注解映射器:org.springframework.web.servlet.mvc.annotation.**DefaultAnnotationHandlerMapping。
在spring3.1之后使用的注解映射器 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping。
在spring**3.1之前使用的注解适配器 : org.springframework.web.servlet.mvc.annotation.**AnnotationMethodHandlerAdapter。
在spring3.1之后使用的注解适配器 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter。
mvc:annotation-driven
代替上边注解映射器和注解适配器配置 mvc:annotation-driven
默认加载很多的参数绑定方法,比如json转换解析器就默认加载了,如果使用mvc:annotation-driven
不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter//springmvc.xml
<!-- <mvc:annotation-driven></mvc:annotation-driven> -->
注解的映射器
和注解的适配器
必须配对使用.action
但是输入网址时必须加。//使用Controller注解 标识下面的类是一个控制器
@Controller
public class ItemsController3 {
//商品查询列表
//@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
//一般建议将url和方法写成一样
@RequestMapping("/queryItems")
public ModelAndView queryItems()throws Exception{
//调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List<Items> itemsList = new ArrayList<Items>();
//向list中填充静态数据
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
itemsList.add(items_1);
itemsList.add(items_2);
//返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList", itemsList);
//指定视图
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
<!--
Handler的单个配置
-->
<!-- <bean class="cn.itcast.ssm.controller.ItemsController3" /> -->
<!--
组件扫描:这里扫描的是controller包
-->
<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
<!-- 视图解析器
解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路径的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 配置jsp路径的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
ItemsController3.java
最后可修改如下://指定视图
//下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
//上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
modelAndView.setViewName("items/itemsList");
通过前端控制器源码分析springmvc的执行过程。
第一步:前端控制器接收请求
web.xml
的org.springframework.web.servlet.DispatcherServlet
转到DispatcherServlet
doDispatch
第二步:前端控制器调用处理器映射器查找 Handler
doDispatch
方法的第896行找到getHandler()函数并进入HandlerExcecutionChain
getHandler
函数,找到最终的HandlerExcecutionChain
定义 第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView
doDispatch
函数第925行左右 第四步:视图渲染,将model数据填充到request域。
DispatcherServlet.class
992行找到render
函数,并点入 通过入门程序理解springmvc前端控制器、处理器映射器、处理器适配器、视图解析器用法。
前端控制器配置:
*.action
,访问以.action结尾 由DispatcherServlet进行解析/
,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,使用此种方式可以实现 RESTful风格的url处理器映射器:
@Controller类
中标识有@RequestMapping
的方法进行映射。在@RequestMapping
里边定义映射的url。使用注解的映射器不用在xml中配置url和Handler的映射关系。处理器适配器:
mvc:annotation-driven
标签:
原文地址:http://blog.csdn.net/lutianfeiml/article/details/51793860