您的位置:首页 > 编程语言 > Java开发

SpringMVC请求大致处理流程

2017-05-21 23:50 316 查看
我们都在使用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来适配不同的请求类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息