一般情况下,使用Spring、Spring MVC这些框架之后,基本上就告别Servlet、Filter以及Listener了,但是有时在整合一些第三方框架时,可能还是不得不使用Servlet,比如在整合某报表插件时就需要使用Servlet。Spring Boot中对于整合这些基本的Web组件也提供了很好的支持。

springboot 整合Servlet、Filter和Listener_java

在一个Spring Boot Web项目中添加如下三个组件:

MyServlet.java

package com.shrimpking.component;

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;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/6/5 12:24
 */
@WebServlet("/hello")
public class MyServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        System.out.println("name>>>" + req.getParameter("name"));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        doGet(req,resp);
    }
}

MyFilter.java

package com.shrimpking.component;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/6/5 12:26
 */
@WebFilter("/*")
public class MyFilter implements Filter
{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
        System.out.println("MyFilter>>>init ");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
    {
        System.out.println("MyFilter>>>doFilter");
        //执行下一个链条
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy()
    {
        System.out.println("MyFilter>>>destroy");
    }
}

MyListener.java

package com.shrimpking.component;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/6/5 12:29
 */
@WebListener
public class MyListener implements ServletRequestListener
{
    @Override
    public void requestInitialized(ServletRequestEvent sre)
    {
        System.out.println("MyListener>>>Initialized");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre)
    {
        System.out.println("MyListener>>Destroyed");
    }
}

代码解释:

• 这里定义了三个基本的组件,分别使用@WebServlet、@WebFilter和@WebListener三个注解进行标记。

• 这里以ServletRequestListener为例,但是对于其他的Listener,例如HttpSessionListener、ServletContextListener等也是支持的。

在项目入口类上添加@ServletComponentScan注解,实现对Servlet、Filter以及Listener的扫描,代码如下:

package com.shrimpking;

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

@SpringBootApplication
@ServletComponentScan
public class Springboot29ServeltfilterlistenerApplication
{

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

}

最后,启动项目,在浏览器中输入“http://localhost:8099/hello?name=tom”,可以看到相关日志,如图

springboot 整合Servlet、Filter和Listener_servlet_02

 

springboot 整合Servlet、Filter和Listener_ide_03