欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot注册Servlet的三种方法详解

程序员文章站 2023-12-04 15:03:04
本文栈长教你如何在 spring boot 注册 servlet、filter、listener。 一、spring boot 注册 spring boot 提供了 s...

本文栈长教你如何在 spring boot 注册 servlet、filter、listener。

一、spring boot 注册

spring boot 提供了 servletregistrationbean, filterregistrationbean, servletlistenerregistrationbean 三个类分别用来注册 servlet, filter, listener,下面是 servlet 的示例代码。

import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import java.io.ioexception;

/**
 * @author java技术栈
 */
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", "javastack");
  servletregistrationbean.addinitparameter("sex", "man");
  return servletregistrationbean;
}

二、组件扫描注册

servlet 3.0 之前,servlet、filter、listener 这些组件都需要在 web.xml 中进行配置,3.0 之后开始不再需要 web.xml 这个配置文件了,所有的组件都可以通过代码配置或者注解来达到目的。

如下图所示,截图自 servlet 3.1。

SpringBoot注册Servlet的三种方法详解

servlet 3.0 开始提供了这 3 个注解来代替。

@webservlet => 代替 servlet 配置

@webfilter => 代替 filter 配置

@weblistener => 代替 listener 配置

配置 servlet 示例

import javax.servlet.annotation.webinitparam;
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 java技术栈
 */
@webservlet(name = "javaservlet", urlpatterns = "/javastack.cn", asyncsupported = true,
    initparams = {
    @webinitparam(name = "name", value = "javastack"),
    @webinitparam(name = "sex", value = "man") })
public class javaservlet 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);
  }

}

配置 filter 示例

/**
 * @author java技术栈
 */
@webfilter(filtername = "javafilter", urlpatterns = "/*", initparams = {
    @webinitparam(name = "name", value = "javastack"),
    @webinitparam(name = "code", value = "123456") })
public class javafilter implements filter {

  @override
  public void init(filterconfig filterconfig) throws servletexception {
    system.out.println("java filter init.");
    string name = filterconfig.getinitparameter("name");
    string code = filterconfig.getinitparameter("code");
    system.out.println("name is " + name);
    system.out.println("code is " + code);
  }

  @override
  public void dofilter(servletrequest request, servletresponse response, filterchain chain)
      throws ioexception, servletexception {
    system.out.println("java filter processing.");
    chain.dofilter(request, response);
  }

  @override
  public void destroy() {
    system.out.println("java filter destroy.");
  }

}

listener 配置方式类似,上面的示例代码一看就懂,这里不再详述。

需要注意的是,为了安全考虑,内嵌服务器不会直接执行 servlet 3.0 里面的 javax.servlet.servletcontainerinitializer 接口,或者 spring 中的 org.springframework.web.webapplicationinitializer 接口,否则会导致终止 spring boot 应用。

所以,如果使用的是 spring boot 内嵌服务器,需要在配置类上面添加额外的 @servletcomponentscan 注解来开启 servlet 组件扫描功能,如果使用的是独立的服务器,则不需要添加,会使用服务器内部的自动发现机制。

三、动态注册

如果你想在 spring boot 中完成 servlet、filter、listener 的初始化操作,你需要在 spring 中实现下面这个接口,并注册为一个 bean。

org.springframework.boot.web.servlet.servletcontextinitializer

servletcontext 提供了几个动态注册的方法,如下所示。

SpringBoot注册Servlet的三种方法详解

以下为动态添加 servlet 示例代码。

import javax.servlet.annotation.webinitparam;
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 java技术栈
 */
@webservlet(name = "javaservlet", urlpatterns = "/javastack.cn", asyncsupported = true,
    initparams = {
    @webinitparam(name = "name", value = "javastack"),
    @webinitparam(name = "sex", value = "man") })
public class javaservlet 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);
  }

}

import cn.javastack.springbootbestpractice.servlet.initservlet;
import org.springframework.boot.web.servlet.servletcontextinitializer;
import org.springframework.stereotype.component;

import javax.servlet.servletcontext;
import javax.servlet.servletregistration;

/**
 * @author java技术栈
 */
@component
public class servletconfig implements servletcontextinitializer {

  @override
  public void onstartup(servletcontext servletcontext) {
    servletregistration initservlet = servletcontext
        .addservlet("initservlet", initservlet.class);
    initservlet.addmapping("/initservlet");
    initservlet.setinitparameter("name", "javastack");
    initservlet.setinitparameter("sex", "man");
  }

}

总结

本文介绍了在 spring boot 下的 3 种注册 servlet、filter、listener 的方式,大家灵活运用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。