博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jsp经验-Listener监听
阅读量:4616 次
发布时间:2019-06-09

本文共 5374 字,大约阅读时间需要 17 分钟。

前言

Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。

web应用即ServletContext对象(jsp的隐式对象application)
除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。

监听 Context

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

one:生命周期的监听

1.编写ContextListener 类 实现ServletContextListener接口

1175089-20180409144926345-626246480.png
2.配置 web.xml

zsc.czy.listener.ContextListener

1175089-20180409145255990-1853758772.png

3.测试
1175089-20180409145348509-1326296495.png

two :Context上Attribute变化的监听

1.编写一个class类 实现ServletContextAttributeListener 接口

2.配置web.xml

zsc.czy.listener.ContextAttributeListener

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");%>

正常来说 应显示这个

1175089-20180409151548435-94880330.png

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

监听 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

zsc.czy.listener.SessionListener

3.测试

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

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

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

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

1175089-20180409152841292-1363246003.png

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
1175089-20180409154252108-296845262.png

1175089-20180409154234537-890208856.png

监听 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

1175089-20180409155734406-1752651254.png

1175089-20180409155717583-214542178.png

统计在线人数

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

1175089-20180409161525567-1205899726.png

额外补充:

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

2.web.xml配置

3新建.checkOnlineNumber.jsp

1175089-20180409161942791-2074692421.png

1175089-20180409162145361-632784141.png

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

额外小经验

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

1175089-20180409200003167-2010238077.png

1175089-20180409195841477-2061552614.png

转载于:https://www.cnblogs.com/czy16/p/8762702.html

你可能感兴趣的文章
Codeforces 547D Mike and Fish
查看>>
ubuntu14.04安装opgngl
查看>>
[NOIp2012提高组]国王游戏
查看>>
ModelDriven的原理,机制及其应用
查看>>
7.DataAnnotations(数据注解)【Code-First 系列】
查看>>
pandas的数据结构
查看>>
Hadoop集群搭建
查看>>
洛谷—— P1133 教主的花园
查看>>
T1229 数字游戏 codevs
查看>>
[优文翻译]003.你应避免的移动开发APP的5个细节(5 Things to Avoid while Developing Your Next Mobile App)...
查看>>
JS高德地图计算两地之间的实际距离
查看>>
【LeetCode232】 Implement Queue using Stacks★
查看>>
中科燕园GIS外包---交通运输综合地理信息平台
查看>>
BZOJ 1202 狡猾的商人(带权并查集)
查看>>
ThinkPHP的ajaxReturn方法的使用
查看>>
线段树模板(贼慢的版本)
查看>>
[线段树] POJ 3368 Frequent values
查看>>
MVC中关闭弹出窗口,刷新父页面
查看>>
linux下使用Apache+php实现留言板功能的网站
查看>>
android 常用命令
查看>>