DispatcherServlet的六种配置方式,适用于直接使用Spring MVC框架,而不是Spring Boot集成
Spring MVC 和其他许多WEB框架类似,Spring MVC也是围绕前端控制器模式设计的,其中一个中央处理器DispatcherServlet提供了一个用于处理请求的共享算法,而实际工作是由可配置的委托组件执行。该模型灵活并且支持多种工作流程。
与其他任何Servlet一样,DispatcherServlet需要根据Servlet规范使用JavaConfig或是web.xml进行声明和映射。然后,DispatcherServlet使用Spring配置来发现请求映射、视图解析、异常处理等所需的委托组件。
下面是DispatcherServlet的配置, Servlet容器将自动检测DispatcherServlet:
一、传统的两种配置方式
1、JavaConfig方式的配置
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
/**
* 初始化DispatcherServlet,使用注解方式发现WEB组件
* @author dyw
* @date 2019年11月21日
*/
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// 加载Spring web应用程序配置
AnnotationConfigWebApplicationContext ac =new AnnotationConfigWebApplicationContext();
ac.register(AppCofig.class);
ac.refresh();
// 创建并注册DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(ac);
ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
// 容器启动时就加载这个servlet,值越小加载的优先级就越高,负数时或是没有设置时表示使用时加载
registration.setLoadOnStartup(1);
registration.addMapping("/app/*");
}
}
2、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/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>classpath:/config.xml</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、JavaConfig方式的配置
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* 创建层级Application Context的应用程序,也可以使用此种方式初始化DispatcherServlet
*
* @author dyw
* @date 2019年11月21日
*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 如果不需要上下文层级关系,则应用程序可以通过getRootConfigClasses()返回所有配置,并通过getServletConfigClasses()返回null。
*/
@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/*" };
}
}
2、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>
注意:如果不需要应用程序上下文层次结构,那么应用程序可能只配置一个“根”上下文,而将contextConfigLocation Servlet参数设置为空。
三、结合JavaConfig和xml的配置策略
1、方式一
import org.springframework.web.WebApplicationInitializer;
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
2、方式二
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
@Override
protected WebApplicationContext createServletApplicationContext() {
XmlWebApplicationContext cxt = new XmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
return cxt;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}