DispatcherServlet
Spring MVC,像许多其他Web框架一样,是围绕前端控制器模式设计的,其中一个中心Servlet
,即DispatcherServlet
,提供了一个共享的请求处理算法,而实际工作是由可配置的委托组件执行的。这种模型灵活,支持各种工作流程。
DispatcherServlet
,像任何一个Servlet
一样,需要根据Servlet规范使用Java配置或在web.xml
中进行声明和映射。反过来,DispatcherServlet
使用Spring配置来发现它需要的用于请求映射、视图解析、异常处理和更多的委托组件。
以下Java配置示例注册和初始化了DispatcherServlet
,该Servlet会被Servlet容器自动检测到(请参阅Servlet配置):
-
Java
-
Kotlin
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
// Load Spring web application configuration
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
// Create and register the DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/app/*");
}
}
class MyWebApplicationInitializer : WebApplicationInitializer {
override fun onStartup(servletContext: ServletContext) {
// Load Spring web application configuration
val context = AnnotationConfigWebApplicationContext()
context.register(AppConfig::class.java)
// Create and register the DispatcherServlet
val servlet = DispatcherServlet(context)
val registration = servletContext.addServlet("app", servlet)
registration.setLoadOnStartup(1)
registration.addMapping("/app/*")
}
}
除了直接使用ServletContext API外,还可以扩展AbstractAnnotationConfigDispatcherServletInitializer 并重写特定方法(请参阅上下文层次结构中的示例)。 |
对于编程用例,可以使用GenericWebApplicationContext 作为AnnotationConfigWebApplicationContext 的替代方案。有关详细信息,请参阅GenericWebApplicationContext 的javadoc。 |
以下web.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>
Spring Boot遵循不同的初始化顺序。与挂钩到Servlet容器的生命周期不同,Spring Boot使用Spring配置来引导自身和嵌入式Servlet容器。Filter 和Servlet 声明在Spring配置中被检测并注册到Servlet容器中。有关更多详细信息,请参阅Spring Boot文档。 |