SpringBoot之集成Servlet、Filter、Listener

Servlet

方式一:@WebServlet

首先创建一个MyServlet其继承了HttpServlet类并标记了一个@WebServlet(urlPatterns="/hello")注解,用来使当前类能够被SpringBoot扫描到,其urlPatterns="/servlet/hello"指明了该servlet将接收/servlet/hello的请求。

package com.baiyang.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = "/servlet/hello")
public class MyServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello MyServlet!");
        PrintWriter writer = resp.getWriter();
        writer.println("hello servlet!");
    }
}

然后是SpringBoot启动类:

package com.baiyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan(basePackages = {"com.baiyang"})
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }

}

启动类上标记了@ServletComponentScan(basePackages={"com.baiyang"}),其指明了开启Servlet组件扫描并且指明了扫描路径。
直接启动,即可通过访问localhost:8080/servlet/hello来请求到MyServlet

方式二: ServletRegistrationBean

如果不使用@WebServlet注解的方式,那么还可以通过注入ServletRegistrationBean的方式来配置Servlet。
和方式一一样准备MyServlet类,和方式一的唯一区别就只是没有标注@WebServlet注解:

package com.baiyang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello MyServlet!");
        PrintWriter writer = resp.getWriter();
        writer.println("hello servlet!");
    }
}

然后在启动类中通过@Bean加入ServletRegistrationBean的注入:

package com.baiyang;

import com.baiyang.servlet.MyServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }

    @Bean
    public ServletRegistrationBean<MyServlet> getServletBean(){
        ServletRegistrationBean<MyServlet> servletServletRegistrationBean = new ServletRegistrationBean<>(new MyServlet(),"/servlet/hello");
        servletServletRegistrationBean.setLoadOnStartup(1);
        return servletServletRegistrationBean;
    }

}

上面的getServletBean()方法,注入了ServletRegistrationBean<MyServlet>,同时指明了映射url为/servlet/hello


Filter

方式一:@WebFilter

首先创建一个MyFilter其继承了HttpFilter类并标记了一个@WebFilter(urlPatterns = "/*")注解,用来使当前类能够被SpringBoot扫描到,其urlPatterns="/*"指明了当前Filter将过滤所有请求。

package com.baiyang.filter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(urlPatterns = "/*")
public class MyFilter extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("hello,MyFilter!");
        chain.doFilter(request, response);
    }
}

然后是SpringBoot启动类:

package com.baiyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan(basePackages = {"com.baiyang"})
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }

}

启动类上标记了@ServletComponentScan(basePackages={"com.baiyang"}),其指明了开启Servlet组件扫描并且指明了扫描路径。
直接启动,随后所有请求都将被该过滤器过滤。

方式二:FilterRegistrationBean

如果不使用@WebFilter注解的方式,那么还可以通过注入FilterRegistrationBean的方式来配置Filter。
和方式一一样准备MyFilter类,和方式一的唯一区别就只是没有标注@WebFilter注解:

package com.baiyang.filter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyFilter extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("hello,MyFilter!");
        chain.doFilter(request, response);
    }
}

然后在启动类中通过@Bean加入FilterRegistrationBean的注入:

package com.baiyang;

import com.baiyang.servlet.MyServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }

    @Bean
    public FilterRegistrationBean<MyFilter> getFilterBean(){
        FilterRegistrationBean<MyFilter> servletServletRegistrationBean = new FilterRegistrationBean<>(new MyFilter());
		//设置过滤器过滤url
        ArrayList<String> urls = new ArrayList<>();
        urls.add("/*");
        servletServletRegistrationBean.setUrlPatterns(urls);
        servletServletRegistrationBean.setOrder(1); //设置过滤器执行顺序
        return servletServletRegistrationBean;
    }

}

上面的getFilterBean()方法,注入了FilterRegistrationBean<MyFilter>,同时指明了映射路径/*,其将过滤所有请求。


Listener

方式一:@WebListener

首先创建一个MyListener其实现了ServletContextListener类,指明其是一个servlet容器监听器,当容器启动时将执行contextInitialized()方法,当容器关闭时将执行contextDestroyed()方法;并标记了一个@WebListener注解,用来使当前类能够被SpringBoot扫描到。

package com.baiyang.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContextListener#contextInitialized---");
    }

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

然后是SpringBoot启动类:

package com.baiyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan(basePackages = {"com.baiyang"})
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }

}

启动类上标记了@ServletComponentScan(basePackages={"com.baiyang"}),其指明了开启Servlet组件扫描并且指明了扫描路径。
容器在启动的过程中将执行该容器监听器。

方式二:ServletListenerRegistrationBean

如果不使用@WebListener注解的方式,那么还可以通过注入ServletListenerRegistrationBean的方式来配置Listener。
和方式一一样准备MyListener类,和方式一的唯一区别就只是没有标注@WebListener注解:

package com.baiyang.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContextListener#contextInitialized---");
    }

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

然后在启动类中通过@Bean加入ServletListenerRegistrationBean的注入:

package com.baiyang;

import com.baiyang.listener.MyListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }

    @Bean
    public ServletListenerRegistrationBean<MyListener> getListenerBean() {
        ServletListenerRegistrationBean<MyListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>(new MyListener());
        listenerRegistrationBean.setEnabled(true);//启用状态
        listenerRegistrationBean.setOrder(1);//设置执行顺序
        return listenerRegistrationBean;
    }

}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