SpringMVC:请求处理流程

这几张图讲的大致都是一个东西,就是springmvc的请求处理流程:

① 用户发送请求到springmvc框架提供的DispatcherServlet 这个前端控制器

② 前端控制器会去找处理器映射器(HandlerMapping),处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet 。

③ 根据处理器映射器返回的处理器,DispatcherServlet 会找“合适”的处理器适配器(HandlerAdapter)

④ 处理器适配器HandlerAdpater会去执行处理器(Handler开发的时候会被叫成Controller也叫后端控制器) 执行之前会有转换器、数据绑定、校验器等等完成上面这些才会去正在执行Handler

⑤ 后端控制器Handler执行完成之后返回一个ModelAndView对象

⑥ 处理器适配器HandlerAdpater会将这个ModelAndView返回前端控制器DispatcherServlet。前端控制器会将ModelAndView对象交给视图解析器ViewResolver。

⑦ 视图解析器ViewResolver解析ModelAndView对象之后返回逻辑视图。

⑧ 前端控制器DispatcherServlet对逻辑视图进行渲染(数据填充)之后返回真正的物理View并响应给浏览器。

DispatcherServlet:前端控制器,也叫主控制器,在web项目的web.xml文件中配置,继承结构:

HttpServletBean:重写了init方法,主要是做一些初始化的工作,将web.xml中的参数设置到servlet中,

1:将HTTPServletBean类型转换为WarpperBean类型,可以对init-parameter进行注入。2:注册自定义属性编辑器,遇到 Resource 类型的属性将会使用 ResourceEditor 进行解析。3:留给子类重写。4:设置 DispatcherServlet 属性。5:调用在 FrameworkServlet 中重写的该方法。

代码中ServletConfigPropertyValues是HTTPServletBean的静态内部类

在构造方法中通过传进来的ServletConfig对象,对web.xml文件中配置DispatcherServlet节点的信息进行解析

FrameworkServlet:是HttpServletBean的的子类,重写了init()方法。将 Servlet 上下文与 Spring 容器上下文关联。其实也就是初始化 FrameworkServlet 的属性webAppkicationContext,这个属性代表Springmvc上下文对象,实际类型是ConfigurableWebApplicationContext。如果使用了spring,那么就有个父容器,即web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。

创建或者刷新webApplicationContext对象,如果存在spring,则进行父子容器关联
获取spring框架根容器,如果找到赋给WebApplicationContext,并转换成ConfigurationWebApplicationContext对象,即springmvc容器,并和spring进行关联父子容器。
如果没有spring,则上面的WebApplicationContext对象为空,不进入判断,直接往下走,先去ServletContext中找,找不到则创建容器。
创建WebApplicationContext的方法
获得XMLWebApplicationContext
实例化context,创建springmvc的IOC容器,解析配置文件,初始化springmvc容器的环境
configureAndRefreshWebApplicationContext方法

查看最后的refresh方法:

obtainFreshBeanFactory方法:

loadBeanDefinitions:

loadBeanDefinitions方法:

loadBeanDefinitions方法:

String[]返回的即配置的classpath路径,可以有多个

loadBeanDefinitions:

doLoadBeanDefinitions

registerBeanDefinition

doRegisterBeanDefinition

parseBeanDefinition

解析配置文件---1

parseDefaultElement

processBeanDefinition

parseBeanDefinitionElement

springmvc中配置文件的bean标签以及属性等会被解析之后封装到AbstractBeanDefinition对象。

解析配置文件---2
解析命名空间

DispatcherServlet

initStrategies

初始化springmvc的一些组件

到此springmvc的IOC容器创建完成,各种组件也初始化完成。

HandlerMapping:根据当前请求找到对应的Handler(Controller后端控制器),并将Handler与一堆HandlerInterceptor封装到HandlerExecutionChain对象中。

在HandlerMapping接口中只有一个方法:getHandler(HttpServletRequest request);

在initStrategies方法中有initHandlerMappings(context)用来初始化HandlerMapping。

同样的,HandlerAdapter和ViewResolver也都是在initStrategies方法中初始化的。

HandlerMapping接口的实现类和继承结构

