Spring MVC 入门笔记

主要名词解释
DispatcherServlet 前端控制器 相当于一个转发器
入口:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception

HandlerMapping 处理器映射器
核心方法HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
对HandlerExecutionChain稍微解释下,并不是我一开始理解的由很多个Handler组成的链,而是一个Hanler和多个拦截器interceptor
源码为证:
public class HandlerExecutionChain {
private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class);
private final Object handler;
private HandlerInterceptor[] interceptors;
private List<HandlerInterceptor> interceptorList;
private int interceptorIndex = -1;
HandlerAdapter 处理器适配器
核心方法:
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
ViewResolver 视图解析器
核心方法
View resolveViewName(String viewName, Locale locale) throws Exception;
ModelAndView 模型和视图的结合体 是一个底层对象
部分源码方便理解
public class ModelAndView {
/** View instance or view name String */
private Object view;
/** Model Map */
private ModelMap model;
View 视图
核心方法:渲染
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
Handler处理器也就是Controller
源码如下:
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
非注解的处理器映射器(多个处理器映射器可共存)
1、BeanNameUrlHandlerMapping
Bean的Name作为URL 的处理器映射器
示范:
<bean name="/queryItems.action" class="com.study.controller.ItemsController" />
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
- SimpleUrlHandlerMapping
 
简单URL处理器映射器
示范:
<bean id="id1" class="com.study.controller.ItemsController1" />
<bean id="id2" class="com.study.controller.ItemsController2" />
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mapping">
<props>
<!-- 在这里面进行配置 -->
<prop key="/url1">id1</prop>
<prop key="/url2">id2</prop>
<!-- 一个id可以对应多个key -->
<prop key="/url3">id1</prop>
</props>
</property>
</bean>
非注解的处理器适配器
- SimpleControllerHandlerAdapter
 
简单Controller处理器适配器
直接实现Controller接口
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
示范创建一个ItemsController处理器:
public class ItemsController implements Controller {
/*
* 自己的Controller实现Controller接口中handleRequest方法
*/
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
// 此处采用代码方式建对象提供测试,实际中通过和MyBatis等框架整合查询数据库得到数据并由ORM(对象关系映射)转换成对象进行操作
// 像商品列表中添加三条数据
List<Item> itemlist = new ArrayList<Item>();
itemlist.add(new Item("苹果", 5.2));
itemlist.add(new Item("香蕉", 1.5));
itemlist.add(new Item("梨子", 3.4));
// ModelAndView 是模型和视图的结合体
// model中添加的Object会被添加到request请求域,使用addObject(String,Object)相当于request.setAttribute(String,Object)
ModelAndView mav = new ModelAndView();
// 将商品列表对象放入ModelAndView
mav.addObject("itemlist", itemlist);
// 设置逻辑视图名
mav.setViewName("ListItems.jsp");
return mav;
}
}
- HttpRequestHandlerAdapter
 
