Spring MVC浅析
讲到MVC,想必大家都很熟悉,就是将数据模型、视图、控制器进行分离,做到分工明确,在Spring的帮助下,Spring MVC 更是做到了充分的解耦,因为大部分的资源都由Spring进行管理,为Spring MVC提供了方便,比如Controller层,会用到Spring的依赖注入功能,只用声明一个接口,Spring就会自动将需要的对象进行注入,这样有两个好处,一个是更加的方便,另一个是使得程序充分的解耦!你想想,由于只声明了一个接口,所以调用层不用理会下层的实现,上层的修改也不会导致调用层代码的修改,这不是非常棒的吗! 讲了那么多,进入我们今天的主题:Spring MVC
下面,由于网上关于源码分析的文章已经非常多了,我这里就不贴源码了,直接对Spring MVC做一个我的理解
1.Spring 和 Spring MVC 的关系
我的理解是,Spring 可以看成是为Spring MVC提供对象注入服务的
Spring 的容器一般会在web项目启动的时候,通过监听器进行初始化,并且作为ServletContext的属性,放在ServletContext中,然后在初始化DisptcherServlet之前,有一个FrameworkServlet,他是DispatcherServlet的父类,它会将Spring 的IOC容器设置为当前Spring MVC容器的父类,这样,在Spring MVC中,就可以使用Spring IOC中的对象了
2.Spring MVC执行流程梳理
(1) 首先请求到达服务器,被DispatherServlet拦截
(2)DispatcherServlet通过之前已经初始化好的HandlerMapping进行Handler以及Interceptor的查找,Handler就是我们编写的Controller
(3)找到后先执行拦截器Interceptor的方法preHandle方法
(4)利用HandlerAdapter执行Handler的方法,并且返回ModelAndView给DispatcherServlet
(5)执行拦截器Interceptor的postHandler方法
(6)定位到ModelAndView中的页面,将数据嵌入,再进行页面的渲染
(7)响应用户
3.若是想在Service或者其他地方用到request对象,应该怎么处理
这里主要有两种方法
其一:在service中需要request对象,可以通过Controller的帮助,在Controller中声明request为参数,Spring MVC就会自动为我们注入这个对象,然后我们再将这个对象传入其他方法比如Service中的方法,就可以实现了
还有一种方法就是:利用RequestContextHolder进行操作,RequestContextHolder里面封装了RequestAttributes,这个RequestAttributes中有get、set、removeAttribute,而且因为实际封装的是ServletRequestAttributes,所以可以用以下方式获得request或session
//获取request
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest(); //获取session
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpSession session = ((ServletRequestAttributes)requestAttributes).getRequest().getSession();
Spring MVC浅析的更多相关文章
- 浅析Spring MVC工作机制
1.如何使用Spring MVC? 在web.xml中配置一个DispatcherServlet DispatchServlet初始化的时候会去寻找一个在应用程序的WEB-INF目录下的配置文件,命名 ...
- Spring mvc 原理浅析
2.2. 数据的绑定 前面说过了,SpringMVC是方法级的映射,那么Spring是如何处理方法签名的,又是如何将表单数据绑定到方法参数中的?下面我们就来讨论这个问题.2.2.1. 处理方法签名 首 ...
- Spring MVC架构浅析
阅读目录 Spring MVC概述 Spring MVC框架的特点 Spring MVC工作原理 Spring MVC概述 Spring的web框架围绕DispatcherServlet设计,Disp ...
- Spring MVC拦截器浅析
Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...
- Spring MVC学习回顾
Spring MVC是现在新项目中使用最多的MVC框架,超越了Structs2成为MVC框架的首选.今天抽时间看了4.2.x的官网翻译文档及相关代码,博客,将印象比较深的几点记录一下. 一.应用Spr ...
- Spring MVC 专题
Spring静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取.在Springboot中默认的静态资源路径有:classpath:/META-INF/resources/,c ...
- 如何用Java类配置Spring MVC(不通过web.xml和XML方式)
DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...
- Spring MVC重定向和转发以及异常处理
SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...
- Spring MVC入门
1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...
随机推荐
- 【洛谷p2239】螺旋矩阵
关于题前废话: 这道题的数据范围过于强大了qwq,显然如果我们开一个30000*30000的二维数组来模拟,显然首先就开不下这么大的数组,然后暴力搜索的话也会爆掉,所以直接模拟显然是一个不正确的选择( ...
- 使用内核LED框架搭建驱动 ——led_classdev_register
#include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...
- A*(A_star)搜索总结
\(A^*(A star)\)搜索总结 标签:算法--搜索 阅读体验:https://zybuluo.com/Junlier/note/1299772 定义 先复制一则定义 \(A^*\)算法在人工智 ...
- jQuery 的attr()与css()的区别
attr是attribute的缩写,意思是标签属性. css是,样式,意思是元素的style样式的 我的理解是: attr是操作元素的 属性 css是操作元素的 style属性 前者可以修改&l ...
- poj1011 Sticks (dfs剪枝)
[题目描述] George took sticks of the same length and cut them randomly until all parts became at most 50 ...
- Sql批量插入时如果遇到相同的数据怎么处理
测试数据 -- 创建测试表1 CREATE TABLE `testtable1` ( `Id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `UserId` I ...
- Echarts数据可视化grid直角坐标系(xAxis、yAxis)详解:
mytextStyle={ color:"#333", //文字颜色 fontStyle:"normal", //italic斜体 oblique倾斜 font ...
- 全面优化MySQL(一)
mysql执行一条查询语句的内部执行过程 权限验证 客户端通过连接器连接到 MYSQL服务器. 查询缓存 查询是否有查询缓存, 如果有缓存(之前执行过此语句),则直接返回缓存数据. 语法检查 分析器会 ...
- dotnet ef执行报错, VS 2019发布时配置项中的Entity Framework迁移项显示不出来
VS 2019发布时配置项中的Entity Framework迁移项显示不出来 dotnet ef dbcontext list --json “无法执行,因为找不到指定的命令或文件.可能的原因包括: ...
- UNIX网络编程总结四
socket: 为了执行网络I/O,一个进程做的第一件事就是调用socket函数. family指明协议族,type指明类型,除非在原始套接口,protocol一般为0,并非所有的family,typ ...