springMVC 设计总览

下图来源:https://www.cnblogs.com/fangjian0423/p/springMVC-directory-summary.html



下图来源:https://www.cnblogs.com/sunniest/p/4555801.html

核心类DispatcherServlet

接收请求DispatcherServlet也是一个Servlet

  1. protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
  2. ...
  3. try {
  4. this.doDispatch(request, response);
  5. } finally {
  6. if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted() && attributesSnapshot != null) {
  7. this.restoreAttributesAfterInclude(request, attributesSnapshot);
  8. }
  9. }
  10. }
  1. protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
  2. ...
  3. mappedHandler = this.getHandler(processedRequest);
  4. HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
  5. ...
  6. mappedHandler.applyPreHandle(processedRequest, response)
  7. mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
  8. ...
  9. this.applyDefaultViewName(request, mv);
  10. mappedHandler.applyPostHandle(processedRequest, response, mv);
  11. this.processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
  12. }

HandlerAdapter是一个适配器,根据handler适配ModelAndView

getHandler(processedRequest)是为了获取HandlerExecutionChain:protected HandlerExecutionChain getHandler(HttpServletRequest request)

HandlerExecutionChain 有什么:

  1. private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class);
  2. private final Object handler;
  3. private HandlerInterceptor[] interceptors;
  4. private List<HandlerInterceptor> interceptorList;
  5. private int interceptorIndex;
  6. boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
  7. if (this.getInterceptors() != null) {
  8. for(int i = 0; i < this.getInterceptors().length; this.interceptorIndex = i++) {
  9. HandlerInterceptor interceptor = this.getInterceptors()[i];
  10. if (!interceptor.preHandle(request, response, this.handler)) {
  11. this.triggerAfterCompletion(request, response, (Exception)null);
  12. return false;
  13. }
  14. }
  15. }
  16. return true;
  17. }
  18. void applyPostHandle(HttpServletRequest request, HttpServletResponse response, ModelAndView mv) throws Exception {
  19. if (this.getInterceptors() != null) {
  20. for(int i = this.getInterceptors().length - 1; i >= 0; --i) {
  21. HandlerInterceptor interceptor = this.getInterceptors()[i];
  22. interceptor.postHandle(request, response, this.handler, mv);
  23. }
  24. }
  25. }

HandlerInterceptor:拦截器(在handler处理前后执行applyPreHandle,applyPostHandle方法)

handler:处理器

springMVC源码笔记的更多相关文章

  1. springmvc源码笔记-RequestMappingHandlerMapping

    下图是springmvc的执行流程 图片来源:https://www.jianshu.com/p/8a20c547e245 DispatcherServlet根据url定位到Controller和方法 ...

  2. springmvc源码笔记-HandlerMapping注入

    在springmvc中,如何根据url找到controller以及对应方法,依赖的是HandlerMapping接口的getHandler方法 在spring容器中默认注册的HandlerMappin ...

  3. springmvc源码笔记-HandlerMethodReturnValueHandler

    返回值解析器 用于对controller的返回值进行二次处理 结构 // 返回值解析器 public interface HandlerMethodReturnValueHandler { // 判断 ...

  4. [心得体会]SpringMVC源码分析

    1. SpringMVC (1) springmvc 是什么? 前端控制器, 主要控制前端请求分配请求任务到service层获取数据后反馈到springmvc的view层进行包装返回给tomcat, ...

  5. SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现

    SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...

  6. SpringMVC源码分析系列

    说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...

  7. SpringMVC源码剖析(二)- DispatcherServlet的前世今生

    上一篇文章<SpringMVC源码剖析(一)- 从抽象和接口说起>中,我介绍了一次典型的SpringMVC请求处理过程中,相继粉墨登场的各种核心类和接口.我刻意忽略了源码中的处理细节,只列 ...

  8. springMvc源码学习之:spirngMvc的参数注入的问题

    转载:https://my.oschina.net/lichhao/blog/172562 概述 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成 ...

  9. SpringMVC 源码深度解析&lt;context:component-scan&gt;(扫描和注冊的注解Bean)

    我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比較经经常使用XML配置.控制层依赖的service比較经经常使用注解等(在部署时比較不会改变的) ...

随机推荐

  1. 013_实践HTTP206状态:部分内容和范围请求

    HTTP 2xx范围内的状态码表明了:"客户端发送的请求已经被服务器接受并且被成功处理了".HTTP/1.1 200 OK是HTTP请求成功后的标准响应,当你在浏览器中打开www. ...

  2. pydensecrf的使用

    参考:https://github.com/lucasb-eyer/pydensecrf 1.使用 对于图像来说,最简单的使用该库的方法是使用DenseCRF2D类: import numpy as ...

  3. 三种方法实现Hadoop(MapReduce)全局排序(1)

    我们可能会有些需求要求MapReduce的输出全局有序,这里说的有序是指Key全局有序.但是我们知道,MapReduce默认只是保证同一个分区内的Key是有序的,但是不保证全局有序.基于此,本文提供三 ...

  4. Binary Search(Java)(非递归)

    public static int rank(int[] array, int k) { int front = 0, rear = array.length - 1; while(front < ...

  5. powershell 函数, foreach中格式化

    function testArg { $n = 1; if($args.Count -eq 0) { "No arg!" } else { $args | foreach {&qu ...

  6. Flutter之Color

    color:颜色Colors.green ,系统默认了几种颜色,分别如下: red, pink, purple, deepPurple, indigo, blue, lightBlue, cyan, ...

  7. 23个Python爬虫开源项目代码,让你一次学个够

    今天为大家整理了23个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快 1.WechatSogou [1]– 微信公众号 ...

  8. Djangon的坑

    <a href="/del_student/?pk={{ students.pk }}"></a> 在django中当你写入这样的语句是,pk={{ stu ...

  9. [SimplePlayer] 5. 向音频设备输出音频

    两种SDL音频输出方式 我们这里采用SDL来进行音频输出.SDL提供两种音频输出的方式: 如果在SDL_OpenAudio时不指定callback,那么可以调用SDL_QueueAudio主动地向音频 ...

  10. Linux-服务器创建swap交换分区

    服务器 swap 交换分区制作 作用:‘提升‘ 内存的容量,防止OOM(Out Of Memory) 查看当前的交换分区 # cat /proc/swaps # free -m # swapon -s ...