spring mvc 设计概览
springmvc处理http请求,主要是在web.xml中配置一个dispatcherservlet,然后由此进行拦截并处理请求返回相应,下面就针对源码大体记录下dispatcherservlet的初始化和请求的处理流程。
具体的核心开发步骤:
1、 DispatcherServlet在web.xml 中的部署描述,从而拦截请求到Spring Web MVC
2、 HandlerMapping的配置,从而将请求映射到处理器,这里可以通过实现HandlerMapping接口来自己做映射关系,一般上也不用。
3、 HandlerAdapter 的配置,从而支持多种类型的处理器,这里可以通过实现HandlerAdapter接口来自己做适配,复写handle方法,指定回调对应的handler的指定方法,当然,已经有注解的方式了,一般也不用自己扩展了。
4、 ViewResolver 的配置,从而将逻辑视图名解析为具体视图技术
5、处理器(页面控制器)的配置,从而进行功能处理
dispatcherservlet启动和初始化
他是个servlet,那么找到他的基类HttpServletBean的init方法,
首先会吧在web.xml中配置的一些初始化参数加载设置一下,
然后回去初始化dispatcherservlet持有的ioc容器,他会先去ServletContext中获取一个父ioc容器(webxml中配置了ContextLoaderListener的话,他在初始化的时候往servletcontext中放了一个,这个一般上都让他去加载项目用的bean,而dispatcherservlet持有的那个里面放的一版上都是和mvc相关的一些bean),这样在ioc容器getbean的时候,会先去容器的父容器中查找,如果找到了那么就找到,如果没找到,才去自容器中查找。

接着就是mvc框架相关的一些初始化,代码在dispatcherservlet的initStrategies方法中

初始化结束后,就会将配置好的handlermapping handleradpter 等都放在了dispatcherservlet中了,处理http请求使用的时候,就直接拿过来用了。

这里在初始化的时候,其实有个默认的配置,比如handlermapping



这个地方指向的就是一个资源文件,文件就放在spring-webmvc-xxx.jar里面,如下,里面已经默认配置了一些常用的,所以不用配置也可以使用。
mvc处理http分发请求

核心架构的具体流程步骤如下:
跟源码http请求最终进入到了dispatcherservlet的doDispatch方法中。

1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行
处理,作为统一访问点,进行全局的流程控制;

2、 DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一
个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新
的映射策略;

3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,
即适配器设计模式的应用,从而很容易支持很多类型的处理器;

4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处
理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);

5、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策
略模式,很容易更换其他视图技术;

6、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此
很容易支持其他视图技术;

