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提交过去.

原文地址:https://www.cnblogs.com/czy16/p/8762702.html