您当前的位置: 首页 >  servlet

梁云亮

暂无认证

  • 2浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Servlet监听器

梁云亮 发布时间:2019-12-05 19:52:26 ,浏览量:2

监听概念

监听器就是监听某个对象的的状态变化的组件 监听器的相关概念: 事件源:被监听的对象 ----- 三个域对象 request session servletContext 监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 ---- 注册监听器:将监听器与事件源进行绑定 响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 ---- 程序员编写代码

Servlet中的监听器

在Servlet规范中定义了多种类型的监听器(一共8个),它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象。Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

  • 域对象的生命周期监听:监听域对象自身的创建和销毁。这个监听器需要实现相应的监听器接口:ServletContextListener、HttpSessionListener、ServletRequestListener。
  • 域对象的属性监听:监听域对象中属性的增加和删除。这个监听器需要实现的监听器接口为:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener
  • 感知监听(与HttpSession域对象有关):监听绑定到HttpSession域中的某个JavaBean对象的状态的监听器。这个监听器需要实现的监听器接口:HttpSessionBindingListener、HttpSessionActiveationListener,实现这两个接口的类不需要 web.xml 文件中进行注册
域对象的生命周期监听 监听ServletContext的生命周期
public class AListener implements ServletContextListener{    
    public void contextInitialized(ServletContextEvent sce) {  //在项目启动时调用   
    }    
    public void contextDestroyed(ServletContextEvent sce) {  //在项目关闭时调用    
    }
}
监听HttpSession的生命周期
public class AListener implements HttpSessionListener{  
    public void sessionCreated(HttpSessionEvent sce) { //在会话产生时调用
    }    
     public void sessionDestroyed(HttpSessionEvent sce) { //在会话关闭时调用    
    }
}
域对象的属性监听 监听ServletContext的属性
public class AListener implements ServletContextAttributeListener{    
    public void attributeAdded(ServletcontextAttribute scab){   //给ServletContext对象添加属性时调用      
    }    
    public void attributeRemoved(ServletContextAttributeEvent scab){  //给ServletContext对象删除属性时调用      
    }    
    public void attributeReplaced(ServletContextAttributeEvent scab){  //给ServletContext对象替换属性值时调用       
    }
}
监听HttpSession的属性
public class AListener implements HttpSessionAttributeListener{   
	public void attributeAdded(HttpSessionAttribute scab){ //给HttpSession对象添加属性时调用         
	}    
	public void attributeRemoved(HttpSessionAttributeEvent scab){  //给HttpSession对象删除属性时调用    
	}        
	public void attributeReplaced(HttpSessionAttributeEvent scab){	//给HttpSession对象替换属性值时调用       
	}
}
监听ServletRequest的属性
public class AListener implements ServletRequestAttributeListener{    
	public void attributeAdded(ServletRequestAttribute scab){ //给ServletRequest对象添加属性时调用         
	}    
	public void attributeRemoved(ServletRequestAttributeEvent scab){ //给ServletRequest对象删除属性时调用         
	}    
	public void attributeReplaced(ServletRequestAttributeEvent scab){ //给ServletRequest对象替换属性值时调用       
	}
}
感知监听器

保存在Session域中的对象的状态有:

  • 绑定(session.setAttribute(“bean”,Object))到Session中
  • 随Session对象持久化到一个存储设备中
  • 从Session域中解除(session.removeAttribute(“bean”))绑定
  • 随Session对象从一个存储设备中恢复。
HttpSessionBindingListener接口

实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和从 Session中删除的事件。

  • 当对象被绑定到HttpSession对象中时,web服务器调用该对象的void valueBound(HttpSessionBindingEvent event)方法。
  • 当对象从HttpSession对象中解除绑定时,web服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法。
HttpSessionActivationListener接口

实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(反序列化)和钝化(序列化)的事件。

  • 当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被钝化(序列化)之前,web服务器调用该javabean对象的void sessionWillPassivate(HttpSessionEvent event) 方法。这样javabean对象就可以知道自己将要和HttpSession对象一起被序列化(钝化)到硬盘中。
  • 当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被活化(反序列化)之后,web服务器调用该javabean对象的void sessionDidActive(HttpSessionEvent event)方法。这样javabean对象就可以知道自己将要和 HttpSession对象一起被反序列化(活化)回到内存中。(javabean随着HttpSession对象一起被活化的前提是该javabean对象除了实现该接口外还应该实现Serialize接口)。
示例 示例1:服务器启动项目初始化数据,用户请求Servlet时使用这些数据

第一步:定义Listener

@WebListener()
public class DemoListener implements ServletContextListener{//ServletContext--application
    public DemoListener() {
    }
    public void contextInitialized(ServletContextEvent sce) { //服务器启动项目初始化数据
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("initData","hahaheihei");
        System.out.println("contextInitialized");
    }
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed");
    }
}

第二步:定义Servlet

@WebServlet(urlPatterns = "/demoServlet")
public class DemoServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        Object initData = servletContext.getAttribute("initData"); //用户请求Servlet时使用这些数据
        System.out.println(initData);
    }
}
关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0438s