SpringBoot注册Servlet的三种方法详解
本文栈长教你如何在 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。
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 提供了几个动态注册的方法,如下所示。
以下为动态添加 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 的方式,大家灵活运用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: java实现随机抽取奖品工具类