Spring MVC作为Spring 体系中的一部分,具有相当重要的作用。Spring体系中IOC(反转控制)将开发人员从new一个对象变成由IOC容器直接管理,需要时直接会拿到一个创建好的对象供开发人员使用。而Spring MVC负责用户请求的响应等等。

   Spring MVC中的一大核心类为DispatcherServlet,继承自FrameworkServlet,FrameworkServlet继承自HttpServletBean,HttpServletBean继承了HttpServlet,同时间接实现了Aware接口,该接口的作用是,通知的作用。意即当需要Spring中的一些东西,比如ApplicationContext,就需要实现ApplicationContextAware接口,重写setApplicationContext方法,Spring得到通知后将应用上下文传过来。使用Spring MVC只需要在web.xml配置文件中注册DispatcherServlet,并扩展一个路径映射关系

  

spring 核心类 springmvc核心类_spring 核心类

 

 

contextConfigLocation用来指定context加载Spring MVC 配置文件的位置,url-pattern标签/表示拦截当前项目,记住,当Spring MVC 配置文件中定义了视图文件的前缀和后缀,若index.jsp不在定义的路径中,并且web.xml的url-pattern为/*,则会造成项目无法启动,/*拦截项目下的所有资源,/表示当前项目。

 

Spring MVC中的组件

Spring MVC 中的核心组件包括HandlerMapping(定义url的映射规则,即url和相应的处理类),HandlerAdapter(自定义各种url的Handler),ViewResolver(视图解析器,用于处理HandlerAdapter返回的视图)

DispatcherServlet分析

onRefresh方法是DispatcherServlet的入口方法

spring 核心类 springmvc核心类_自定义_02

其只是简单调用了initStrategies方法,代码如下:

spring 核心类 springmvc核心类_自定义_03

 

 该方法调用了9个初始化方法,将两个方法分离开来,提高代码的可重用性,试想若将初始化方法写在onRefresh方法中,若要增加其他功能,会造成代码的修改,反而来说,这样只需要增加新增功能的逻辑,onRefresh只需调用即可。易维护性大大提高。

以其中的一个方法来分析,initHandlerMappings:

spring 核心类 springmvc核心类_加载_04

 

spring 核心类 springmvc核心类_加载_05

首先通过BeanFactoryUtil查找url和对应HandlerMapping的匹配类存放在map容器中,下面我们看看BeanFactoryUtils的方法做了什么:

spring 核心类 springmvc核心类_加载_06

allowEagerInit指的是非懒加载,即IOC容器初始化的时候进行加载该bean对象,该方法的作用主要是根据该BeanFactory是可继承的还是可列表的得到含有继承关系的映射关系,并通过sort方法对HandlerMapping进行排序,若得到的映射的关系列表为空,则会根据默认策略getDefaultStrategies方法获取,查看一下代码:

spring 核心类 springmvc核心类_spring 核心类_07

默认策略首先会加载DispatcherServlet.properties属性文件,该文件位于org.springframework.web.servlet路径下:

spring 核心类 springmvc核心类_spring 核心类_08

可见默认为BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping,一个是根据名称和url对应,一个是根据注解对应,HandlerMapping接口中只有一个方法getHandler:

spring 核心类 springmvc核心类_spring 核心类_09

该方法返回一个对象HandlerExecutionChain,该对象由handler和inteceptor数组组成,需要注意的是handler对象为Object类型,这就为开发人员提供了很大的空间来自定义handler.handler来处理方法,inteceptor通过preHandle,postHandle,afterCompletion方法拦截并处理方法。

其次就是HandlerAdapter,它才是真正干活的人,其有三个方法:

spring 核心类 springmvc核心类_MVC_10

supports方法作用是判断HandlerAdapter是否支持该handler对象,handle是处理方法,返回ModelAndView对象,getLastModified方法获取最后一次的修改时间,自定义handler只需实现HandlerAdapter接口

接下来就是ViewResolver,视图解析器,这就不得不提到ModelAndView对象,该对象封装了model和view对象,model利用map来存放数据,viewResolver会将其设置到request域中,该对象是连接业务逻辑和view展现层的桥梁,对SpringMVC来说,它是连接Handler和View的桥梁。JSP的ViewReslver对应的是InternalResourceViewResolver类,当调用resolveViewName方法是会调用createView方法,将viewClass属性对应的InternalResourceView类实例化,最后调用InternalResourceView的render方法渲染JSP页面。