前言

在学习Servlet、Filter、Listener的时候,我们知道可以有2种注册方式,即可以在web.xml文件中注册,也可以利用对应的注解实现注册。那么在SpringBoot中,如果我们还要创建使用Servlet、Filter、Listener这3个类,那么该如何使用呢?

今天壹哥就带大家学习在SpringBoot中如何注册使用Servlet、Filter、Listener这3个类。

一. Servlet,Filter和Listener

1. 概述

我们在Spring Boot中使用内嵌的Servlet容器时,可以通过使用Spring Bean的方式,或者扫描Servlet组件的方式来注册Servlet,Filter及Listener(比如Http Session Listener)。

Spring Boot 为我们提供了ServletRegistrationBean、Filter RegistrationBean、ServletListenerRegistrationBean 三个类分别用来注册 Servlet、Filter、Listener,接下来我就通过代码给大家讲解在SpringBoot中如何注册Servlet。

2. 示例代码

我们可以先看一段示例代码,对用ServletRegistrationBean类来实现Servlet注册有个大致印象。

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

/**
 * @author 一一哥
 */
public class RegisterServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String name = getServletConfig().getInitParameter("name");
        String sex = getServletConfig().getInitParameter("sex");

        resp.getOutputStream().println("name is " + name);
        resp.getOutputStream().println("sex is " + sex);
    }

}

@Bean
public ServletRegistrationBean registerServlet() {
    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
            new RegisterServlet(), "/registerServlet");
    servletRegistrationBean.addInitParameter("name", "一一哥");
    servletRegistrationBean.addInitParameter("sex", "man");
    return servletRegistrationBean;
}

3. Servlet 3.0组件扫描注册

Servlet 3.0 之前,Servlet、Filter、Listener 这些组件都需要在 web.xml 中进行配置,3.0 之后不再需要 web.xml 这个配置文件了,所有的组件都可以通过代码或者注解来达到注册的目的。Servlet 3.0 提供了3个注解来代替:

  • @WebServlet注解代替 Servlet 的xml配置方式;
  • @WebFilter注解代替 Filter 的xml配置;
  • @WebListener注解代替 Listener 的xml配置。

二. Servlet的注册使用

接下来我会带大家学习在Spring Boot中如何进行Servlet的注册使用,本文主要是讲解两种实现方式,即组件注册方式和注解实现方式。

1. 创建Web项目

首先我会创建一个Spring Boot的Web项目,添加Web相关依赖包,具体过程略,请结合之前的章节,并参考下图创建。

springboot的agent方式 springboot singleton_spring boot

2. 组件注册方式

然后我先讲解组件注册的方式,看以这种方式如何实现Servlet的注册使用。

2.1 创建UserServlet类

这里我随便创建一个UserServlet类,继承HttpServlet。

package com.yyg.boot.web;

import lombok.extern.slf4j.Slf4j;

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

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/3/29
 * @Description Description
 */
@Slf4j
public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.warn("第一种Servlet实现方式-->组件注册方式");
        resp.getWriter().write("success");
    }

}

2.2 注册Servlet组件

我们可以在启动类Application或者别的配置类中,利用ServletRegistrationBean来注册刚才创建的UserServlet组件。

package com.yyg.boot;

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

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/3/29
 * @Description Description
 */
@SpringBootApplication
public class ServletApplication {

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

    /**
     *ServletRegistrationBean:注册创建的Servlet类
     */
    @Bean
    public ServletRegistrationBean getServletRegistrationBean(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new UserServlet());
        //url映射路径
        bean.addUrlMappings("/user");
        return bean;
    }

}

2.3 启动程序进行测试

接下来我们启动程序,在浏览器输入如下地址:http:/ /localhost:8080/user

这时候可以看到控制台中成功地输出了如下信息。

springboot的agent方式 springboot singleton_spring boot_02

而且浏览器中也显示了如下内容:

springboot的agent方式 springboot singleton_spring_03

这就说明我们的UserServlet成功的注册完毕。

3. 注解注册方式

然后我再以注解的方式来讲解如何注册使用Servlet。

3.1 创建OrderServlet类

这里我创建一个OrderServlet类,在该类上添加@WebServlet注解。

package com.yyg.boot.web;

import lombok.extern.slf4j.Slf4j;

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;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/3/29
 * @Description 第二种实现Servlet的方式, 通过@WebServlet注解来实现注册.
 */
@Slf4j
@WebServlet(name = "OrderServlet", urlPatterns = "/order")
public class OrderServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.warn("第2种Servlet实现方式-->注解实现方式");
        resp.getWriter().write("success");
    }

}

3.2 添加@ServletComponentScan注解

注意,如果使用的是 Spring Boot 内嵌的Web服务器,需要在配置类上面添加额外的@ServletComponentScan注解来开启 Servlet 组件扫描功能。如果使用的是独立的Tomcat服务器,则不需要添加,它会使用服务器内部的自动发现机制。

本案例中需要添加@ServletComponentScan注解,扫描Servlet类所在的包。

package com.yyg.boot;

import com.yyg.boot.web.UserServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/3/29
 * @Description Description
 */
@SpringBootApplication
@ServletComponentScan(basePackages = "com.yyg.boot.web")
public class ServletApplication {

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

3.3 启动程序进行测试

然后我们启动程序,在浏览器输入如下地址:http:/ /localhost:8080/user

这样就可以看到控制台中成功输出如下信息:

springboot的agent方式 springboot singleton_spring_04

浏览器中也会显示如下内容:

springboot的agent方式 springboot singleton_springboot的agent方式_05

这样,我就用注解的方式注册使用了一个Servlet。