实现HttpRequestHandler接口
示范创建一个处理器ItemsController2
使用此方法可以针对于返回JSON数据的情况可以操response
res.setCharacterEncoding("utf-8");
res.setContentType("application/json;charset=utf-8");
res.getWriter().write("你的JSON字符串");
public class ItemsController2 implements HttpRequestHandler {
/*
* 自己的Controller实现Controller接口中handleRequest方法
*/
@Override
public void handleRequest(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
// 此处采用代码方式建对象提供测试,实际中通过和MyBatis等框架整合查询数据库得到数据并由ORM(对象关系映射)转换成对象进行操作
// 像商品列表中添加三条数据
List<Item> itemlist = new ArrayList<Item>();
itemlist.add(new Item("苹果", 5.2));
itemlist.add(new Item("香蕉", 1.5));
itemlist.add(new Item("梨子", 3.4));
//Model填充
req.setAttribute("itemlist", itemlist);
//ViewResolver
req.getRequestDispatcher("ListItems.jsp").forward(req, res);
//可以针对只需要返回JSON字符串的情况
// res.setCharacterEncoding("utf-8");
// res.setContentType("application/json;charset=utf-8");
// res.getWriter().write("你的JSON字符串");
}
}
基于注解的处理器映射器
版本区别
注意点:Spring MVC 3.1版本之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
3.1版本之后使用
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
基于注解的处理器适配器
版本区别
注意点:Spring MVC 3.1版本之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
3.1版本之后使用
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
<!--
注解方式配置第二种做法 使用mvc:annotation-driven
两种方式任选其一
区别点在于
mvc:annotation-driven方式默认加载了很多参数绑定方法,比如JSON解析器就默认加载了
实际开发中使用mvc:annotation-driven这种方式
-->
<!-- <mvc:annotation-driven></mvc:annotation-driven> -->
注解的处理器映射器需要搭配注解的处理器适配器同时使用
注解方式和非注解方式同时使用并抢占同一个URL的时候按照xml中配置的先后顺序,先配置的处理器映射器被使用
注解语法
1、@Controller
使用@Controller注解标志该类为一个Controller
2、@RequestMapping(“url”)
使用@RequestMapping(“/myurl.action”)注解标志下面的方法映射到“/myurl.action”
示范如下
@Controller
public class ItemsController3 {
/*
* 注解开发Handler
*/
@RequestMapping("/queryItems.action")
public ModelAndView queryItems() throws Exception{
// 此处采用代码方式建对象提供测试,实际中通过和MyBatis等框架整合查询数据库得到数据并由ORM(对象关系映射)转换成对象进行操作
// 像商品列表中添加三条数据
List<Item> itemlist = new ArrayList<Item>();
itemlist.add(new Item("苹果", 5.2));
itemlist.add(new Item("香蕉", 1.5));
itemlist.add(new Item("梨子", 3.4));
// ModelAndView 是模型和视图的结合体
// model中添加的Object会被添加到request请求域,使用addObject(String,Object)相当于request.setAttribute(String,Object)
ModelAndView mav = new ModelAndView();
// 将商品列表对象放入ModelAndView
mav.addObject("itemlist", itemlist);
// 设置逻辑视图名
mav.setViewName("ListItems.jsp");
return mav;
}
}
开发完Handler需要将Handler配置到springmvcconfig.xml
单个配置方式如下
<bean class="com.study.controller.ItemsController3" />
扫描包内组件的方式如下
<context:component-scan base-package="com.study.controller"></context:component-scan>
深入源码分析Spring MVC框架
只复制了关键步骤代码其他代码省略
- 请求到达Spring MVC框架
入口如下
类名:DispatcherServlet 
方法名:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception
- 上述方法中执行
HandlerExecutionChain mappedHandler = null;
...
mappedHandler = getHandler(processedRequest);
根据Request拿到HandlerExecutionChain - HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
通过HandlerExecutionChain中的getHandler()方法拿到Handler - ModelAndView mv = null;
 
.....
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
- 通过HandlerAdapter中的handle方法执行处理器中的处理并返回ModelAndView
 
- processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
 
调用该方法来执行转发结果、也就是进行最后一步视图渲染
在processDispatchResult方法中调用render(mv, request, response);方法
在render方法中调用了view.render(mv.getModelInternal(), request, response);
View对象中的render方法并没有处理,只是个接口
然后AbstractView这个抽象类实现了View接口
如下图

