文章目录

    • @[toc]
  • 原理
    • DispatchServlet
    • Handler处理器
    • HanderMapping
      • BeanNameUrlHandlerMapping
      • RequestMappingHandlerMapping
        • HandlerExecutionChain
    • HandlerAdapter(处理器适配器)

原理

https://www.bilibili.com/video/BV1N4411g7nd?from=search&seid=5408622773223320127

DispatchServlet

sprigmvc的整个流程都是在org.springframework.web.servlet.DispatchServlet的doDispatch(request, response)方法中完成的;

doDispatch()方法的核心如下:

/*
通过getHandle方法,找到handler,并返回一个HandlerExecutionChain执行链(mappedHandler),
HandlerExecutionChain中有找到的handler的信息,以及拦截器信息;
*/mappedHandler = getHandler(processedRequest);... /*
通过getHandlerAdapter方法,找到合适的HandlerAdapter处理器适配器;
*/HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());.../*
在执行handler之前,先执行HandlerExecutionChain中拦截器
*/if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}/*
处理器适配器 执行handler,返回一个ModleAndView
*/mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

Handler处理器

Handler就是自定义的controller类;


HanderMapping

HandlerMapping的作用就找到对应的handler,并返回一个执行链;

 protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {for (HandlerMapping hm : this.handlerMappings) {if (logger.isTraceEnabled()) {logger.trace("Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");}HandlerExecutionChain handler = hm.getHandler(request);if (handler != null) {return handler;}}return null;}/*this.handlerMappings是一个List<HanderMapping>,Spring默认注册的handlerMappings有:RequestMappingHandlerMapping,BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping,RouterFunctionMapping;通过遍历handlerMappings找到handler,并返回一个HandlerExecutionChain(handler执行链);HandlerExecutionChain中包含了具体的handler信息,以及拦截器信息*/

具体的HandlerMapping如下,

BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping是将URL作为beanName找到对应的Handler(自定义Controller类)

/*
TestController实现org.springframework.web.servlet.mvc.Controller接口,
*/import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;public  class TestController implements Controller {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView ModelAndView=new ModelAndView();ModelAndView.setViewName("/WEB-INF/test.jsp");return ModelAndView;}
}
<!-- 自定义处理器 --><bean id="testController" name="/testController.do" class="com.zy.module.TestController"/><!-- 1、BeanNameUrlHandlerMapping 处理器映射器的 name 名字中必须以"/"开头,即 访问 "http://loaclhost:8080/testController.do" 时将URL的后缀“testController.do”作beanname找到处理器com.zy.module.TestController--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

此时,无需@GetMapping之类的注解,也可以通过访问http://loaclhost:8080/testController.do 找到test.jsp


RequestMappingHandlerMapping

使用注解的方式便是使用RequestMappingHandlerMapping;


HandlerExecutionChain

public class HandlerExecutionChain {private final Object handler;private HandlerInterceptor[] interceptors;private List<HandlerInterceptor> interceptorList;...
}

通过遍handlerMappings返回一个HandlerExecutionChain(handler执行链)

HandlerExecutionChain中包含了
1. handler(自定义的Controller类)的具体信息;使用org.springframework.web.method.HandlerMethod类封装
2. 拦截器的信息;

HandlerAdapter(处理器适配器)

https://www.jianshu.com/p/23ad68d8b421

HandlerAdapter负责执行Handler(自定义的controller类),并返回ModelAndView(试图);

但是在执行handler之前,HandlerAdapter会先执行拦截器;

/*
这里类似与HandlerMapping,遍历List<HandlerAdapter>,找到合适的Adapter
*/protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {for (HandlerAdapter ha : this.handlerAdapters) {if (logger.isTraceEnabled()) {logger.trace("Testing handler adapter [" + ha + "]");}if (ha.supports(handler)) {return ha;}}throw new ServletException("No adapter for handler [" + handler +"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");}

spring一般会默认注入RequestMappingHandlerAdapter 、HttpRequestHandlerAdapter 和 SimpleControllerHandlerAdapter 这三个配置器

经过测试,经过配置文件方式(这里是XML)注入的handler 会使用SimpleControllerHandlerAdapter,使用注解注入的handler会使用RequestMappingHandlerAdapter;


注意

默认注入哪些HandlerMapping 和 HandlerAdapter 在spring-webmvc-4.3.13.RELEASE.jar!/org/springframework/web/servlet/DispatcherServlet.properties中有定义;

使用哪种 HandlerMapping 和 HandlerAdapter 取决于使用哪种方式注入的handler;

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMappingorg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

