Web on Servlet Stack
Version 5.1.6.RELEASE
本文是springMVC官方原版文档的翻译,版本是基于最新稳定版Version5.1.6.RELEASE
1. Spring Web MVC
Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。 正式名称“Spring Web MVC”来自其源模块(spring-webmvc)的名称,但它通常被称为“Spring MVC”。
与Spring Web MVC并行,Spring Framework 5.0引入了一个反应堆栈Web框架,其名称“Spring WebFlux”也基于其源模块(spring-webflux)。 本节介绍Spring Web MVC。 下一节将介绍Spring WebFlux。
Servlet容器和Java EE版本范围的兼容性,请https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions
1.1. DispatcherServlet
与许多其他Web框架一样,Spring MVC围绕前端控制器模式设计,其中核心Servlet DispatcherServlet为请求处理提供调度,而实际工作由可配置委托组件执行。 该模型非常灵活,支持多种工作流程。
DispatcherServlet与任何Servlet一样,需要使用Java配置或web.xml根据Servlet规范进行声明和映射。 反过来,DispatcherServlet使用Spring配置来发现请求映射,视图解析,异常处理等所需的委托组件。
下面例子,使用Java配置注册并初始化DispatcherServlet,它由Servlet容器自动检测(请参阅Servlet配置):
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletCxt) {
// Load Spring web application configuration
AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
ac.register(AppConfig.class);
ac.refresh();
// Create and register the DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(ac);
ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/app/*");
}
}
下面例子,使用xml配置注册并初始化DispatcherServlet
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app>
1.1.1. Context Hierarchy
DispatcherServlet需要一个WebApplicationContext(普通ApplicationContext的扩展)来作为自己的配置。
WebApplicationContext有一个指向ServletContext以及与之关联的Servlet的链接。
它还绑定到ServletContext,以便应用程序可以通过RequestContextUtils上的静态方法,访问到WebApplicationContext。
对于许多应用程序,一个WebApplicationContext已经足够使用了。也可以有一个上下文层次结构,其中一个根WebApplicationContext在多个DispatcherServlet(或其他Servlet)实例之间共享,每个实例都有自己的子WebApplicationContext配置。
父类WebApplicationContext通常包含基础结构bean,以便多个Servlet实例共享的数据存储库和业务服务。
可以在WebApplicationContext的子类中覆盖(即重新声明)这些bean,它通常包含给定Servlet的本地bean
下面的图片展示了这种关系
下面的例子配置了一个WebApplicationContext
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { RootConfig.class }; }
@Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { App1Config.class }; } @Override protected String[] getServletMappings() { return new String[] { "/app1/*" }; }
}
下面的例子用web.xml展示
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>app1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app1-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app1</servlet-name>
<url-pattern>/app1/*</url-pattern>
</servlet-mapping>
</web-app>
1.1.2. Special Bean Types
DispatcherServlet委托特殊bean处理请求并响应。 这些bean通常由spring提供,但您可以自定义其属性并扩展或替换它们。
下表列出了DispatcherServlet检测到的特殊bean
Bean type | Explanation |
---|---|
HandlerMapping | 根据某些标准将传入的请求映射到处理程序和预处理程序和后处理程序(处理程序拦截器)列表,这些标准的细节因HandlerMapping实现的不同而不同。最流行的实现支持带注释的控制器,但也存在其他实现。 |
HandlerAdapter | 帮助DispatcherServlet调用映射到请求的处理程序,而不管实际调用的是哪个处理程序。例如,调用带注释的控制器需要解析各种注释。因此,HandlerAdapter的主要目的是保护DispatcherServlet不受这些细节的影响. |
HandlerExceptionResolver | 将异常映射到视图还允许更复杂的异常处理代码。 |
ViewResolver | 将基于逻辑字符串的视图名称解析为实际的视图类型。 |
LocaleResolver , LocaleContextResolver | 解析客户端正在使用的语言环境,可能还有它们所在的时区,以便能够提供国际化的视图。 |
ThemeResolver | 解析web应用程序可以使用的主题,例如,提供个性化的布局 |
MultipartResolver | 解析multi-part request,例如支持处理来自HTML表单的文件上传。 |
FlashMapManager | 存储和检索“输入”和“输出”FlashMap,可以使用它们将属性从一个请求传递到另一个请求,通常是通过重定向。 |