主要名词解释

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"/>

  1. 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>

非注解的处理器适配器

  1. 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;

}

}

  1. 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框架

只复制了关键步骤代码其他代码省略

  1. 请求到达Spring MVC框架
    入口如下
    类名:DispatcherServlet

方法名:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception

  1. 上述方法中执行
    HandlerExecutionChain mappedHandler = null;
    ...
    mappedHandler = getHandler(processedRequest);
    根据Request拿到HandlerExecutionChain
  2. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
    通过HandlerExecutionChain中的getHandler()方法拿到Handler
  3. ModelAndView mv = null;

.....
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

  1. 通过HandlerAdapter中的handle方法执行处理器中的处理并返回ModelAndView
  1. 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 入门笔记的更多相关文章

  1. SSM(spring mvc+spring+mybatis)学习路径——2-1、spring MVC入门

    目录 2-1 Spring MVC起步 一.回顾Servlet 二.SpringMVC简介 三.搭建SpringMVC第一个案例 四.简单流程及配置 五.使用注解开发Controller 六.参数绑定 ...

  2. Spring MVC 入门教程示例 (一)

    今天和大家分享下  Spring MVC  入门教程 首先还是从 HelloWorld  web 工程开始 -------------------------- 1.首先创建一个Maven Web工程 ...

  3. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  4. 第63节:Java中的Spring MVC简介笔记

    前言 感谢! 承蒙关照~ Java中的Spring MVC简介笔记 MVC简介 Spring MVC 基本概念 Spring MVC 项目搭建 maven 使用Spring MVC进行开发 实现数据绑 ...

  5. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  6. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  7. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  8. Spring MVC 学习笔记9 —— 实现简单的用户管理(4)用户登录显示局部异常信息

    Spring MVC 学习笔记9 -- 实现简单的用户管理(4.2)用户登录--显示局部异常信息 第二部分:显示局部异常信息,而不是500错误页 1. 写一个方法,把UserException传进来. ...

  9. Spring MVC 学习笔记8 —— 实现简单的用户管理(4)用户登录

    Spring MVC 学习笔记8 -- 实现简单的用户管理(4)用户登录 增删改查,login 1. login.jsp,写在外面,及跟WEB-INF同一级目录,如:ls Webcontent; &g ...

随机推荐

  1. Ubuntu下卸载QT5.7.1再重装

    /**** 卸载QT5.7.1 *****/ .首先找到QT安装文件的位置,例如我的在/home/ttwang/software/qt5.7.1 .终端输入命令进入该目录,输入命令: ./Mainte ...

  2. 激活函数(relu,prelu,elu,+BN)对比on cifar10

    激活函数(relu,prelu,elu,+BN)对比on cifar10   可参考上一篇: 激活函数 ReLU.LReLU.PReLU.CReLU.ELU.SELU  的定义和区别   一.理论基础 ...

  3. 自定义RatingBar评分控件

    1.介绍 实现类似美团外卖评分供能,系统提供了RatingBar,今天来自定义一波,当做自定义view的一个学习,效果如下,能够滑动或者点击变化星星数量 2.自定义属性 在values目录下的attr ...

  4. gitlab 启用HTTPS

    NGINX设置 启用HTTPS 警告 Nginx配置会告诉浏览器和客户端,只需在未来24个月通过安全连接与您的GitLab实例进行通信.通过启用HTTPS,您需要至少在24个月内为您的实例提供安全连接 ...

  5. 三、vue如何配置路由 、获取路由的参数、部分刷新页面、缓存页面

        1.路由配置:所有的启动文件都在最初始的main.js文件里面,这个文件中首先需要引入: 2.路由文件配置说明: 3.如何获取页面url的参数? this.$route.query 4.页面之 ...

  6. python-threading.Event实现事件功能--汽车过红绿灯(转载)

    python-threading.Event实现事件功能 enent可以通过设置.等待.清除一个标识(flag),来进行线程间的控制线程可以通过获取这个标志位(flag)的状态(设置或未设置)来控制线 ...

  7. JVM知识(五):垃圾回收算法

    在介绍垃圾回收算法之前,我们需要先了解一个词“stop the world”,stop the world会在执行某一个垃圾回收算法的时候产生,JVM为了执行垃圾回收,会暂时java应用程序的执行,等 ...

  8. 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为

    在日常使用Entity Framework中,数据更新通常会用到.下面就简单封装了一个DBContext类 public partial class EFContext<T> : DbCo ...

  9. [翻译] SSKeychain

    SSKeychain https://github.com/soffes/sskeychain SSKeychain is a simple wrapper for accessing account ...

  10. word 排版用到双直线、波浪线、虚线 、直线、隔行线等技巧

    在办公或毕业设计时,有时排版需要插入双直线.波浪线.虚线 .直线.隔行线等而烦恼, 今天小白与大家分享技巧如下: 感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮.本文欢迎各位转载,但 ...