javaWeb监听器

本文详细介绍了JavaWeb中的监听器,包括监听器的概念、组件、分类和开发步骤。内容涵盖监听ServletContext、Session和Request域对象的创建、销毁及属性变更。同时,对一类、二类和三类监听器进行了深入解析,提供了具体的实现和测试示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

javaWEB监听器

概述

Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
监听器可以监听就是在 application,session,request 三个对象创建、销毁或者往其中添加修改删除属性时自动
执行代码的功能组件。

监听器的组件:

监听器可以大致分为四个组件(方便理解)

事件源:事件发生的源头
监听器:监听事件发生
绑定:将监听器绑定到事件源
事件:能够触发监听器的事

监听器分类

Servlet规范中提供了8个监听器
按功能进行划分将其分成三类,如下:

一类:监听三个域对象的创建和销毁的监听器
二类:监听三个域对象的属性变更的监听器。(属性添加、属性移除、属性替换)
三类:监听HttpSession对象中的JavaBean的状态的改变。(绑定、解除绑定、钝化、活化)

监听器分类监听器名称作用
ServletContext监听ServletContextListener监听ServletContext对象的创建和销毁
ServletContextAttributeListener监听ServletContext对象中属性的增删改
Session监听HttpSessionListener监听Session对象的创建和销毁
HttpSessionAttributeListener监听Session对象中属性的增删改
HttpSessionBindingListener监听对象与Session的绑定与解除
HttpSessionActivationListener监听Session的激活
Request监听ServletRequestListener监听Request对象的创建和销毁
ServletRequestAttributeListener监听Request对象中属性的增删改

监听器的开发步骤

1.自定义类实现一类监听器
2.重写监听器中的方法
3.配置xml配置文件或注解配置

配置方式:

/**
 * 监听器开发步骤
 */
public class FirstListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) 
{
        /**
         * 监听ServletContext域的初始化,随着服务器的启动
         */
        System.out.println("ServletContext初始化");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        //监听ServletContext域的销毁,随着服务器的关闭
        System.out.println("ServletContext销毁");
    }
}

配置xml文件:

<listener>
    <listener-class>com.gx.listener.FirstListener</listener-class>
</listener>

注解方式:

@WebListener,加了该注解默认配置了监听器

/**
 * 监听器开发步骤
 */
@WebListener
public class FirstListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        /**
         * 监听ServletContext域的初始化,随着服务器的启动
         */
        System.out.println("ServletContext初始化");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        /**
         * 监听ServletContext域的销毁,随着服务器的关闭
         */
        System.out.println("ServletContext销毁");
    }
}

一类监听器

监听三个域对象(ServletContext、Session、Request)的创建与销毁

监听ServletContext域对象

实现ServletContextListener接口并覆盖方法

  1. 监听服务器启动的时候创建ServletContext对象时

  2. 监听服务器关闭的时候ServletContext对象被销毁掉

/**
 * 监听ServletContext
 */
@WebListener
public class TestServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        /**
         * 监听ServletContext域的初始化,随着服务器的启动
         */
        System.out.println("ServletContext初始化");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        /**
         * 监听ServletContext域的销毁,随着服务器的关闭
         */
        System.out.println("ServletContext销毁");
    }
}

监听Session域对象

实现HttpSessionListener接口并覆盖方法

  1. 监听服务器端第一次调用getSession方法时
  2. 监听session过期或调用了invalidate方法
/**
 * 监听HttpSession
 */
@WebListener
public class TestHttpSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("Session创建");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("Session销毁");
    }
}

Servlet测试

@WebServlet(name = "TestSessionServlet", value = "/tss")
public class TestSessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建Session对象
        HttpSession session = request.getSession();
        System.out.println(session.getId());
        //销毁Session对象
        session.invalidate();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

监听Request域对象

实现ServletRequestListener接口并覆盖方法

  1. 监听客户的向服务器发送了一次请求而创建这一个request对象
  2. 监听当服务器为这次请求作出了响应之后的request对象销毁
