SpringBoot注册Servlet、Filter、Listener
由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件.
Spring Boot 提供了 ServletRegistrationBean, FilterRegistrationBean, ServletListenerRegistrationBean
三个类分别用来注册 Servlet, Filter, Listener
一、注册Servlet
1. 使用ServletRegistrationBean来注册
- 自定义Servlet类
public class MyServlet 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 {
PrintWriter writer = resp.getWriter();
writer.write("hello world");
writer.flush();
writer.close();
}
}
- 注册Servlet
/**
* 注册Servlet
*/
@Configuration
public class MyServletConfig {
/**
* 注册Servlet
*/
@Bean
public ServletRegistrationBean myServletRegistrationBean(){
//ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean("/myservlet",new MyServlet());
// 创建ServletRegistrationBean注册Bean
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
// 注册Servlet访问地址
servletRegistrationBean.addUrlMappings("/myservlet");
// 还可以设置其他属性
// ...
// 注册Servlet处理类
servletRegistrationBean.setServlet(new MyServlet());
return servletRegistrationBean;
}
}
2. 使用@WebServlet 注解
// import javax.servlet.annotation.WebServlet;
@WebServlet(urlPatterns = "/myservlet1")
public class MyServlet1 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 {
PrintWriter writer = resp.getWriter();
writer.write("hello world");
writer.flush();
writer.close();
}
}
// 启动类上追加注解
@ServletComponentScan
@SpringBootApplication
public class SpringBoot05WebCurdProApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot05WebCurdProApplication.class, args);
}
}
3. 使用ServletContext注解()
了解,用的不多
@Component
public class MyServletConfig implements ServletContextInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
ServletRegistration initServlet = servletContext.addServlet("myServlet", MyServlet.class);
initServlet.addMapping("/myServlet");
}
}
二、注册Filter
1. 使用FilterRegistrationBean来注册
@Configuration
public class MyFilterConfig {
@Bean
public FilterRegistrationBean myFilterRegistrationBean(){
// 创建FilterRegistrationBean注册Bean
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
// 注册Filter处理类
filterRegistrationBean.setFilter(new MyFilter());
// Filter的name
filterRegistrationBean.setName("myFilter");
// Filter需要过滤的请求(一次追加多个)
filterRegistrationBean.setUrlPatterns(Arrays.asList("/myservlet1","/myservlet2"));
// Filter需要过滤的请求(追加一个)
//filterRegistrationBean.addUrlPatterns("/myservlet3");
// doFilter 在第1个,过滤器可以有多个,这里设置先后顺序
filterRegistrationBean.setOrder(1);
// 还可以设置其他属性
// ...
return filterRegistrationBean;
}
}
2. 使用@WebFilter来注册
// 设置filter的name和filter要过滤的请求
@WebFilter(
filterName = "myfilter1"
,urlPatterns = {"/myservlet","/myservlet3"})
// 设置优先级
@Order(1)
public class MyFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter start");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("filter end");
}
@Override
public void destroy() {
}
}
三、注册Listener
Listener存在多种,这里只使用某个作为例子
(具体有哪些,可以参照ServletListenerRegistrationBean类)
1. 使用ServletListenerRegistrationBean来注册
/**
* ServletContextListener监听器
* 监听servletContext对象的创建以及销毁
*/
public class MyListener implements ServletContextListener {
// servletContext对象创建时
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("web app start");
}
// servletContext对象销毁时
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("web app end");
}
}
@Configuration
public class MyListenerConfig {
@Bean
public ServletListenerRegistrationBean listenerRegistrationBean(){
// 创建ServletListenerRegistrationBean注册自定义的Listener
ServletListenerRegistrationBean registrationBean
= new ServletListenerRegistrationBean(new MyListener());
return registrationBean;
}
}
2. 使用@WebListener来注册
@WebListener
public class MyListener1 implements ServletContextListener {
// servletContext对象创建时
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("web app start1");
}
// servletContext对象销毁时
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("web app end2");
}
}
// 启动类上追加注解
@ServletComponentScan
@SpringBootApplication
public class SpringBoot05WebCurdProApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot05WebCurdProApplication.class, args);
}
}
四、Listener的类型有哪些
public class ServletListenerRegistrationBean<T extends EventListener> extends RegistrationBean {
private static final Set<Class<?>> SUPPORTED_TYPES;
static {
Set<Class<?>> types = new HashSet<>();
types.add(ServletContextAttributeListener.class);
types.add(ServletRequestListener.class);
types.add(ServletRequestAttributeListener.class);
types.add(HttpSessionAttributeListener.class);
types.add(HttpSessionListener.class);
types.add(ServletContextListener.class);
SUPPORTED_TYPES = Collections.unmodifiableSet(types);
}
}