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接口的主要作用是用于处理视图,然后返回给客户端。
AbstractCachingViewResolver:这是一个抽象类,这种视图解析器会把它曾经解析过的视图保存起来,然后每次要解析视图的时候先从缓存里面找。
UrlBasedViewResolver:它是对ViewResolver的一种简单实现,而且继承了AbstractCachingViewResolver,主要就是提供的一种拼接URL的方式来解析视图,
InternalResourceViewResolver: 它会把返回的视图名称都解析为InternalResourceView 对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。
XmlViewResolver:它继承自AbstractCachingViewResolver抽象类,所以它也是支持视图缓存的。XmlViewResolver需要给定一个xml配置文件,该文件将使用和Spring的bean工厂配置文件一样的DTD定义,所以其实该文件就是用来定义视图的bean对象的。在该文件中定义的每一个视图的bean对象都给定一个名字,然后XmlViewResolver将根据Controller处理器方法返回的逻辑视图名称到XmlViewResolver指定的配置文件中寻找对应名称的视图bean用于处理视图。该配置文件默认是/WEB-INF/views.xml文件,如果不使用默认值的时候可以在XmlViewResolver的location属性中指定它的位置。XmlViewResolver还实现了Ordered接口,因此我们可以通过其order属性来指定在ViewResolver链中它所处的位置,order的值越小优先级越高。
BeanNameViewResolver:这个视图解析器跟XmlViewResolver有点类似,也是通过把返回的逻辑视图名称去匹配定义好的视图bean对象。不同点有二,一是BeanNameViewResolver要求视图bean对象都定义在Spring的application context中,而XmlViewResolver是在指定的配置文件中寻找视图bean对象,二是BeanNameViewResolver不会进行视图缓存。
ResourceBundleViewResolver:它和XmlViewResolver一样,也需要有一个配置文件来定义逻辑视图名称和真正的View对象的对应关系,不同的是ResourceBundleViewResolver的配置文件是一个属性文件,而且必须是放在classpath路径下面的,默认情况下这个配置文件是在classpath根目录下的views.properties文件,如果不使用默认值的话,则可以通过属性baseName或baseNames来指定。
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);
DefaultHandlerExceptionResolver:
解决标准的spring异常,并且将他们翻译成HTTP状态码;ResonseStatusExceptionResolver:
解决使用@ResponseStatus注解把异常转换成相应的状态码;SimpleMappingExceptionResolver:
解决异常类到view的映射与跳转问题;HandlerExceptionResolverComposite:
作为容器使用,可以封装别的Resolver,它并不会解析具体的异常,而是调用其他的异常解析器处理异常ExceptionHandlerExceptionResolver:
从spring mvc3 开始代替 AnnotationMethodHandlerException来处理注解异常;
菜鸟感觉,要想很好的理解运用spring mvc 还是理解思想,掌握流程,参看源码,以下几篇博文,对理解Spring mvc的流程很有帮助:
1. Sping mvc 源码分析
2. Spring mvc源码解析之异常解析
上一篇: epoll服务器
下一篇: 深入分析Spring事件驱动模型
推荐阅读
-
laravel 框架执行流程与原理简单分析
-
Spring MVC源码(二) ----- DispatcherServlet 请求处理流程 面试必问
-
Spring MyBatis初始化解析及sql执行流程
-
Spring MVC 执行流程分析
-
Spring IOC MVC DI简单实现
-
三行代码实现.NET MVC统计显示页面的执行时间 超简单的实现方法 分析页面执行效率
-
asp.net mvc 简单项目框架的搭建(二)—— Spring.Net在Mvc中的简单应用
-
Spring MVC 简单的hello world的实现
-
Ajax提交数据后 回调函数不执行并且Spring mvc控制器 无法解析视图解决办法
-
简单的spring mvc 定时任务(quartz 带Demo)