当前位置: 首页 > news >正文

Spring技术内幕笔记(2):Spring MVC 与 Web

Spring MVC 与 Web

IoC容器与Web容器的关系

ServletContext为IoC容器提供了宿主环境。IoC容器通过ContexLoaderListener初始化建立,ContexLoaderListener是注册在Web容器中的监听器,当Web容器初始化时,监听器会收到该事件从而发起Spring容器的初始化。DispatchServlet是Spring MVC处理请求的转发器,从而响应HTTP的请求。

ContexLoaderListener会调用ContextLoader,ContextLoader又会创建XmlWebApplicationContext,XmlWebApplicationContext作为默认的IoC容器,负责从默认的/WEB-INF/applicationContext.xml中加载BeanDefinition。

ContextLoader在创建IoC容器XmlWebApplicationContext后会将其注册入servletContext的属性ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE中。

DispatchServlet的功能

DispatchServlet负责两个工作,根据web.xml初始化自己的上下文,响应http请求。

在ContextLoader加载完成后,开始DispatchServlet的初始化。首先从ServletContext中获取WebApplicationContext作为双亲上下文,这里就是XmlWebApplicationContext,所以XmlWebApplicationContext定义的Bean可以被DispatchServlet获取,在DispatchServlet中查找Bean时,会首先从双亲上下文中查找。获取双亲上下文后,DispatchServlet会创建自己的上下文,并且将其注册进ServletContext的属性中,属性名为该servlet相关的,因为一个Web容器可以有多个servlet。

DispatchServlet上下文的初始化后会开始创建一些请求处理策略,如LocalResolver、HandlerMappings等。例如,初始化HandlerMappings就是从IoC容器中获取所有的HandlerMapping相关的Bean。

HandlerMapping是对HTTP请求到controller的映射,HandlerMapping根据请求获取一个HandlerExecutionChain,其中包含了一个handler和多个interceptor,interceptor负责功能的增强。

例如SimpleUrlHandlerMapping在初始化时会将url和对应handler的bean放入map中保存。当请求到达时,会从SimpleUrlHandlerMapping中查找最长匹配url的handler,包装成HandlerExecutionChain返回。

DispatchServlet处理请求的过程

当请求到来,从所有的HandleMapping中依次查找到匹配的HandlerExecutionChain,多个HandleMapping是按照优先级排序的。

HandlerExecutionChain获得后,先对请求执行intercepter的preHandler,然后执行handler,最后再次执行intercepter的postHandler,得到最终的ModelAndView对象。

最后根据ModelAndView渲染视图并返回。

ModelAndView呈现给客户端的过程

以JSP视图为例。

Step1:ModelAndView获得后,会从中获取其对应的View,也就是根据ModelAndView指明的名称获得对应View的Bean。

Step2:View接着将数据进行合并,然后将数据放入requst中进行暴露。

Step3:根据请求,获取URL路径,定位资源。如JSP文件。

Step4:将包含数据的requst转发到目标资源路径,由web容器负责获取资源,并且将数据装入JSP。最后将拼装好的文件返回。

相关文章:

  • saltstack安装
  • 徒手撸UI之DatePicker
  • 常用链接收藏
  • TPYBoard获取MicroPython提示
  • Esper复杂事务处理一小时入门
  • 第204天:js---重载和多态
  • 【资源共享】5G AP分析
  • webpack4.0入门以及使用
  • Node总结
  • Unity中的平移 缩放 旋转
  • android开发学习 ------- 【转】 android中的单例模式 (详解)
  • python学习笔记(数据类型)
  • P1073 最优贸易
  • 080.mycat和mycopy
  • [模板] LIS
  • 【RocksDB】TransactionDB源码分析
  • Centos6.8 使用rpm安装mysql5.7
  • emacs初体验
  • EOS是什么
  • ES学习笔记(12)--Symbol
  • Flex布局到底解决了什么问题
  • Git 使用集
  • Git初体验
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Linux下的乱码问题
  • Mysql5.6主从复制
  • node和express搭建代理服务器(源码)
  • rabbitmq延迟消息示例
  • SpiderData 2019年2月16日 DApp数据排行榜
  • TypeScript实现数据结构(一)栈,队列,链表
  • 分布式任务队列Celery
  • 浏览器缓存机制分析
  • 你真的知道 == 和 equals 的区别吗?
  • 排序算法学习笔记
  • 前端性能优化——回流与重绘
  • 我是如何设计 Upload 上传组件的
  • 中文输入法与React文本输入框的问题与解决方案
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • (175)FPGA门控时钟技术
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)Linux下编译安装log4cxx
  • (转)nsfocus-绿盟科技笔试题目
  • .htaccess配置重写url引擎
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 使用配置文件
  • .Net8 Blazor 尝鲜
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET开发者必备的11款免费工具
  • @Bean, @Component, @Configuration简析
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ 转载 ] SharePoint 资料
  • [383] 赎金信 js
  • [51nod1610]路径计数
  • [C#]手把手教你打造Socket的TCP通讯连接(一)