一,Spring MVC原理
二,Spring MVC架构
以下内容整理或引自《看透SpringMVC:源代码分析与实践》
SpringMVC中Servlet一共有三个层次,分别是HttpServletBean、FrameworkServlet和DispatcherServlet。HttpServletBean直接继承自Java的HttpServlet,其作用是将Servlet中配置的参数设置到相应的属性;FrameworkServlet初始化了WebApplicationContext,DispatcherServlet初始化了自身的9个组件。
三个Servlet的处理过程大致功能如下:
·HttpServletBean:没有参与实际请求的处理。
·FrameworkServlet:将不同类型的请求合并到了processRequest方法统一处理,processRequest方法中做了三件事:
·调用了doService模板方法具体处理请求。
·将当前请求的LocaleContext和ServletRequestAttributes在处理请求前设置到了LocaleContextHolder和RequestContextHolder,并在请求处理完成后恢复,
·请求处理完后发布了ServletRequestHandledEvent消息。
·DispatcherServlet:doService方法给request设置了一些属性并将请求交给doDispatch方法具体处理。
DispatcherServlet中的doDispatch方法完成SpringMVC中请求处理过程的顶层设计,它使用DispatcherServlet中的九大组件完成了具体的请求处理。
九个组件
1 HandlerMapping
它的作用是根据request找到相应的处理器Handler和Interceptors。
2 HandlerAdapter
可以理解为使用处理器干活的人。
3 HandlerExceptionResolver
此组件的作用是根据异常设置ModelAndView,之后再交给render方法进行渲染。
4 ViewResolver
ViewResolver用来将String类型的视图名和Locale解析为View类型的视图
5 RequestToViewNameTranslator
ViewResolver是根据ViewName查找View,但有的Handler处理完后并没有设置View也没有设置viewName,这时就需要从request获取viewName了,而如何从request获取viewName就是RequestToViewNameTranslator要做的事情。
6 LocaleResolver
解析视图需要两个参数:一个是视图名,另一个是Locale。视图名是处理器返回的(或者使用RequestToViewNameTranslator解析的默认视图名),LocaleResolver用于从request解析出Locale。
7 ThemeResolver
ThemeResolver从名字就可以看出是解析主题用的。
8 MultipartResolverMultipartResolver
用于处理上传请求,处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取到File,如果上传多个文件,还可以调用getFileMap得到FileName→File结构的Map,这样就使得上传请求的处理变得非常简单。
9 FlashMapManagerFlashMap
主要用在redirect中传递参数。