因为项目需要,需要在Spring Boot项目里加载第三方jar包下的过滤器,以及配置自定义Servlet(额,好久没写过Servlet了),忙里偷闲,将这些东西整理一下。
注解的方式配置
Servlet 3.0 开始提供了这 3 个注解来代替。
@WebServlet => 代替 servlet 配置
@WebFilter => 代替 filter 配置
@WebListener => 代替 listener 配置
配置servlet
@WebServlet(name = "testServlet", urlPatterns = {"/testServlet"},
initParams = {@WebInitParam(name = "param1", value = "this is param1"),
@WebInitParam(name = "param2", value = "this is param2")})
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String param1 = getServletConfig().getInitParameter("param1");
String param2 = getInitParameter("param2");
System.out.println("param1=" + param1);
System.out.println("param2=" + param2);
System.out.println("---------TestServlet------------");
}
}
如果要使servlet生效,还需要在启动类上加上@ServletComponentScan,不然可能会不生效。
@ServletComponentScan
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
配置filter
//@Component
@WebFilter(filterName = "testFilter", urlPatterns = {"/*"},
initParams = {@WebInitParam(name = "param1", value = "this is param1"),
@WebInitParam(name = "param2", value = "this is param2")})
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String param1 = filterConfig.getInitParameter("param1");
String param2 = filterConfig.getInitParameter("param2");
System.out.println("param1=" + param1);
System.out.println("param2=" + param2);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("---------TestFilter------------");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
如果发现filter没有生效,可以考虑加上@Component注解(可能是因为版本问题吧,有的时候不需要加,加了反而会报错)。
配置listener
@WebListener
public class TestListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("---------------TestListener---------------");
}
}
根据我的测试,此注解只对Web监听器起作用,例如ServletContextListener,HttpSessionListener,对于ApplicationListener需要使用@Component注解。
代码的方式配置
ServletRegistrationBean => 配置servlet
FilterRegistrationBean => 配置filter
ServletListenerRegistrationBean => 配置listener
配置servlet
@Configuration
public class Config {
@Bean
public ServletRegistrationBean testServlet() {
//创建servlet注册bean
ServletRegistrationBean<TestServlet> servletRegistrationBean = new ServletRegistrationBean<>();
//创建servlet
TestServlet testServlet = new TestServlet();
//注入servlet
servletRegistrationBean.setServlet(testServlet);
//servlet名称
servletRegistrationBean.setName("testServlet");
//映射url
servletRegistrationBean.addUrlMappings("/testServlet");
//注入参数
servletRegistrationBean.addInitParameter("param1", "this is param1");
servletRegistrationBean.addInitParameter("param2", "this is param2");
return servletRegistrationBean;
}
}
配置filter
在Config类里添加如下方法:
@Bean
public FilterRegistrationBean testFilter() {
//创建filter注册bean
FilterRegistrationBean<TestFilter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
//创建filter
TestFilter testFilter = new TestFilter();
//注入filter
filterFilterRegistrationBean.setFilter(testFilter);
//filter名称
filterFilterRegistrationBean.setName("testFilter");
//拦截规则
filterFilterRegistrationBean.addUrlPatterns("/*");
//执行顺序
filterFilterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
//注入参数
filterFilterRegistrationBean.addInitParameter("param3", "this is param3");
filterFilterRegistrationBean.addInitParameter("param4", "this is param4");
return filterFilterRegistrationBean;
}
配置listener
在Config类里添加如下方法:
@Bean
public ServletListenerRegistrationBean testListener() {
//创建listener注册bean
ServletListenerRegistrationBean<TestListener> servletListenerRegistrationBean = new ServletListenerRegistrationBean<>();
//创建listener
TestListener testListener = new TestListener();
//注入listener
servletListenerRegistrationBean.setListener(testListener);
return servletListenerRegistrationBean;
}
动态的方式配置
如果你在 Spring Boot 中完成 Servlet、Filter、Listener 的初始化操作,需要在 Spring 中实现ServletContextInitializer 这个接口,并注册为一个 bean。
@Component
public class DynamicConfig implements ServletContextInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
}
}
配置servlet
在onStartup方法中添加如下代码:
ServletRegistration.Dynamic testServlet = servletContext.addServlet("testServlet", TestServlet.class);
testServlet.addMapping("/testServlet");
testServlet.setInitParameter("param1", "this is param1");
testServlet.setInitParameter("param2", "this is param2");
配置filter
在onStartup方法中添加如下代码:
FilterRegistration.Dynamic testFilter = servletContext.addFilter("testFilter", TestFilter.class);
EnumSet<DispatcherType> enumSet = EnumSet.of(DispatcherType.REQUEST);
testFilter.addMappingForUrlPatterns(enumSet, true, "/*");
testFilter.setInitParameter("param3", "this is param3");
testFilter.setInitParameter("param4", "this is param4");
配置listener
在onStartup方法中添加如下代码:
servletContext.addListener(TestListener.class);
总结
这就是整理的在Spring Boot中注册servlet,filter,listener的三种方式,在此做下笔记,希望能对自己和大家有帮助!