该类可以完成将springmvc的controller绑定到方法上,完成的是通过注解方式开发controller
该类中完成的是基于配置的controller开发,一个controller绑定一个类,该类需要实现Controller接口并重写方法

AbstractHandlerMapping:

返回值在AbstractHandlerMethodMapping和AbstractUrlHandlerMapping中不一样,前者返回的是method,后者返回的是controller
该方法交给子类去重写

AbstractHandlerMethodMapping:

AbstractHandlerMethodMapping 这个分支获取的 Handler 的类型是 HandlerMethod,即这个 Handler 是一个方法,它保存了方法的信息(如 Method),这样一个 Controller 就可以处理多个请求了。

上述代码中 lookupHandlerMethod() 方法主要工作是在 Map<T, HandlerMethod>

handlerMethods 中找到 HandlerMethod,这里的 T 是 HandlerMappingInfo,它封装了

@RequestMapping 注解中的信息。

AbstractUrlHandlerMapping:

lookupPath就是请求的路径

HandlerAdapter:springmvc中使用适配器模式来解决不同的Handler的执行,根据Handler来找到对应的HandlerAdapter,通过处理器适配器执行Handler得到ModelAndView对象。

HandlerAdapter接口中的两个主要方法:

boolean supports(Object handler); 判断是否支持传入的 HandlerModelAndView 。handle(HttpServletRequest request, HttpServletResponse response, Objecthandler) 用来使用 Handler 处理请求

继承结构:红线划掉的子类表示已经过时不再使用。

AbstractHandlerMethodAdapter:

利用 RequestMappingHandlerMapping 获取的 Handler 是 HadnlerMethod 类型,它代表 Controller 里要执行的方法。handlerInternal 是子类 RequestMappingHandlerAdapter 中的方法

RequestMappingHandlerAdapter:实际上就是执行@RequestMapping注解

在 handlerInternal 方法中通过调用 invokeHandleMethod 方法执行 HandlerMethod 并返回一个 ModelAndView。

HttpRequestHandlerAdapter:

HttpRequestHandlerAdapter 。 是 HttpRequestHandler 的 适 配 器 可 以 执 行HttpRequestHandler 类型的 Handler。其实就是 Controller 中的 handleRequest 方法

SimpleControllerHandlerAdapter:

SimpleControllerHandlerAdapter 是 Controller 实现类的适配器类,其本质也是执行Controller 中的 handleRequest 方法,是不用注解开发时使用的

SimpleServletHandlerAdapter:

SimpleServletHandlerAdapter 其实是一个 Servlet 的适配器,其最终执行的方法是 Servlet的 service 方法

ViewResolver:1.根据视图的名称找到对应的物理视图将其封装为view对象,2.View对视图 进行渲染和数据填充等展示给用户

ViewResolver接口的结构:

AbstractCachingViewResolver:

AbstractCachingViewResolver 是带有缓存的 ViewResolver,它每次解析时先从缓存里查找,如果找到视图就返回,没有就创建新的视图,且创建新视图的方法由其子类实现

ResourceBundleViewResolver:ResourceBundleViewResolver 根据 views.properties 文件来解析视图

XmlViewResolver:XmlViewResolver 根据 xml 文件来解析视图

UrlBasedViewResolver:UrlBasedViewResolver 提供了拼接 URL 的方式来解析视图,通过 prefix 属性拼接一个前缀,通过suffix属性拼接一个后缀,就得到了视图的URL。还可以加入redirect:(调用HttpServletResponse对象的sendRedirect()方法)和forward:(使用RequestDispatcher的forward方式进行跳转)前缀,另外,使用时还要指定viewClass属性,表示要解析成哪种View。

我们一般使用的InternalResourceViewResolver是该类的一个子类

InternalResourceViewResolver:InternalResourceViewResolver是UrlBasedViewResolver的子类,将InternalResourceViewResolver作为默认的View类,但是如果当前的classpath中有jstl的jar包,则使用JstlView作为view进行渲染。

View接口:视图渲染器,在该接口中定义了渲染视图的抽象方法。将 Model 中的数据放到 HttpServletRequest 中传递 jsp。

view接口中的抽象方法

结构:

表示jsp视图

