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

springMVC请求响应时间怎么配置 springmvc请求处理流程_springMVC请求响应时间怎么配置

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

用户首先发送请求到前端控制器(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来适配不同的请求类型。