SpringMVC请求大致处理流程

我们都在使用SpringMVC,那么SpringMVC处理一个请求的大致流程是怎样的呢?请看下面图所示:

SpringMVC请求大致处理流程_第1张图片

文字描述的话大致是这样的一个流程:

用户首先发送请求到前端控制器(DispatcherServlet),在doDispatch这个方法中会为请求找到对应的HandlerMapping(处理器映射),然后将这个HandlerMapping映射成HandlerExecutionChain(处理器执行链)对象(包含一个Handler处理器对象,多个HandlerInterceptor拦截器对象),接着会将得到的HandlerExecutionChain包装成HandlerAdapter(适配器),根据得到的HandlerAdapter调用真正的处理器得到一个ModelAndView对象,接着调用ViewResolver,把得到的ModelAndView中的视图名解析为具体的View,接着View根据传进来的Model模型数据进行渲染(如果有页面的话数据是放到了request.setAttribute中了),最后返回响应给用户。


我们看一下SpringMVC我们提供好的一些东西:

HandlerMapping(处理器映射):

我们可以在应用中使用预先构建的或者提供好的HandlerMapping的任何实现类,用来控制请求到处理对象之间的路由的。
默认的实现类是:org.springframework.web.servlet.handler. BeanNameUrlHandlerMapping和org.springframework.web.servlet.mvc.annotation. DefaultAnnotationHandlerMapping。说明DefaultAnnotationHandlerMapping在3.2之后标注为过期了,用org.springframework.web.servlet.mvc.method.annotation. RequestMappingHandlerMapping进行了替代。
如果存在HandlerMapping的实现类的话,它在Servlet的应用上下文中被定义为一个bean。

HandlerAdapter(处理适配器):

HandlerAdapter允许使用任意的处理器接口。

默认的处理适配器是:org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter、org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter和Spring的org.springframework.web.HttpRequestHandler、org.springframework.web.servlet.mvc.Controller接口默认的注解适配器是org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter。说明明:AnnotationMethodHandlerAdapter在SpringMVC3.2中被标注为过期了用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter进行了替代。
同样的HandlerAdapter在应用上下文中被定义为一个bean。

HandlerExceptionResolver(异常处理)

前端控制器中的异常处理策略是通过HandlerExceptionResolver来解决的,例如映射某一个确定的异常到错误页面。
默认的异常处理类是:org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver、org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver、org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
HandlerExceptionResolver可以通过应用上下文被重写。它在应用上下文中也是被定义为了一个bean。

ViewResolver(视图解析器)

视图解析策略可以通过指定一个ViewResolver的实现类来将相应的视图名字解析成视图对象。
默认的实现类是org.springframework.web.servlet.view. InternalResourceViewResolver
同样的ViewResolver在应用上下文中被定义为一个bean。

RequestToViewNameTranslator(请求到视图名的转换)

如果一个视图或者视图名没有被用户提供的话,可以通过配置RequestToViewNameTranslator来将当前的请求转换为一个视图名。
默认的实现类是org.springframework.web.servlet.view. DefaultRequestToViewNameTranslator
它在应用上下文中的bean的名字是 viewNameTranslator

MultipartResolver(通常是文件上传)

通过MultipartResolver的实现类我们可以解决multipart requests。
我们通常选择的实现类是org.springframework.web.multipart.commons. CommonsMultipartResolver。这个实现包含了Apache Commons FileUpload and Servlet 3 。
MultipartResolver的bean名字是 multipartResolver,没有默认的实现类,我们如果要使用这个功能的话,需要在配置文件中进行相应的配置。

LocaleResolver(本地资源的解析即国际化)

国际化的解决策略是通过LocaleResolver的实现类来实现的。它是通过HTTP的接收头、cookie、session工作的。
默认的实现类是org.springframework.web.servlet.i18n. AcceptHeaderLocaleResolver
它在应用上下文中的bean的名字为 localeResolver

ThemeResolver(主题解析)

主题解决策略是通过ThemeResolver的实现类来实现的。包括一个固定的主题和cookie和会话存储的实现。
默认的实现类是:org.springframework.web.servlet.theme. FixedThemeResolver
它在应用上下文中的bean的名字为 themeResolver


另外:我们可以在应用中定义不止一个DispatcherServlet来适配不同的请求类型。


你可能感兴趣的:(Web,SpringMVC学习系列)