SpringMVC工作流程及其核心类

工作流程

SpringMVC工作流程及其核心类

  1. 浏览器发送http请求给服务器,服务器将请求转发给DispacterServlet。

  2. DispacterServlet根据请求信息(包括URL、Http方法、请求报文头和请求参数Cookie等)和HandlerMaping找到处理器适配器HandlerAdpater。

  3. HandlerAdpater找到具体的处理器Handler。

  4. Handler调用Controller。

  5. Controller调用Model具体处理请求业务得到结果ModelAndView()对象。

  6. 将ModelAndView传给DispacterServlet。

  7. DispacterServlet将View给ViewResolver通过名称解析视图的对象。

  8. 将Model对象给view用于展示。

  9. 将view返回给浏览器。

DispacterServlet接收服务器传来的请求,又分发给Controller获得最终结果,又分发给ViewResolver解析成最终xml返回给浏览器,起到一个调度作用。

下面将针对核心类进行介绍,具体可自行参看:http://docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/javadoc-api/

DispacterServlet

该类是http请求处理程序/控制器的*调度器,例如web ui控制器或者基于http的远程导出器。发送到处理程序来处理一个web请求,提供方便的映射和异常处理设施。

这个servlet 是相当灵活的:根据需求安装相应的适配器类就可以在任何工作流中使用,它提供以下功能,将其与其他的请求驱动SpringMVC框架进行区分:

  1. 它是基于javabeans配置机制。

  2. 它可以使用预先构建或者作为程序一部分提供的一些HandlerMapping去控制对处理对象的请求路由。默认是BeanNameUrlHandlerMapping和RequestMappingHandlerMapping。 HandlerMapping对象可以定义为servlet应用程序上下文中的bean,实现HandlerMapping接口,如果存在,则覆盖默认的HandlerMapping。 HandlerMappings可以被赋予任何bean名称(它们通过类型进行测试)。

  3. 它可以使用任何HandlerAdapter;这允许使用任何处理程序接口。默认适配器分别为HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,用于Spring的HttpRequestHandler和Controller接口。默认的RequestMappingHandlerAdapter也将被注册。 HandlerAdapter对象可以作为bean添加到应用程序上下文中,覆盖默认的HandlerAdapter。像HandlerMappings一样,HandlerAdapters可以被赋予任何bean名称(它们通过类型进行测试)。

  4. 调度程序的异常解决策略可以通过HandlerExceptionResolver来指定,例如将某些异常映射到错误页面。默认值为ExceptionHandlerExceptionResolver,ResponseStatusExceptionResolver和DefaultHandlerExceptionResolver。这些HandlerExceptionResolvers可以通过应用程序上下文来覆盖。HandlerExceptionResolver可以被赋予任何bean名称(它们通过类型进行测试)。

  5. 其视图解析策略可以通过ViewResolver实现来指定,将符号视图名称解析为View对象。默认为InternalResourceViewResolver。 ViewResolver对象可以作为应用程序上下文中的bean添加,覆盖默认的ViewResolver。 ViewResolvers可以被赋予任何bean名称(它们通过类型进行测试)。

  6. 如果用户不提供视图或视图名称,则配置的RequestToViewNameTranslator将将当前请求转换为视图名称。相应的bean名称为“viewNameTranslator”;默认值为DefaultRequestToViewNameTranslator。

  7. 调度员解决多部分请求的策略由MultipartResolver实现决定。包括Apache Commons FileUpload和Servlet 3的实现;典型的选择是CommonsMultipartResolver。 MultipartResolver bean名称为“multipartResolver”;默认为无。

  8. 其区域设置解决策略由LocaleResolver决定。开箱即用的实现通过HTTP接受头,cookie或会话工作。 LocaleResolver bean的名称是“localeResolver”;默认值为AcceptHeaderLocaleResolver。

  9. 其主题解决策略由ThemeResolver决定。包括固定主题和Cookie和会话存储的实现。 ThemeResolver bean的名称是“themeResolver”;默认是FixedThemeResolver。

注意:只有在调度程序中存在相应的HandlerMapping(用于类型级注释)和/或HandlerAdapter(用于方法级注释))时,才会处理@RequestMapping注释。这是默认情况。但是,如果要定义自定义HandlerMappings或HandlerAdapter,那么您需要确保相应的自定义RequestMappingHandlerMapping和/或RequestMappingHandlerAdapter也被定义,只要您打算使用@RequestMapping。

Web应用程序可以定义任意数量的DispatcherServlet。每个servlet将在自己的命名空间中运行,使用映射,处理程序等加载自己的应用程序上下文。只有ContextLoaderListener加载的根应用程序上下文(如果有的话)将被共享。

HandlerMaping

公共接口HandlerMapping

由定义请求和处理程序对象之间映射的对象实现的接口。

该类可以由应用程序开发人员实现,尽管这不是必需的,因为BeanNameUrlHandlerMapping和RequestMappingHandlerMapping包含在框架中。如果在应用程序上下文中没有注册HandlerMapping bean,则前者是默认值。

HandlerMapping实现可以支持映射拦截器,但不必。处理程序将始终包装在HandlerExecutionChain实例中,可选地伴随有一些HandlerInterceptor实例。 DispatcherServlet将首先按给定的顺序调用每个HandlerInterceptor的preHandle方法,如果所有preHandle方法返回true,最后调用处理程序本身。

参数化此映射的功能是此MVC框架的强大且不寻常的功能。例如,可以根据会话状态,Cookie状态或许多其他变量编写自定义映射。没有其他MVC框架似乎同样灵活。

注意:实现可以实现Ordered接口,以便能够指定排序顺序,从而实现DispatcherServlet应用的优先级。非有序实例被视为最低优先级。

HandlerAdpater

公共接口HandlerAdapter

MVC框架SPI,允许参数化核心MVC工作流程。

必须为每个处理程序类型实现的接口来处理请求。该接口用于允许DispatcherServlet无限可扩展。 DispatcherServlet通过此接口访问所有已安装的处理程序,这意味着它不包含特定于任何处理程序类型的代码。

请注意,处理程序可以是Object类型。这是为了使来自其他框架的处理程序能够与此框架集成而无需自定义编码,并允许不符合任何特定Java接口的注释驱动的处理程序对象。

此接口不适用于应用程序开发人员。它可用于想要开发自己的Web工作流程的处理程序。

注意:HandlerAdapter实现者可以实现Ordered接口,以便能够指定由

ModelAndView

持有者在Web MVC框架中的Model和View。 请注意,这些是完全不同的。 这个类只是保持两者使得控制器能够以单个返回值返回模型和视图。

表示由处理程序返回的模型和视图,由DispatcherServlet解决。 视图可以采用需要由ViewResolver对象解析的String视图名称的形式; 或者可以直接指定View对象。 该模型是一个Map,允许使用由名称键入的多个对象。

ViewResolver

要通过名称解析视图的对象实现的接口。

视图状态在应用程序运行期间不会更改,因此实现可以*缓存视图。

鼓励实施支持国际化,即本地化视图解决。