spring mvc
早期web开发
在早期 Java Web 的开发中,统一把显示层、控制层、数据层的操作全部交给 JSP 或者 JavaBean 来进行处理,我们称之为 Model1:
Spring mvc组件与运作流程
Spring MVC作为Spring framework web层的三层框架,通过实现Model-View-Controller模式来将数据、业务与展现进行分离。Spring MVC就是属于SpringFrameWork的后续产品。正因为Spring框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring框架进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts2等进行web开发。 它的六大核心组件包括:
-
DispatcherServlet:中央控制器,把请求给转发到具体的控制类
-
Controller:具体处理请求的控制器
-
HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
-
ModelAndView:服务层返回的数据和视图层的封装类
-
ViewResolver:视图解析器,解析具体的视图
-
Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作
主要工作流程如下:
-
用户向服务器发送request请求,请求被SpringMVC中央控制器DispatcherServlet捕获;
-
DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping映射处理器,将请求发送给指定的Controller。
-
Controller执行完成后,将返回的数据信息封装到ModelAndView对象中,最后通过ViewResolver视图解析器选择一个合适的View 渲染视图返回界面。
一言概之,request请求到中央控制器——>传到映射处理器——>转发到指定controller——>获取数据和view ,组成成ModelAndView组件——>通过ViewResolver返回到特定的前台页面。
DispatcherServlet核心分发器介绍
基本接口与功能
其中各个Servlet作用为:
- HttpServletBean:主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。
- FrameworkServlet:将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。
- DispatcherServlet :初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等
DispatcherServlet 继承自 HttpServlet,它遵循 Servlet 里的“init-service-destroy”三个阶段,其中init()阶段主要作用是加载 web.xml 中 DispatcherServlet 的 配置,并调用子类的初始化。初始化后通过initHandlerMappings() 方法从 SpringMVC 的容器及 Spring 的容器中查找所有的 HandlerMapping 实例,并把它们放入到 handlerMappings 这个 list 中。DispatcherServlet 的 doService() 方法主要是设置一些 request 属性,并调用 doDispatch() 方法进行请求分发处理,doDispatch() 方法的主要过程是通过 HandlerMapping 获取 Handler,再找到用于执行它的 HandlerAdapter,执行 Handler 后得到 ModelAndView ,ModelAndView 是连接“业务逻辑层”与“视图展示层”的桥梁,接下来就要通过 ModelAndView 获得 View,再通过它的 Model 对 View 进行渲染。
###初始化流程
DispatcherServlet通过init()函数进行初始化,具体的代码段和解析为:
PropertyValues pvs=new ServletConfigPropertyValues(getServletConfig(),this.requiredProperties);//ServletConfigPropertyValues为HttpServletBean内部静态类,构造过程中会使用而getServletConfig能够找出配置文件中的配置参数并注入到ServletConfigPropertyValues中去
BeanWrapper bw=PropertyAccessorFactory.forBeanPropertyAccess(this);//通过BeanWrapper构造DispacherServlet
bw.setPropertyValues(pvs,true);//设置DispacherServlet属性
这里使用BeanWrapper,有2个理由:
- contextConfigLocation属性在FrameworkServlet中定义,HttpServletBean中未定义
- 利用Spring的注入特性,只需要调用setPropertyValues方法就可将contextConfigLocation属性设置到对应实例中,也就是以依赖注入的方式初始化属性。
具体的onfresh函数为(继承重写自它的父类函数):
请求处理过程
HttpServlet继承自Servlet,提供了service方法用于处理请求,service使用了模板设计模式,在内部对于http get方法会调用doGet方法,http post方法调用doPost方法。可以看一看具体的doService方法如下:
doDispatch方法功能简单描述一下:
首先根据请求的路径找到HandlerMethod(带有Method反射属性,也就是对应Controller中的方法),然后匹配路径对应的拦截器,有了HandlerMethod和拦截器构造个HandlerExecutionChain对象。HandlerExecutionChain对象的获取是通过HandlerMapping接口提供的方法中得到。有了HandlerExecutionChain之后,通过HandlerAdapter对象进行处理得到ModelAndView对象,HandlerMethod内部handle的时候,使用各种HandlerMethodArgumentResolver实现类处理HandlerMethod的参数,使用各种HandlerMethodReturnValueHandler实现类处理返回值。 最终返回值被处理成ModelAndView对象,这期间发生的异常会被HandlerExceptionResolver接口实现类进行处理.
总结
理返回值。 最终返回值被处理成ModelAndView对象,这期间发生的异常会被HandlerExceptionResolver接口实现类进行处理.
总结
本文总结了Spring mvc框架的基本组件,阐述了核心分发器DispacherServlet的初始化与运作流程。通过以上内容,加深了对web开发以及Spring Mvc框架的理解。