/**
 * 监听ServletRequest
 */
@WebListener
public class TestServletRequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("Request对象创建");
    }
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent){
        System.out.println("Request对象销毁");
    }
}

Servlet测试

@WebServlet(name = "TestRequestServlet", value = "/trs")
public class TestRequestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

二类监听器

监听三个域对象的属性变更的监听器(属性添加、属性移除、属性替换)

监听ServletContext属性

实现ServletContextAttributeListener接口并覆盖方法

  • 监听ServletContext域中的属性变更
/**
 * 监听ServletContext域中的属性变更
 */
@WebListener
public class TestServletContextAttributeListener implements 
ServletContextAttributeListener {
    /**
     * 监听ServletContext域对象中属性的添加
     */
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("ServletContext Added");
    }
    /**
     * 监听ServletContext域对象中属性的移除
     */
    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("ServletContext Removed");
    }
    /**
     * 监听ServletContext域对象中属性的替换
     */
    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("ServletContext Replaced");
    }
}

servlet:测试

@WebServlet(name = "TestServletContextAttributeServlet", value = "/tscas")
public class TestServletContextAttributeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        //添加
        servletContext.setAttribute("name", "ziph");
        //替换
        servletContext.setAttribute("name", "join");
        //移除
        servletContext.removeAttribute("name");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

监听Session属性

实现HttpSessionAttributeListener接口并覆盖方法

  1. 监听HttpSession域中的属性变更
/**
 * 监听Session域中的属性变更
 */
@WebListener
public class TestHttpSessionAttributeListener implements 
HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("Session Added");
    }
    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("Session Removed");
    }
    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("Session Replaced");
    }
}

Servlet测试

/**
 * 注意:销毁和移除都能触发监听器的attributeRemoved方法
 */
@WebServlet(name = "TestSessionAttributeServlet", value = "/tsas")
public class TestSessionAttributeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        StringBuffer buffer = new StringBuffer();
        buffer.append("ziph");
        //添加
        session.setAttribute("name", buffer);
        buffer.append(" is very good!");
        //替换
        session.setAttribute("name", buffer);
        //移除
        session.removeAttribute("name");
        //销毁
        session.invalidate();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

监听Request属性

  • 实现ServletRequestAttributeListener接口并覆盖方法
  • 监听ServletRequest中的属性变更
/**
 * 监听Request域中的属性变更
 */
@WebListener
public class TestServletRequestAttributeListener implements 
ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("Request Added");
    }
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("Request Removed");
    }
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("Request Replaced");
    }
}

Servlet测试

@WebServlet(name = "TestServletRequestAttributeServlet", value = "/tsras")
public class TestServletRequestAttributeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        StringBuffer buffer = new StringBuffer();
        buffer.append("ziph");
        //添加
        request.setAttribute("name", buffer);
        buffer.append("marry");
        //替换
        request.setAttribute("name", buffer);
        //移除
        request.removeAttribute("name");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

三类监听器

HttpSessionBindingListener监听HttpSession中的JavaBean的状态(绑定和解除绑定状态)
注意:该监听器不需要xml配置和注解配置

/**
 * 三类监听器HttpSessionBingingListener
 */
public class User implements HttpSessionBindingListener {
    private int id;
    private String username;
    private String password;
    public User() {
    }
    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) 
{
        System.out.println("User对象绑定");
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent 
httpSessionBindingEvent) {
System.out.println("User对象解绑");
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password\='" + password + '\'' +
                '}';
    }
}

Servlet测试

@WebServlet(name = "TestHttpSessionBingingListenerServlet", value = "/thsbls")
public class TestHttpSessionBingingListenerServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        //绑定
        session.setAttribute("user", new User(1, "ziph", "123456"));
        //解绑
        session.removeAttribute("user");
        //销毁也是解绑的一种
//        session.invalidate();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值