Spring MVC简单执行流程

本片博文主要复习下Spring MVC的执行流程,也方便自己面试的时候做简单的回顾;


以下执行流程图来此网络(动力节点图片)

这里写图片描述

近下来我们对Spring MVC的默认配置类 DispatcherServlet.properties类进行简单的分析:

DispatcherServlet.properties

com.springframework.web.servlet.DispatcherServlet.properties:
o.s.w.s = org.springframework.web.servlet 
//支持国际化,解析用户区域
osws.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

//提供了动态更换样式的支持
osws.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

//根据uri找到处理器handler和拦截器,并将其封装成处理器执行链,HandlerExecutionChain 返回给前端控制器;
osws.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

//HandlerAdapter的功能实际就是执行我们的具体的Controller、Servlet或者HttpRequestHandler中的方法;
osws.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

//HandlerExceptionResolver的功能实际就是执行我们的具体的Controller、Servlet或者HttpRequestHandler中的方法;
osws.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

//ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视图
osws.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

// flashmap 的作用是在redirect中传递参数。重定向会生成新的request,那传递参数就不能直接用request进行传递。
osws.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

1: HandlerMapping:

HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

这里写图片描述


2: HandlerAdapter:

boolean supports(Object handler); 

ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)

long getLastModified(HttpServletRequest request, Object handler); 

这里写图片描述

1、SimpleServletHandlerAdapter实际就是执行HttpServlet的service方法
2、SimpleControllerHandlerAdapter实际就是执行Controller的handleRequest方法
3、HttpRequestHandlerAdapter实际就是执行HttpRequestHandler的handleRequest方法
4、RequestMappingHandlerAdapter实际就是执行@RequestMapping注解的方法。
5、AnnotationMethodHandlerAdapter已结被废弃,


3: ViewResolver:

View resolveViewName(String viewName, Locale locale) throws Exception;

这里写图片描述
SpringMVC用于处理视图最重要的两个接口是ViewResolver和View。ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视图,SpringMVC中用于把View对象呈现给客户端的是View对象本身,而ViewResolver只是把逻辑视图名称解析为对象的View对象。View接口的主要作用是用于处理视图,然后返回给客户端。

  1. AbstractCachingViewResolver:这是一个抽象类,这种视图解析器会把它曾经解析过的视图保存起来,然后每次要解析视图的时候先从缓存里面找。

  2. UrlBasedViewResolver:它是对ViewResolver的一种简单实现,而且继承了AbstractCachingViewResolver,主要就是提供的一种拼接URL的方式来解析视图,

  3. InternalResourceViewResolver: 它会把返回的视图名称都解析为InternalResourceView 对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。

  4. XmlViewResolver:它继承自AbstractCachingViewResolver抽象类,所以它也是支持视图缓存的。XmlViewResolver需要给定一个xml配置文件,该文件将使用和Spring的bean工厂配置文件一样的DTD定义,所以其实该文件就是用来定义视图的bean对象的。在该文件中定义的每一个视图的bean对象都给定一个名字,然后XmlViewResolver将根据Controller处理器方法返回的逻辑视图名称到XmlViewResolver指定的配置文件中寻找对应名称的视图bean用于处理视图。该配置文件默认是/WEB-INF/views.xml文件,如果不使用默认值的时候可以在XmlViewResolver的location属性中指定它的位置。XmlViewResolver还实现了Ordered接口,因此我们可以通过其order属性来指定在ViewResolver链中它所处的位置,order的值越小优先级越高。

  5. BeanNameViewResolver:这个视图解析器跟XmlViewResolver有点类似,也是通过把返回的逻辑视图名称去匹配定义好的视图bean对象。不同点有二,一是BeanNameViewResolver要求视图bean对象都定义在Spring的application context中,而XmlViewResolver是在指定的配置文件中寻找视图bean对象,二是BeanNameViewResolver不会进行视图缓存。

  6. ResourceBundleViewResolver:它和XmlViewResolver一样,也需要有一个配置文件来定义逻辑视图名称和真正的View对象的对应关系,不同的是ResourceBundleViewResolver的配置文件是一个属性文件,而且必须是放在classpath路径下面的,默认情况下这个配置文件是在classpath根目录下的views.properties文件,如果不使用默认值的话,则可以通过属性baseName或baseNames来指定。

  7. ViewResolverComposite我们介绍了一些springMVC提供的很多视图解析器ViewResolver,在开发的一套springMVC系统中是可以使用多个视图的,当然就需要配置多个视图解析器了简单来说就是使用简单的List来保存你配置使用的视图解析器,


4: View:

void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;

这里写图片描述
图片来此网络(实际体系比此复制)
render中做的操作就是将model中的值全部存放到request和response中,这样就完成了请求的处理操作,最终就是返回response请求。


5:HandlerExceptionResolver:

ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);

这里写图片描述

  1. DefaultHandlerExceptionResolver:
    解决标准的spring异常,并且将他们翻译成HTTP状态码;

  2. ResonseStatusExceptionResolver:
    解决使用@ResponseStatus注解把异常转换成相应的状态码;

  3. SimpleMappingExceptionResolver:
    解决异常类到view的映射与跳转问题;

  4. HandlerExceptionResolverComposite:
    作为容器使用,可以封装别的Resolver,它并不会解析具体的异常,而是调用其他的异常解析器处理异常

  5. ExceptionHandlerExceptionResolver:
    从spring mvc3 开始代替 AnnotationMethodHandlerException来处理注解异常;


菜鸟感觉,要想很好的理解运用spring mvc 还是理解思想,掌握流程,参看源码,以下几篇博文,对理解Spring mvc的流程很有帮助:
1. Sping mvc 源码分析
2. Spring mvc源码解析之异常解析

猜你喜欢

转载自blog.csdn.net/managementandjava/article/details/78507582