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