servlet · 2019-09-21 0

JavaWeb 的监听器(Listener)

一、监听器

JavaWeb的监听器是监听:

1.ServletRequest(请求对象)
2.ServletContext(代表当前整个web应用)
3.HttpSession对象(session对象)

二、监听器分类

JavaWeb 有8个监听器,分为三大类:

1.生命周期监听器(ServletRequestListener、ServletContextListener、HttpSessionListener)

ServletRequestListener:对于 ServletRequest 对象,发送请求创建对象,请求结束销毁
ServletContextListener:对于 ServletContext 对象,项目加载进服务器创建对象,项目卸载销毁
HttpSessionListener:对于 HttpSession 对象,新会话进来的时候创建对象,session 失效(强制失效,超时)销毁

2.属性监听器(ServletRequestAttributeListener、ServletContextAttributeListener、ServletContextAttributeListener)

3.session固有监听器(HttpSessionActivationListener、HttpSessionBindingListener)

HttpSessionActivationListener:监听 session 活化钝化。钝化:服务器关闭时,保存在 session 中的对象存放在本地文件;活化:服务器启动时,保存 session 的本地文件的对象,读到内存
HttpSessionBindingListener:监听一个对象是否绑定到 session 中(保存到 sesison 中)。绑定:保存在 session 中;解绑:session 中移除就是解绑

三、生命周期监听器和属性监听器的使用

1.maven 依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

2.实现接口

实现 ServletRequestListener 接口,监听 ServletRequest 对象的创建、销毁

@WebListener
public class MyServletRequestListener implements ServletRequestListener {

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("request对象初始化");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("request对象销毁");
    }
}

实现 ServletRequestAttributeListener 接口,监听 ServletRequest 对象的属性的增加、移除、替换

@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {

    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        String key = srae.getName();
        Object value = srae.getValue();
        System.out.println(String.format("request域中增加属性 key: %s value: %s", key, value));
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        String key = srae.getName();
        Object value = srae.getValue();
        System.out.println(String.format("request域中移除属性 key: %s value: %s", key, value));
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        String key = srae.getName();
        // 要修该属性的值,旧值
        Object oldValue = srae.getValue();
        // 修该属性后的值,旧值
        Object newValue = srae.getServletRequest().getAttribute(key);
        System.out.println(String.format("request域中替换属性 key: %s oldValue: %s newValue: %s", key, oldValue, newValue));
    }
}

3.测试servlet

对 ServletRequest 对象进行属性的增加、移除、替换

@WebServlet(name = "HelloServlet", urlPatterns = {"/hello"})
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet Begin");

        request.setAttribute("user", "郭富城");
        request.setAttribute("talk", "左手画个龙");
        request.setAttribute("talk", "右手画个彩虹");
        request.removeAttribute("talk");

        response.getWriter().write("success");

        System.out.println("HelloServlet End");
    }
}

4.结果

浏览器访问 http://localhost:8080/hello

request对象初始化
request域中替换属性 key: org.apache.catalina.ASYNC_SUPPORTED oldValue: true newValue: false
HelloServlet Begin
request域中增加属性 key: user value: 郭富城
request域中增加属性 key: talk value: 左手画个龙
request域中替换属性 key: talk oldValue: 左手画个龙 newValue: 右手画个彩虹
request域中移除属性 key: talk value: 右手画个彩虹
HelloServlet End
request对象销毁

四、session固有监听器

1.HttpSessionActivationListener

只需要 JavaBean 实现 HttpSessionActivationListener 接口

/**
 * 监听 Person 对象的钝化和活化
 * 对象和 session 一起活化钝化必须实现序列化接口
 */
public class Person implements HttpSessionActivationListener, Serializable {

    private static final long serialVersionUID = 1L;

    private String username;

    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println(this.username + "和session一起钝化了");
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println(this.username + "和session一起活化了");
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

2.HttpSessionBindingListener

只需要 JavaBean 实现 HttpSessionBindingListener 接口

public class Person implements HttpSessionBindingListener {

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("对象从session中绑定");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("对象从session中解绑");
    }
}