Listener(监听器)

参考资料:https://www.jb51.net/article/93748.htm

JavaWEB中的监听器主要监听JavaWEB中的request、session、ServletContext对象的各种变化。

尽量不要定义全局变量,全局变量数据共享,容易造成线程不安全。

主要监听的任务:

1、监听request、ServletContext 、session对象的创建和销毁

1、新建一个普通java类实现以下接口。

2、在web.xml文件中注册监听器类

ServletRequestListener

//web.xml文件中注册监听器  
<!--注册针对ServletRequest对象进行监听的监听器-->
<listener>
      <description>ServletRequestListener监听器</description>
      <listener-class>com.demo.listener.MyServletRequestListener</listener-class>
</listener>
//MyServletRequestListener类实现了ServletRequestListener接口,因此可以对ServletRequest对象的创建和销毁这两个动作进行监听。 
public class MyServletRequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println(sre.getServletRequest() + "销毁了!!");
        
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println(sre.getServletRequest() + "创建了!!");
    }
}

ServletContextListener

<!-- 注册针对ServletContext对象进行监听的监听器 -->
  <listener>
      <description>ServletContextListener监听器</description>
      <!--实现了ServletContextListener接口的监听器类 -->
      <listener-class>com.demo.listener.MyServletContextListener</listener-class>
  </listener>
//MyServletContextListener类实现了ServletContextListener接口,因此可以对ServletContext对象的创建和销毁这两个动作进行监听。
public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext对象创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext对象销毁");
    }
}

HttpSessionListener

//web.xml文件中注册监听器
<!--注册针对HttpSession对象进行监听的监听器-->
<listener>
      <description>HttpSessionListener监听器</description>
      <listener-class>com.demo.listener.MyHttpSessionListener</listener-class>
</listener>
<!-- 配置HttpSession对象的销毁时机 -->
<session-config>
      <!--配置HttpSession对象的1分钟之后销毁 -->
      <session-timeout>1</session-timeout>
</session-config>
//MyHttpSessionListener类实现了HttpSessionListener接口,因此可以对HttpSession对象的创建和销毁这两个动作进行监听。
public class MyHttpSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println( se.getSession() + "创建了!!");
    }

    /* HttpSession的销毁时机需要在web.xml中进行配置,如下:
     * <session-config>
              <session-timeout>1</session-timeout>
          </session-config>
          这样配置就表示session在1分钟之后就被销毁
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session销毁了!!");
    }
}

2、监听request、session、ServletContext 对象存放的数据变化情况

ServletContextAttributeListener

//web.xml配置监听器
<listener>
   <listener-class>com.demo.listener.MyServletContextAttributeListener</listener-class>
</listener>
//ServletContext域对象中属性的变更的事件监听器
package webtest.listener;
import java.text.MessageFormat;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements
        ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scab) {
        String str =MessageFormat.format(
                "ServletContext域对象中添加了属性:{0},属性值是:{1}"
                ,scab.getName()
                ,scab.getValue());
        System.out.println(str);
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scab) {
        String str =MessageFormat.format(
                "ServletContext域对象中删除属性:{0},属性值是:{1}"
                ,scab.getName()
                ,scab.getValue());
        System.out.println(str);
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scab) {
        String str =MessageFormat.format(
                "ServletContext域对象中替换了属性:{0}的值"
                ,scab.getName());
        System.out.println(str);
    }
}

HttpSessionAttributeListener

//web.xml配置监听器
<listener>  
    <listener-class>com.demo.listener.MyAttributeListener</listener-class>  
</listener>
//MyAttributeListener.java
package com.test;   
import javax.servlet.http.HttpSessionAttributeListener;  
import javax.servlet.http.HttpSessionBindingEvent;  
public class MyAttributeListener implements HttpSessionAttributeListener {  
    @Override  
    public void attributeAdded(HttpSessionBindingEvent event) {  
        String attributeName = event.getName();  
        Object attributeValue = event.getValue();  
        System.out.println("HttpSessionAttributeListener Attribute added : " + attributeName + " : "  
                + attributeValue);  
    }  
  
    @Override  
    public void attributeRemoved(HttpSessionBindingEvent event) {  
        String attributeName = event.getName();  
        Object attributeValue = event.getValue();  
        System.out.println("HttpSessionAttributeListener Attribute removed : " + attributeName + " : "  
                + attributeValue);  
    }  
  
    @Override  
    public void attributeReplaced(HttpSessionBindingEvent event) {  
        String attributeName = event.getName();  
        Object attributeValue = event.getValue();  
        System.out.println("Attribute replaced : " + attributeName + " : "  
                + attributeValue);  
    }  
} 

ServletRequestAttributeListener

//web.xml配置
<!-- 自定义ServletRquestListener的监听 --> 
<listener> 
    <listener-class>com.demo.listener.ServletRquestListeners</listener-class> 
</listener> 
/** 
 * Request请求时调用这个监听
 */  
public class ServletRquestListeners implements ServletRequestListener,ServletRequestAttributeListener  
{  
    //这个是在请求后调用  
    public void requestDestroyed(ServletRequestEvent s)  
    {  
        System.out.println("销毁了ServletReqeust");  
    }  
  
    //它是在请求前调用  
    public void requestInitialized(ServletRequestEvent s)  
    {  
        ServletRequest servletRequest = s.getServletRequest();  
        HttpServletRequest request = (HttpServletRequest) servletRequest;  
        String pathInfo = request.getServletPath();  
        System.out.println("请求地址:"+pathInfo);  
    }  
  
    public void attributeAdded(ServletRequestAttributeEvent srae)  
    {  
        HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();  
        System.out.println("增加request--->"+request.getAttribute("requestName"));  
    }  
  
    public void attributeRemoved(ServletRequestAttributeEvent srae)  
    {  
        HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();  
        System.out.println("删除request--->"+request.getAttribute("requestName"));  
    }  
  
    public void attributeReplaced(ServletRequestAttributeEvent srae)  
    {  
        HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();  
        System.out.println("提换request--->"+request.getAttribute("requestName"));  
    }  
}

3、监听session中保存的JavaBean的状态

HttpSessionBindingListener

public class TestListener implements HttpSessionBindingListener{
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
    	System.out.println("HttpSessionBindingListener.valueBound");
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
    	System.out.println("HttpSessionBindingListener.valueUnbound");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值