美文网首页
JavaWeb之 监听器

JavaWeb之 监听器

作者: 测试员 | 来源:发表于2019-09-27 21:44 被阅读0次

JavaWeb中八大监听器

域对象监听器

1.ServletContextListener
2.ServletContextAttributeListener
3.HttpSessionListener
4.HttpSessioniAttributeListener
5.ServletRequestListener
6.ServletRequestAttributeListener

javaBean监听器

7.HttpSessionBindingListener
8.HttpSessionActivationListener

功能说明

监听ServletContext

生死监听(生命周期监听):
    ServletContextListener
        出生后调用   void contextInitialized(ServletContextEvent event)
        去世前调用   void contextDestroyed(ServletContextEvent event)
属性监听:
    ServletContextAttributeListener
        添加属性时调用 void attributeAdded(ServletContextAttributeEvent bindingevent)
        替换属性时调用 void attributeReplaced(ServletContextAttributeEvent bindingevent)
        删除属性时调用 void attributeRemoved(ServletContextAttributeEvent bindingevent)

监听HttpSession

生死监听(生命周期监听):
    HttpSessionListener
        出生后调用   void sessionCreated(HttpSessionEvent event)
        去世前调用   void sessionDestroyed(HttpSessionEvent event)
    HttpSessioniAttributeListener
        添加属性时调用 void attributeAdded(HttpSessionBindingEvent bindingevent)
        替换属性时调用 void attributeReplaced(HttpSessionBindingEvent bindingevent)
        删除属性时调用 void attributeRemoved(HttpSessionBindingEvent bindingevent)

监听ServletRequest

生死监听(生命周期监听):
    ServletRequestListener
        出生后调用   void requestInitialized(ServletRequestEvent event)
        去世前调用   void requestDestroyed(ServletRequestEvent event)
属性监听
    ServletRequestAttributeListener
        添加属性时调用 void attributeAdded(ServletRequestAttributeEvent bindingevent)
        替换属性时调用 void attributeReplaced(ServletRequestAttributeEvent bindingevent)
        删除属性时调用 void attributeRemoved(ServletRequestAttributeEvent bindingevent)

监听JavaBean在session中的存取

**作用:当类实现了该接口后,可以感知本类对象添加到session中,以及感知从session中移除,无需配置web.xml或者添加@WebListener **

HttpSessionBindingListener
    bean对象被添加到Session中时调用   void valueBound(HttpSessionBindingEvent event)
    bean对象被从Session中移除时调用   void valueUnbound(HttpSessionBindingEvent event)

监听JavaBean的钝化活化

作用:当实体类实现了HttpSessionActivationListener接口和Serializable接口,就可以监听Session的钝化与活化的状态了

HttpSessionActivationListener
    活化后调用   void sessionWillPassivate(HttpSessionEvent event)
    钝化后调用   void sessionDidActivate(HttpSessionEvent event)

域对象监听器实现步骤

1.创建类实现对应的6大Listener接口
2.要么添加@WebListener标签,要么在web.xml中添加监听器配置

    <listener>
        <listener-class>listener类的全类名</listener-class>
    </listener>

3.这就完成了

什么是钝化活性化

钝化session,就是把session通过序列化的方式保存到硬盘文件中
活化就是把硬盘文件中的session在反序列化回内存
当session被Tomcat钝化时,session中存储的对象也被钝化,
当session被活化时,也会把session中存储的对象活化。
【本来用需要提醒的】这是将对象保存到本地,在IO中有说过,凡是都能保存到本地的对象,一定要实现序列化标记接口Serializable

如何钝化活化

tomcat-8.5.31\conf\context.xml文件中 添加如下配置 就会在
tomcat-8.5.31\work\当前项目\mysession\下生成钝化文件

<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
    <Store className="org.apache.catalina.session.FileStore" directory="mysession"/>
</Manager>

案例一【ServletContext的生命周期监听】

由于差异不是很大,所以只用一个域对象的监听器举例ServletContextListener

监听器代码

package com.yuan.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;


/**
 * servletContext生死监听
 * @author Yuan-9826
 *
 * 这个监听器用来存放一些 初始化代码的
 */
@WebListener
public class AListener implements ServletContextListener{

    /**
     * servletContext生之后运行 【最有用的监听器】
     * @param sce
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("这个监听器出生了..........");
    }

    /**
     * servletContext死之前运行
     * @param sce
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("这个监听器去世了..........");

    }
}

jsp代码

无---因为这里使用的是Tomcatweb服务器,启动时ServletContext域对象自动创建

启动效果

关闭效果

案例二【ServletContext的属性监听】

监听器代码

package com.yuan.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;

@WebListener()
public class BListener implements ServletContextAttributeListener {

    /**
     *添加属性时调用
     * @param event
     */
    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("您添加了一个名为 "+event.getName()+" ,值为 "+event.getValue()+"的属性");
    }

    /**
     *替换属性时调用
     * @param event
     */
    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {

    }

    /**
     *删除属性时调用
     * @param event
     */
    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {

    }
}

jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>监听器测试</h1>
<%
    request.setAttribute("request_name", "request_value");
    session.setAttribute("session_name", "session_value");
    application.setAttribute("application_name", "application_value");
%>
</body>
</html>

效果

要访问一下JSP页面 不然无法设置属性


案例三【javaBean监听】

监听器代码

package com.yuan.domain;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

/**
 * 实体类
 * @author Yuan-9826
 */
public class Person implements HttpSessionBindingListener {

    private String name;
    private Integer id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("我被添加到Session中啦");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("我被Session给移除掉啦");

    }
}

jsp代码1 添加person

<%@ page import="com.yuan.domain.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>添加person</h1>
<%
    final Person person = new Person();
    person.setId(01);
    person.setName("Yuan");
    session.setAttribute("session_name", person);
%>
</body>
</html>

jsp代码2 删除person

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>删除person</h1>
<%
    session.removeAttribute("session_name");
%>
</body>
</html>

效果

案例四【session钝化与活化监听】

监听器代码

package com.yuan.domain;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;

public class User implements Serializable, HttpSessionActivationListener {

    private String name;
    private Integer id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }

    /**
     * 活化后调用
     * @param se
     */
    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("啊 我被活化了");
    }

    /**
     * 钝化后调用
     * @param se
     */
    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println("啊 我被钝化了");

    }
}

jsp代码1

<%@ page import="com.yuan.domain.Person" %>
<%@ page import="com.yuan.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>添加user</h1>
<%
    final User user = new User();
    user.setId(01);
    user.setName("Yuan");
    session.setAttribute("session_user", user);
%>
</body>
</html>

jsp代码2

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>查看person</h1>
<h3>${session.session_name}</h3>
</body>
</html>

访问之后 稍等一分钟,因为配置了最短钝化时间是1分钟

效果

成功钝化

成功监听到

再次访问showUser.jsp

成功活化

相关文章

网友评论

      本文标题:JavaWeb之 监听器

      本文链接:https://www.haomeiwen.com/subject/stoauctx.html