springmvc原理、springmvc流程相关推荐

  1. springmvc原理+springmvc面试题

    一.MVC模式 MVC是 model.view.和controller的缩写,分别代表web应用程序中的三种职责: model-模型:用于存储数据以及能处理用户请求的业务逻辑 view-视图:向控制器 ...

  2. SpringMVC 原理和流程

    请求到来时,第一个接受这个请求的前端控制器叫DispatcherServlet(这个需要在web.xml中配置),后端控制器叫Controller. 简化版流程: 1.spring mvc将所有的请求 ...

  3. springmvc工作流程_springMVC工作原理及流程详细讲解

    简述 本文主要介绍springMVC工作原理. 工作原理 客户端发送HTTP请求,DispatcherServlet控制器拦截到请求,调用HandlerMapping 解析请求对应的Handler,H ...

  4. SSM三大框架+SpringMVC的工作原理及其流程

    SSM三大框架+SpringMVC的工作原理及其流程 一.SSM中各层作用及关系 1.持久层:DAO层(mapper层)(属于mybatis模块)     DAO层(Mapper层):主要负责与数据库 ...

  5. SpringMVC的启动流程与原理

    做过web项目的都知道页面连接后端程序中间是需要一个连接器来进行连接控制的.拿最常用的web容器tomcat来说,我们用tomcat搭建一个简单的web应用,就是配置好tomcat的web.xml文件 ...

  6. 【SpringMVC 笔记】SpringMVC 原理 + 入门项目(xml 配置版 vs 注解版)

    SpringMVC 入门项目 什么是 SpringMVC? 中心控制器 SpringMVC 执行原理 执行流程 xml 配置版 1.创建一个 Web 项目 2.pom.xml 中导入 SpringMV ...

  7. spring原理 struts2原理 hibernate原理 MyBatis原理 SpringMVC

    Spring原理 最核心的就是IOC,动态注入DI,利用java里的反射,让一个对象的创建不用new了,可以自动的生产.Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调 ...

  8. SpringMVC原理分析之一MVC框架

    本篇博文以MVC原理为基础,讲解了MVC的架构概念 需要解决的问题,以及使用SpringMVC搭建项目示例让读者了解MVC架构的优秀实现者SpringMVC框架,最后以DispatcherServle ...

  9. Struts2和SpringMVC的执行流程。

    先介绍一下SpringMVC的执行流程: 1:客户端发起请求到DispatcherServlet(前端控制器) 2:前端控制器请求HandlerMapping(处理器映射器)查找 Handler 根据 ...

  10. SpringMVC 的执行流程

    SpringMVC 的执行流程 1)用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet捕获: 2)DispatcherServlet 对请求 UR ...

最新文章

  1. Cloudera Manager 5.3 和 CDH5.3.0 本地(离线)
  2. 蜗蜗 Linux内核芬妮下,Linux内核的整体架构
  3. java get请求传参_Java-ThreadLocal三种使用场景
  4. CDH6.3.2之YARN生产环境调优(yarn 生产必做优化项)
  5. linux磁盘管理与分区 转载
  6. 状态压缩:枚举子集(最优组队)(ybtoj)(动态规划)
  7. 小程序开发(13)-location定位
  8. 冰原服务器维护,12月2日服务器公告:冰原旅途进发
  9. Linux装gcc经过
  10. wifi的web 认证。
  11. PRML中文版(马春鹏)勘误表
  12. 我是如何用CSS绘制各种形状的
  13. android利用AudioRecord实现录音功能(kotlin语言)
  14. 林轩田《机器学习基石》(十一)—— Linear models for classification
  15. java中list中放入map_list中放map的几种方式
  16. HAU寒假训练第一周
  17. python画箭头_Python中绘制箭头
  18. checkpoints are occurring too frequently
  19. 《JSP实用教程(第4版)》第2章学习笔记
  20. 高通平台开发系列讲解(网络篇)SFE软加速简介

热门文章

  1. android实现标题栏弹框,Android:Dialog对话框、Builder、showDialog、模板方法设计模式...
  2. java中重载构造方法的例程_Java构造函数使用多种方法重载
  3. C++ 上用 ONNXruntime 部署自己的模型
  4. jsp注册里密码强弱怎么弄_JavaScript注册时密码强度校验代码
  5. 《态度》- 吴军 四十封启明家书 读后感
  6. 算法:Search in Rotated Sorted Array(搜索部分顺序被翻转的数组)
  7. java生成gif_Java生成动态GIF图片
  8. 递归计算二叉树的叶子节点个数
  9. eclipse中导入jar包源文件
  10. 【POJ 2449】第K短路【A*算法】