然后AbstractUrlBasedView 继承了AbstractView
public abstract class AbstractUrlBasedView extends AbstractView implements InitializingBean {
然后内置解析器 InternalResourceView继承了 AbstractUrlBasedView
public class InternalResourceView extends AbstractUrlBasedView {
我们的JSP页面最终调用的是InternalResourceView内置的视图解析器
项目包已压缩为ZIP文件,大小8M地址http://xingxunxinxi.com/source/SpringMVC_Study.zip
Spring MVC 入门笔记的更多相关文章
- SSM(spring mvc+spring+mybatis)学习路径——2-1、spring MVC入门
		
目录 2-1 Spring MVC起步 一.回顾Servlet 二.SpringMVC简介 三.搭建SpringMVC第一个案例 四.简单流程及配置 五.使用注解开发Controller 六.参数绑定 ...
 - Spring MVC  入门教程示例 (一)
		
今天和大家分享下 Spring MVC 入门教程 首先还是从 HelloWorld web 工程开始 -------------------------- 1.首先创建一个Maven Web工程 ...
 - Spring MVC 学习笔记一 HelloWorld
		
Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...
 - 第63节:Java中的Spring MVC简介笔记
		
前言 感谢! 承蒙关照~ Java中的Spring MVC简介笔记 MVC简介 Spring MVC 基本概念 Spring MVC 项目搭建 maven 使用Spring MVC进行开发 实现数据绑 ...
 - Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建
		
Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...
 - Spring MVC 学习笔记11 —— 后端返回json格式数据
		
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
 - Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
		
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
 - Spring MVC 学习笔记9 —— 实现简单的用户管理(4)用户登录显示局部异常信息
		
Spring MVC 学习笔记9 -- 实现简单的用户管理(4.2)用户登录--显示局部异常信息 第二部分:显示局部异常信息,而不是500错误页 1. 写一个方法,把UserException传进来. ...
 - Spring MVC 学习笔记8 —— 实现简单的用户管理(4)用户登录
		
Spring MVC 学习笔记8 -- 实现简单的用户管理(4)用户登录 增删改查,login 1. login.jsp,写在外面,及跟WEB-INF同一级目录,如:ls Webcontent; &g ...
 
随机推荐
- html5中高德、腾讯、百度 地图api调起手机app
			
html 部分 <div id="mapBg"> <div class="mapTab"> <a href="" ...
 - 通过代码动态创建IIS站点
			
对WebApi进行单元测试时,一般需要一个IIS站点,一般的做法,是通过写一个批处理的bat脚本来实现,其实通过编码,也能实现该功能. 主要有关注三点:应用程序池.Web站点.绑定(协议类型:http ...
 - PopupWindow 的常用api封装
			
对PopupWindow常用API的简单封装,几行代码就搞定PopupWindow弹窗,使用Builder模式,链式调用,像使用AlertDialog 一样 封装通用PopupWindow,Custo ...
 - 【Android】RxJava的使用(二)Action
			
回顾 在上一节Android RxJava的使用(一)基本用法中,介绍了RxJava的基本用法.下面来回顾下实现一次RxJava的基本使用.例:分别打印"Hellow"." ...
 - 安装nvm之后node不可用,“node”不是内部或外部命令,也不是可运行的程序或批处理文件(ng)
			
安装nvm: 1.下载nvm压缩包地址:https://github.com/coreybutler/nvm-windows/releases 2.下载后解压在目标文件夹中,我这里是H:\applic ...
 - 使用 PowerShell 创建和修改 ExpressRoute 线路
			
开始之前 安装最新版本的 Azure Resource Manager PowerShell cmdlet. 有关详细信息,请参阅 Azure PowerShell 概述. 在开始配置之前,请查看先决 ...
 - SQL Server配置数据库邮件
			
需求描述 在生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,可以以发邮件告知,邮件作为一种非常便利的预警实现方式,在及时性和易用性方面也有着不可替 ...
 - voltdb数据库持久性,扩展集群
			
之前在git上下载的voltdb,以及在官网下载的社区版voltdb均不支持持久性事务,和扩展集群,今天下载了企业试用版voltdb,安装过程不再赘述,记录一下我的使用过程 持久性测试 以前的 vol ...
 - Stored Properties 与 Computed Properties
			
Stored Properties 与 Computed Properties About Swift Stored Properties In its simplest form, a stored ...
 - QT的时区转换以及使用注意事项
			
QDateTime localDate = QDateTime::fromString("2018-12-11 10:40:00", "yyyy-MM-dd hh:mm: ...