Servlet3.0新特性:动态控制 3 大组件注册,太方便了!!!

共 6654字,需浏览 14分钟

 ·

2021-04-19 11:27


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、领取《计算机必读电子书》

计算机必读电子书,进行了详细的分类,自己整理的,绝不是在网上那种打包下载的,而是自己需要学到某个方向的时候去网上挨个找的,最后汇总而成,这部分我是会不断把它完善的,当成自己的小电子书库,不多,但贵在精。

获取方式,扫码发送:计算机

浏览 10
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报