Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 450|回复: 0

[jsp学习]session监听

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 23:50:46 | 显示全部楼层 |阅读模式
    Bromon原创 请尊重版权(节选)

         Servlet中对session的监听有很多接口,功能很灵活,最常用的是监听Session和Attribute。这里要澄清一下概念,servlet中的session监听和Attribute监听含义有差别,session监听指的不是我们一般所理解的放置一个session或者销毁一个session,这是Attribute监听的功能,因为servlet中放置session的语法是session.setAttribute(“session名”,要放入的对象)。而session监听,监听的是HTTP连接,只要有用户与server连接,就算连接的是一个空白的jsp页面,也会触发session事件,所以此处的session实际上指的是connection,用来统计当前在线用户数最合适了。不知道我说清楚了没有。下面分别讲解这两种监听方式。

    1、 session监听

    首先编写一个session监听类,实作HttpSessionListener接口,它的作用是计算当前有多少个在线用户:
    /*
    *@Author bromon
    *2004-6-12
    */  
      
       
       
         
       

       
       
      
       
    package org.bromon.test;

    import javax.servlet.*;
    import javax.servlet.http.*;

    public class SessionCount implements HttpSessionListener{
       private static int count=0;

       public void sessionCreated(HttpSessionEvent se){
         count++;
         System.out.println(“session创建:”+new java.util.Date());
       }

       public void sessionDestroyed(HttpSessionEvent se){
         count--;
         System.out.println(“session销毁:”+new java.util.Date());
       }

       public static int getCount(){
         return(count);
       }
    }

        怎么样,是不是一目了然?count被定义为static,是因为要保证整个系统只有这一个count。如果你实在不放心,可以把它写成一个单例类。

    然后在web.xml中声明这个监听器:
    <listener>
      <listener-class>
        org.bromon.test.SessionCount
      </listener-class>
    </listener>

    编写一个测试页面test.jsp,内容是获得count:
    <%
      int count=org.bromon.test.SessionCount.getCount();
      out.println(count);
    %>
         需要注意的是,这里根本不涉及任何session的操作。重启动App server,试着连接test.jsp,可以看到监听器已经开始工作。

    2、 Attribute监听
         例如一个站内消息系统,肯定要获得所有登陆者的ID,才有可能互发消息。这就涉及Attribute监听。假设我们写了个用户登陆的模块,用户通过身份验证之后会产生一个session,保存它的相关信息,比如:
    //check.jsp
    <%
    String name=request.getParameter(“name”);
    Name=new String(name.getBytes(“ISO8859-1”));
    session.setAttribute(“user”,name);
    %>

         做过jsp的兄弟应该对这段代码再熟悉不过了,下面写个监听器来监听用户登陆,把所有用户的ID保存到一个List当中,这个监听器实作HttpSessionAttributeListener接口:

    /*
    *@Author bromon
    *2004-6-12
    */
    package org.bromon.test;

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;

    public class OnlineList implements HttpSessionAttributeListener{
        private static List list=new ArrayList();

        public void attributeAdded(HttpSessionBindingEvent se){
          if("user".equals(se.getName())){
            list.add(se.getValue());
          }
       }

        public void attributeRemoved(HttpSessionBindingEvent se){
          if("user".equals(se.getName())){
            list.remove(se.getValue());
          }
        }

       public void attributeReplaced(HttpSessionBindingEvent se){}

       public static List getList(){
          return(list);
       }
    }

    写个简单的jsp来得到用户列表:
    <%
      java.util.List list=org.bromon.test.OnlineList.getList();
      out.println("共有"+list.size()+"名用户已登陆:");
      for(int I=0;I<lise.size();i++){
         out.println(list.get(i));
      }
    %>
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-10 17:27 , Processed in 0.361402 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表