springboot动态注册Web三大组件(注解方式/代码方式)

1. 注解方式注册

(1)注册 Servlet

@WebServlet(name = "customServlet",urlPatterns = {
    
    "/custom"})
public class CustomServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        super.doGet(req, resp);
        System.out.println("自定义servlet # doGet 方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        super.doPost(req, resp);
        System.out.println("自定义servlet # doPost 方法");
    }
}

(2)注册 Filter

@WebFilter(filterName = "CustomFilter" ,urlPatterns = "/*")
public class CustomFilter implements Filter {
    
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        System.out.println("filter 初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
        System.out.println("自定义servlet # doGet 方法");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
    
    
        System.out.println("filter 回收");
    }
}

(3)注册 Listener

servlet2.4规范中提供了8个listener接口,可以将其分为三类,分别如下:

  • 第一类:与servletContext有关的listner接口。包括:ServletContextListener、ServletContextAttributeListener
  • 第二类:与HttpSession有关的Listner接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener;
  • 第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener
    下面实现两个常用的接口:

创建一个类实现ServletRequestListener接口,用于监听ServletRequest对象的创建和销毁,加上注解@WebListener。

@WebListener
public class CustomRequestListener implements ServletRequestListener {
    
    
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
    
    
        System.out.println("ServletRequestListener 销毁");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
    
    
        System.out.println("ServletRequestListener 初始化");
    }
}

创建一个类实现ServletContextListener接口,监听ServletContext的创建和销毁。实际上是监听 Web 应用的生命周期,加上注解@WebListener。

@WebListener
public class CustomContextListener implements ServletContextListener {
    
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
    
    
        System.out.println("ServletContextListener 初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    
    
        System.out.println("ServletContextListener 销毁");
    }
}

2. springboot api 代码方式注册

复用以上四个类,将注解去掉

@Configuration
public class CustomRegistry {
    
    

    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
    
    
//        ServletRegistrationBean<CustomServlet> customServletServletRegistrationBean = new ServletRegistrationBean<>(new CustomServlet(),"/custom");
        ServletRegistrationBean<CustomServlet> customServletServletRegistrationBean = new ServletRegistrationBean<>();
        customServletServletRegistrationBean.setServlet(new CustomServlet());
        customServletServletRegistrationBean.setUrlMappings(Arrays.asList("/custom"));
        return customServletServletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
    
    
//        FilterRegistrationBean<CustomFilter> filterRegistrationBean = new FilterRegistrationBean(new CustomFilter());
        FilterRegistrationBean<CustomFilter> filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new CustomFilter());
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
// 优先级,越低越优先
        filterRegistrationBean.setOrder(6);    
        return filterRegistrationBean;
    }

    @Bean
    public ServletListenerRegistrationBean customRequestListener() {
    
    
//        ServletListenerRegistrationBean<CustomRequestListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>(new CustomRequestListener());
        ServletListenerRegistrationBean<CustomRequestListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
        listenerRegistrationBean.setListener(new CustomRequestListener());
        return listenerRegistrationBean;
    }

    @Bean
    public ServletListenerRegistrationBean customContextListener() {
    
    
//        ServletListenerRegistrationBean<CustomContextListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>(new CustomContextListener());
        ServletListenerRegistrationBean<CustomContextListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
        listenerRegistrationBean.setListener(new CustomContextListener());
        return listenerRegistrationBean;
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_41725792/article/details/110878778
今日推荐