zoukankan      html  css  js  c++  java
  • jsp经验-Listener监听

    前言

    Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。
    web应用即ServletContext对象(jsp的隐式对象application)
    除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。

    监听 Context

    对Context的监听分生命周期的监听,和Context上Attribute变化的监听两种。

    one:生命周期的监听

    1.编写ContextListener 类 实现ServletContextListener接口

    2.配置 web.xml

    <listener>
      	<listener-class>zsc.czy.listener.ContextListener</listener-class>
      </listener>
    


    3.测试

    two :Context上Attribute变化的监听

    1.编写一个class类 实现ServletContextAttributeListener 接口
    2.配置web.xml

    <listener>
    		<listener-class>zsc.czy.listener.ContextAttributeListener</listener-class>
    	</listener>
    

    3.写一个testContext.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
     
    <%
        application.setAttribute("test", 1);
        application.setAttribute("test", 2);
        application.removeAttribute("test");
    %>
    

    正常来说 应显示这个

    =====================================

    监听 Session

    ---对Session的监听也分生命周期的监听,和Session上Attribute变化的监听两种。

    one:对Session的生命周期的监听

    1.添加一个新类 SessionListener 实现接口 HttpSessionListener

    package listener;
     
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
     
    public class SessionListener implements HttpSessionListener {
     
        @Override
        public void sessionCreated(HttpSessionEvent e) {
     
            System.out.println("监听到 session 创建, sessionid 是: " + e.getSession().getId());
        }
     
        @Override
        public void sessionDestroyed(HttpSessionEvent e) {
     
            System.out.println("监听到 session 销毁, sessionid 是: " + e.getSession().getId());
        }
    }
    

    2.配置web.xml

    <listener>
    		<listener-class>zsc.czy.listener.SessionListener</listener-class>
    	</listener>
    

    3.测试
    随意访问任意页面
    如果是第一次访问,都会触发session创建,后续访问不会触发session的创建

    关闭浏览器,再访问,也会触发session的创建。 但是有的浏览器,即便是关闭了,下一次打开,也会发送以前sessionid到服务器,这样服务器就不会创建新的session。 请参考 session原理示意图

    session的销毁不易观察到,一般说来服务器会设置session存活时间为30分钟。所以需要等待才能观察到销毁

    注: 在重启tomcat测试之前, 要删除D: omcatworkCatalinalocalhost_SESSIONS.ser 这个文件。 这个文件是tomcat存放以前的session的,为了观察到创建session的活动,需要tomcat重启之前把以前的session都清除掉,才能观察到新创建session的活动

    two:对Session上Attribute变化的监听

    1.新建类 名叫SessionAttributeListener 并实现接口 HttpSessionAttributeListener

    package zsc.czy.listener;
    
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    
    public class SessionAttributeListener implements HttpSessionAttributeListener {
    
    	@Override
    	public void attributeAdded(HttpSessionBindingEvent e) {
    
    		System.out.println("session 增加属性 ");
    		System.out.println("属性是" + e.getName());
    		System.out.println("值是" + e.getValue());
    
    	}
    
    	@Override
    	public void attributeRemoved(HttpSessionBindingEvent e) {
    		// TODO Auto-generated method stub
    		System.out.println("session 移除属性 ");
    
    	}
    
    	@Override
    	public void attributeReplaced(HttpSessionBindingEvent e) {
    		// TODO Auto-generated method stub
    		System.out.println("session 替换属性 ");
    
    	}
    }
    
    

    2.web.xml配置
    3.新建testSession.jsp

    监听 Request

    对Request的监听分生命周期的监听,和Request上Attribute变化的监听两部分。

    one:生命周期的监听

    1.RequestListener 实现接口 ServletRequestListener和ServletRequestAttributeListener (似乎有点特殊,相对上面的那些,它一下子就实现2个接口,既然同时监听了生命周期,还有属性变化)

    package zsc.czy.listener;
    
    import javax.servlet.ServletRequestAttributeEvent;
    import javax.servlet.ServletRequestAttributeListener;
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    
    public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener {
    
    	 @Override
    	    public void requestDestroyed(ServletRequestEvent arg0) {
    	        System.out.println("销毁了一个Request ");
    	    }
    	 
    	    @Override
    	    public void requestInitialized(ServletRequestEvent arg0) {
    	        System.out.println("创建了一个Request ");
    	    }
    	 
    	    @Override
    	    public void attributeAdded(ServletRequestAttributeEvent e) {
    	        System.out.println("request 增加属性 ");
    	        System.out.println("属性是" + e.getName());
    	        System.out.println("值是" + e.getValue());
    	    }
    	 
    	    @Override
    	    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
    	        System.out.println("request 移除属性 ");
    	         
    	    }
    	 
    	    @Override
    	    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
    	        System.out.println("request 替换属性 ");
    	         
    	    }
    
    }
    
    

    2.web.xml配置

    3.testRequest.jsp

    统计在线人数

    HTTP协议是短链接的,所以无法在服务端根据建立了多少连接来统计当前有多少人在线。 不过可以通过统计session有多少来估计在线人数。
    一旦一个用户访问服务器,就会创建一个session. 如果该用户持续访问,那么该session会持续有效。
    如果经历了30分钟,该用户也没有做任何操作,就表示该用户“下线” 了,其对应的session也会被销毁。
    所以可以通过统计有多少session被保留来估计当前在线人数。

    1.新建个类,起名OnlineNumberListener 并实现接口HttpSessionListener

    applicationContext 指的是全局,所有用户共享同一个数据
    OnlineNumberListener 实现接口HttpSessionListener
    当创建一个session的时候,就把数字+1,并且放在application里。
    ServletContext application = e.getSession().getServletContext(); //奇怪,为什么会可以直接在getSession()里面还能.getServletContext()
    这就是jsp里的application

    注: 第一次从application里取数据的时候,是空的,要设置为0。

    当销毁一个session的时候,把这个数字-1

    额外补充:
    在JSP中可以直接使用application这个内置对象, 因为application对象是ServletContext接口的实例
    也可以通过 request.getServletContext()来获取。
    所以 application == request.getServletContext() 会返回true
    application映射的就是web应用本身。
    (既在jsp里直接用application,也可以request.getServletContext() ,servlet是叫ServletContext。)

    2.web.xml配置

    3新建.checkOnlineNumber.jsp


    小经验:EL表达式 是不需要<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> ,不需要这句话的。
    这句话是给用<c: XXXX>这个标签用的
    EL表达式只需:
    不同版本的tomcat是否默认开启对EL表达式的支持,是不一定的。
    所以为了保证EL表达式能够正常使用,需要在<%@page 标签里加上isELIgnored="false"

    额外小经验

    做商品订单的项目时,可以用一个隐藏的按钮设定连同商品id提交过去.

  • 相关阅读:
    Nginx 知识
    web页面乱码之字符集
    P2633 Count on a tree 树上主席树
    HDU 1542 线段树扫描线
    P4513 小白逛公园 线段树
    牛客4 C sequence
    P4126 [AHOI2009]最小割 网络流
    P3980 [NOI2008]志愿者招募 网络流
    P3313 [SDOI2014]旅行 动态开点线段树 树链剖分
    Planting Trees 单调队列
  • 原文地址:https://www.cnblogs.com/czy16/p/8762702.html
Copyright © 2011-2022 走看看