Spring MVC高级配置---JavaConfig配置 Servlet,Filter,Listener

      在搭建Spring MVC Web项目----JavaConfig中 是假设了 我们的web项目只需要基本的DispatcherServlet和ContextLoaderListener环境,并且Spring配置是使用Java的。

      如果我们需要对DispatcherServlet本身做一些额外配置,如果还需要额外的Servlet和Filter,如果项目需要部署到Servlet3.0之前,使用xml配置。搭建Spring MVC Web项目----JavaConfig的配置就不能满足需要了。

      这儿只是将如何注册除了DispatcherServlet和ContextLoaderListener之外的Servlet,Filter,Listener到Servlet容器。至于这个Servlet,Filter,Listener的具体作用这里不讲……

自定义DispatcherServlet配置

     自定义DispatcherServlet配置 需要使用  javax.servlet.ServletRegistration.Dynamic实例  

     创建一个新的Servlet把它注册到Servlet容器后会生成javax.servlet.ServletRegistration.Dynamic实例。使用Dynamic对Servlet进行额外配置。

      对DispatcherServlet而言,因为我们没有负责手动创建Dispatcher和把它注册到Servlet容器的工作。AbstractAnnotationConfigDispatcherServletInitializer已经实现了对DispatcherServlet的创建并把它注册到Servlet容器中。那我们就需要调用customizeRegistration()方法获得注册它返回的Dynamic实例。对DispatcherServlet本身做一些额外的配置。    

import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
	 
	//自定义DispatcherServlet配置
	@Override
	protected void customizeRegistration(Dynamic registration) {
		// 设置load-on-startup优先级
		registration.setLoadOnStartup(2);
		// 设置初始化参数
		registration.setInitParameter("name", "value");
		// 配置Servlet 3.0对multipart的支持,将上传文件的临时存储目录设置在“/tmp/spittr/uploads”中
		registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads"));
	}

}

 

注册其他的Servlet和Filter---注册一个Servlet

      通过实现WebApplicationInitializer接口注册一个Servlet。定义一个初始化器类并实现WebApplicationInitializer接口

      前提已经定义了MyServlet类,把MyServlet注册到Servlet容器中的实现如下。

     以下代码可以看出把Servlet注册到Servlet容器中时 会返回一个Dynamic实例,就是通过这个Dynamic实例 对Servlet进行额外的配置。

import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.WebApplicationInitializer;

public class MyServletInitializer implements WebApplicationInitializer {

	public void onStartup(ServletContext servletContext) throws ServletException {
		//注册Servlet
		Dynamic myServlet = servletContext.addServlet("myServlet", MyServlet.class);
		//映射Servlet
		myServlet.addMapping("/");
	}

}

注册其他的Servlet和Filter----再理解DispatcherServlet

      在原来的 搭建Spring MVC Web项目----JavaConfig,扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类 都会自动地配置DispatcherServlet。这个具体怎么实现的 是SpringMVC的工作。其实SpringMVC也是实现了WebApplicationInitializer接口,具体继承关系如下。

public abstract class AbstractAnnotationConfigDispatcherServletInitializer
		extends AbstractDispatcherServletInitializer {}
public abstract class AbstractDispatcherServletInitializer extends AbstractContextLoaderInitializer
public abstract class AbstractContextLoaderInitializer implements WebApplicationInitializer {}

注册其他的Servlet和Filter----注册Filter

      前提定义了MyFilter类 通过实现WebApplicationInitializer接口注册一个Filter

import javax.servlet.Filter;
import javax.servlet.FilterRegistration.Dynamic;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.springframework.web.WebApplicationInitializer;

public class MyFilterInitialer implements WebApplicationInitializer {

	public void onStartup(ServletContext servletContext) throws ServletException {
		//注册Filter
		Dynamic myFilter = servletContext.addFilter("myFilter",MyFilter.class);
		//添加Filter的映射路径
		myFilter.addMappingForUrlPatterns(null, false, "/custom/*");
	}
}

注册其他的Servlet和Filter----注册Filter并把它映射到DispatcherServlet

      如果我们的Filter是映射到DispatcherServlet上,还有一种方法来注册它到Servlet容器中。重
载AbstractAnnotationConfigDispatcherServletInitializer的getServlet-Filters()方法

     在这里没有必要声明它的映射路径,getServletFilters()方法返回的所有Filter都会映射到DispatcherServlet上

import javax.servlet.Filter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {


	@Override
	protected Filter[] getServletFilters() {
		return new Filter[] { new MyFilter() };
	}

}

 

posted on 2019-04-24 11:51  dreamstar  阅读(305)  评论(0编辑  收藏  举报