springmvc项目在启动完成之后执行一次方法_学习笔记21-springmvc部分源码学习相关推荐

  1. springmvc项目在启动完成之后执行一次方法_SpringMVC运行原理

    springMVC主要有四大控件,其中有DispatcherServlet,hadlerMapping,HanlerAdapter,ModelAndView. springMVC的运行步骤大致是当客服 ...

  2. springmvc项目在启动完成之后执行一次方法_SpringMVC源码分析

    一 SpringMVC运行原理 二 SpingMVC源码分析 1 DispatcherServlet 1.1 DispatcherServlet继承结构 ServletConfig对象获取Init标签 ...

  3. spring启动后自动执行一次方法

    说明 spring启动后自动执行一次方法:因为需要保证所有调度相关的依赖注入spring容器才创建所以定时调度任务,所以需要实现在Spring容器将所有的Bean都初始化完成之后才自动执行一次执行方法 ...

  4. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  5. java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)

    原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...

  6. GitHub 上 1.3k Star 的 strman-java 项目有值得学习的地方吗?源码视觉来分析一波

    大家好,我是沉默王二. 很多初学编程的同学,经常给我吐槽,说:"二哥,你在敲代码的时候会不会有这样一种感觉,写着写着看不下去了,觉得自己写出来的代码就好像屎一样?" 这里我必须得说 ...

  7. php连接tidb,TiDB源码学习笔记:启动TiDB

    作者:院长,神州数码云基地开发工程师,目前专注于TiDB源码研究. TiDB源码研究系列第一篇,简述TiDB的核心架构,从tidb-server/mian.go开始,探索启动TiDB的方法. 最近因为 ...

  8. 【Android 源码学习】 init启动

    目录 Android 源码学习 init启动 从main.cpp开始 init.cpp 部分逻辑 init启动zygote 属性服务 总结 Android 源码学习 init启动 Android 11 ...

  9. 【Android 源码学习】系统架构和启动流程

    Android 源码学习 系统架构和启动流程 望舒课堂 学习记录整理.以及以下参考文章的整理汇总.便于我个人的学习记录. 感谢IngresGe,Gityuan的精彩文章.为我们这些初探android系 ...

最新文章

  1. 联想服务器 重装系统u盘启动,联想_Lenovo BIOS Setup Utility 设置U盘启动教程
  2. mysql Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nona
  3. python类库31[文件和目录os+os.path+shutil]
  4. 磁珠 符号_贴片磁珠功能_贴片磁珠应用
  5. python合并excel工作簿_Python合并多个Excel工作簿
  6. 解释器模式(行为模式)
  7. 用V C++检测和隔离内存泄漏
  8. CMake file文件操作命令
  9. HDU-6341 Problem J. Let Sudoku Rotate(dfs 剪枝)
  10. Android GreenDAO 3.0 不修改版本号的情况下增加、删除表、添加字段
  11. ros之TF坐标转换
  12. image 微信小程序flex_微信小程序进阶-flex布局
  13. 利用python批量处理Word文件——正文、标题
  14. 在Word中为三位数字设置带圈字符(转)
  15. Android开发之获取GPS位置案例源码详解
  16. 【人工生态系统优化算法】基于人工生态系统优化算法求解单目标优化问题附matlab代码
  17. OMEN惠普HP暗夜精灵5:win10下安装Ubuntu16.04双系统(win10+linux)
  18. vscode卡在Setting up SSH Host XX:Copying VS Code Server to host with scp
  19. 沟通的技巧--爱因斯坦如何向老太太解释相对论
  20. daocloud mysql_DaoCloud Services 开放 API

热门文章

  1. SOAP-ERROR: Parsing WSDL: failed to load external entity怎么办?
  2. HTML CSS基本语法
  3. html页面加载蒙版_javascript 窗口加载蒙板 内嵌网页内容
  4. 锈才学设计模式之 —— 策略模式(Strategy Pattern)
  5. Mysql发生Incorrect string value: ‘\xE5\x90\x8D\xE7\xA7\xB0‘异常
  6. 敬伟PS学习笔记(一)
  7. 第2次作业:软件案例分析之王者荣耀
  8. 【北亚数据恢复】异常断电导致linux服务器无法启动,数据库损坏的数据恢复
  9. 【sqoop】job作业
  10. java基础(六)线程