Servlet3.0新特性:动态控制 3 大组件注册,太方便了!!!
Servlet3.0 对于 ServletContext 进行了功能增强,可以对 Servlet、Filter 及 Listener 进行动态注册。所谓动态注册是指,Web 应用在运行过程中通过代码对 Servlet、Filter 或 Listener 进行注册。
为了系统安全考虑,这个动态注册是有限制的,只能在应用启动时进行,而不能在应用运行过程中的进行注册。这个应用启动时间点,可以通过 servletContextListener 监听器来把握。
1、动态注册 Servlet
比较简单,直接上代码,先自定义一个 servlet,这个 servlet 的功能比较简单,将 servlet 的参数信息输出了。
package com.javacode2018.springboot.lesson003;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//将servlet的参数信息输出
resp.setContentType("text/html;charset=UTF-8");
Enumeration names = this.getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = this.getInitParameter(name);
resp.getWriter().write(String.format("%s:%s
", name, value));
}
}
}
下面我们自定义一个ServletContextListener
,在其contextInitialized
方法中通过硬编码的方式注册上面自定义的MyServlet
,为了演示效果,这里我们通过硬编码的方式给注册的 Servlet 设置了 2 个属性,稍后访问 servle 的时候,会被输出到客户端。
package com.javacode2018.springboot.lesson003;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.ServletRegistration;
import jakarta.servlet.annotation.WebListener;
//@0:本案例中没有在web.xml中配置这个Listener,所以需要在MyServletContextListener上加上@WebListener注解,采用注解的方式来注册Listener
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//@1、获取ServletContext
ServletContext sc = sce.getServletContext();
//@2、调用sc.addServlet注册自定义的Servlet,返回一个ServletRegistration.Dynamic对象
ServletRegistration.Dynamic myServlet = sc.addServlet("myServlet", MyServlet.class);
//@3、通过ServletRegistration.Dynamic对象可以设置servlet所有配置信息,这里我们只演示了2个方法,还有很多方法大家可以去试试
myServlet.addMapping("/myServlet");
myServlet.setInitParameter("name", "路人");
myServlet.setInitParameter("lesson", "SpringBoot系列!");
}
}
发布到 tomcat,然后访问下面地址
http://localhost:8080/myServlet
输出
2、动态注册 Filter
过程和动态注册 Servlet 类似,咱们先指定一个 Filter,代码如下,这个 Filter 需要拦截所有请求,会将每个请求的耗时输出到控制台。
package com.javacode2018.springboot.lesson003;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CostTimeFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
String url = req.getRequestURL().toString();
long st = System.currentTimeMillis();
try {
super.doFilter(req, res, chain);
} finally {
long costTime = System.currentTimeMillis() - st;
System.out.println(String.format("url:[%s],耗时(ms):[%s]", url, costTime));
}
}
}
注册的代码和上注册 MyServlet 的代码放在一起,在自定义的MyServletContextListener#contextInitialized
方法中追加下面代码。
//@4、注册自定义的Filter,返回一个FilterRegistration.Dynamic对象
FilterRegistration.Dynamic costTimeFilter = sc.addFilter("costTimeFilter", CostTimeFilter.class);
//@5、通过FilterRegistration.Dynamic对象可以设置Filter的所有配置信息
costTimeFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
重启 tomcat,再次访问http://localhost:8080/myServlet
,tomcat 控制台输出
url:[http://localhost:8080/myServlet],耗时(ms):[1]
3、动态注册 Listener
这里以 ServletRequestListener 为例来说明,其他的 Listener 注册方式一样。
先自定义一个 Listener,如下:
package com.javacode2018.springboot.lesson003;
import jakarta.servlet.ServletRequestEvent;
import jakarta.servlet.ServletRequestListener;
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("MyServletRequestListener注册成功!");
}
}
注册 Lisenter 代码比较简单,如下,就一行代码,将其追加在MyServletContextListener#contextInitialized
方法中
sc.addListener(MyServletRequestListener.class);
重启 tomcat,再次访问http://localhost:8080/myServlet
,tomcat 控制台输出
MyServletRequestListener注册成功!
4、源码
https://gitee.com/javacode2018/springboot-series
5、领取《Spring 系列高清 pdf》
获取方式,点击下面链接,发送:spring
6、领取《计算机必读电子书》
计算机必读电子书,进行了详细的分类,自己整理的,绝不是在网上那种打包下载的,而是自己需要学到某个方向的时候去网上挨个找的,最后汇总而成,这部分我是会不断把它完善的,当成自己的小电子书库,不多,但贵在精。
获取方式,扫码发送:计算机