DispatcherServlet的六种配置方式------Spring MVC核心配置类

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[] { "/" };
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豢龙先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值