讲到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浅析的更多相关文章

  1. 浅析Spring MVC工作机制

    1.如何使用Spring MVC? 在web.xml中配置一个DispatcherServlet DispatchServlet初始化的时候会去寻找一个在应用程序的WEB-INF目录下的配置文件,命名 ...

  2. Spring mvc 原理浅析

    2.2. 数据的绑定 前面说过了,SpringMVC是方法级的映射,那么Spring是如何处理方法签名的,又是如何将表单数据绑定到方法参数中的?下面我们就来讨论这个问题.2.2.1. 处理方法签名 首 ...

  3. Spring MVC架构浅析

    阅读目录 Spring MVC概述 Spring MVC框架的特点 Spring MVC工作原理 Spring MVC概述 Spring的web框架围绕DispatcherServlet设计,Disp ...

  4. Spring MVC拦截器浅析

    Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...

  5. Spring MVC学习回顾

    Spring MVC是现在新项目中使用最多的MVC框架,超越了Structs2成为MVC框架的首选.今天抽时间看了4.2.x的官网翻译文档及相关代码,博客,将印象比较深的几点记录一下. 一.应用Spr ...

  6. Spring MVC 专题

    Spring静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取.在Springboot中默认的静态资源路径有:classpath:/META-INF/resources/,c ...

  7. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  8. Spring MVC重定向和转发以及异常处理

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...

  9. Spring MVC入门

    1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...

随机推荐

  1. 【洛谷p2239】螺旋矩阵

    关于题前废话: 这道题的数据范围过于强大了qwq,显然如果我们开一个30000*30000的二维数组来模拟,显然首先就开不下这么大的数组,然后暴力搜索的话也会爆掉,所以直接模拟显然是一个不正确的选择( ...

  2. 使用内核LED框架搭建驱动 ——led_classdev_register

    #include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...

  3. A*(A_star)搜索总结

    \(A^*(A star)\)搜索总结 标签:算法--搜索 阅读体验:https://zybuluo.com/Junlier/note/1299772 定义 先复制一则定义 \(A^*\)算法在人工智 ...

  4. jQuery 的attr()与css()的区别

    attr是attribute的缩写,意思是标签属性. css是,样式,意思是元素的style样式的 我的理解是: attr是操作元素的   属性 css是操作元素的  style属性 前者可以修改&l ...

  5. poj1011 Sticks (dfs剪枝)

    [题目描述] George took sticks of the same length and cut them randomly until all parts became at most 50 ...

  6. Sql批量插入时如果遇到相同的数据怎么处理

    测试数据 -- 创建测试表1 CREATE TABLE `testtable1` ( `Id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `UserId` I ...

  7. Echarts数据可视化grid直角坐标系(xAxis、yAxis)详解:

    mytextStyle={ color:"#333", //文字颜色 fontStyle:"normal", //italic斜体 oblique倾斜 font ...

  8. 全面优化MySQL(一)

    mysql执行一条查询语句的内部执行过程 权限验证 客户端通过连接器连接到 MYSQL服务器. 查询缓存 查询是否有查询缓存, 如果有缓存(之前执行过此语句),则直接返回缓存数据. 语法检查 分析器会 ...

  9. dotnet ef执行报错, VS 2019发布时配置项中的Entity Framework迁移项显示不出来

    VS 2019发布时配置项中的Entity Framework迁移项显示不出来 dotnet ef dbcontext list --json “无法执行,因为找不到指定的命令或文件.可能的原因包括: ...

  10. UNIX网络编程总结四

    socket: 为了执行网络I/O,一个进程做的第一件事就是调用socket函数. family指明协议族,type指明类型,除非在原始套接口,protocol一般为0,并非所有的family,typ ...