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();

原文地址:https://www.cnblogs.com/by-my-blog/p/11521627.html