jsp经验-Listener监听

摘要:
前言侦听器用于监视web应用程序的创建和销毁以及其属性的更改。除了监视web应用程序之外,ServletContext对象还可以监视会话和请求的生命周期,以及它们属性的更改。上下文监测包括生命周期监测和上下文属性变化监测。一:生命周期监测1。编写ContextListener类以实现ServletContextListener接口2。配置web。xmlzsc。沙皇。听众。ContextListener3。测试对两个属性更改的监视:上下文1。编写一个类来实现ServletContextAttributeListener接口2。配置web。xmlzsc。沙皇。听众。ContextAttributeListener3。编写testContext。jsp通常,应显示=============================================侦听会话--侦听生命周期中的会话并侦听会话上属性的更改。

前言

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

监听 Context

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

one:生命周期的监听

1.编写ContextListener 类 实现ServletContextListener接口
jsp经验-Listener监听第1张
2.配置 web.xml

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

jsp经验-Listener监听第2张
3.测试
jsp经验-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");
%>

正常来说 应显示这个
jsp经验-Listener监听第4张

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

监听 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的活动
jsp经验-Listener监听第5张

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
jsp经验-Listener监听第6张

jsp经验-Listener监听第7张

监听 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
jsp经验-Listener监听第8张

jsp经验-Listener监听第9张

统计在线人数

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经验-Listener监听第10张

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

2.web.xml配置

3新建.checkOnlineNumber.jsp
jsp经验-Listener监听第11张

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

额外小经验

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

jsp经验-Listener监听第13张

jsp经验-Listener监听第14张

免责声明:文章转载自《jsp经验-Listener监听》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇流行的源程序版本管理软件和项目管理软件各自的优缺点JavaScript初学指南下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

tf.Session()函数的参数应用(tensorflow中使用tf.ConfigProto()配置Session运行参数&amp;amp;&amp;amp;GPU设备指定)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/dcrmg/article/details/79091941 tf.ConfigProto()函数用在创建session的时候,用来对session进行参数配置: config = tf.Config...

用javascript实现禁止页面后退返回上一页的代码

用javascript实现禁止页面后退返回上一页的代码:有时候我们需要用户在点击了如下一步的按钮时,页面跳转到了下一个页面,这时想不允许用户返回后退到上一页,可以采用下面的方法:在需要跳转的页面(上一个页面),添加如下代码:<scripttype="text/javascript">history.go(1);</script>这时...

Odoo 接口

1. 很多人还是习惯使用restful格式进行接口操作,但odoo已默认jsonrpc,所以需要专门写一个装饰器 def json_response(func): """返回去除封装的JSON""" @wraps(func) def decorate(*args, **kwargs): request.__raw_j...

DB2sql——DB2临时表的创建

DB2支持session临时表. 该表只能存在于某一session或某一交易上下文中,对其他用户不可见. DB2 V8增加了对临时表的索引的支持, 这对于提升查询速度比较有意义; 下面举例子来说明session临时表的使用: 1. 在创建session临时表前, 您必须创建临时表空间 create user temporary tablespace tes...

[Android测试] Appium的一些坑问题错误解决 与 技巧集锦

转:https://blog.csdn.net/niubitianping/article/details/52624417 1. error: Failed to start an Appium session, err was: Error: Requested a new session but one was in progress 之前的会话没有...

Spark SQL 编程(七)

1. DataFrame 的创建 1.1 RDD 和 DataFrame 的区别 RDD 是一种弹性分布式数据集,Spark中的基本抽象。表示一种不可变的、分区储存的集合,可以进行并行操作 DataFrame是一种以列对数据进行分组表达的分布式集合, DataFrame等同于Spark SQL中的关系表。相同点是,他们都是为了支持分布式计算而设计...