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() };
}
}