ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:45.83KB ,
资源ID:6957168      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6957168.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java Web开发在线人数统计程序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java Web开发在线人数统计程序.docx

1、Java Web开发在线人数统计程序Java Web开发在线人数统计程序作者:孙鑫来源:程序员之家发布者:admin 时间:2009-07-24 10:07:00点击:3904 下面,我们利用HttpSessionBindingListener接口Java语言,编写一个在线人数统计的程序。当一个用户登录后,显示欢迎信息,同时显示出当前在线的总人数和用户名单。当一个用户退出登录或者Session超时值发生时,从在线用户名单中删除这个用户,同时将在线的总人数减1。这个功能的完成,主要是利用一个实现了HttpSessionBindingListener接口的对象,当这个对象被绑定到Session中或

2、者从Session中被删除时,更新当前在线的用户名单。实例的开发主要有以下步骤。Step1:配置Web应用程序的运行目录在%CATALINA_HOME%confCatalinalocalhost目录下新建ch15.xml文件,输入如例15-4所示的内容。例15-4 ch15.xmlStep2:编写login.html将编写好的login.html文件放到F:JSPLessonch15online目录下。完整的代码如例15-5所示。例15-5 login.html 登录页面 请输入用户名: 请输入密码: Step3:编写UserList.java,User.java,OnlineUserServ

3、let.java和LogoutServlet.java为了和本章其他例子中的类相区别,本例中的类定义在org.sunxin.ch15.online包中。编写UserList.java,User.java,OnlineUserServlet.java和LogoutServlet.java源文件,将编写好的源文件放到F:JSPLessonch15srconline目录下。UserList.java的完整代码如例15-6所示。例15-6 UserList.java1package org.sunxin.ch15.online;23import java.util.Vector;4import jav

4、a.util.Enumeration;56public class UserList78 private static final UserList userList=new UserList();9 private Vector v;10 11 private UserList()12 13 v=new Vector();14 1516 public static UserList getInstance()17 18 return userList;19 20 21 public void addUser(String name)22 23 if(name!=null)24 v.addEl

5、ement(name);25 26 27 public void removeUser(String name)28 29 if(name!=null)30 v.remove(name);31 32 33 public Enumeration getUserList()34 35 return v.elements();36 37 38 public int getUserCount()39 40 return v.size();41 42在UserList这个类的设计上,我们应用了单例(Singleton)设计模式,关于设计模式的知识,读者可以参看相关的书籍。UserList是一个单例类,所

6、谓单例类,是指一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例类的一个最重要的特点是类的构造方法是私有的,从而避免了外部利用该类的构造方法直接创建多个实例。在代码的第8行,定义一个静态的常量userList,它表示了UserList类的一个对象。在UserList类加载的时候,这个对象就产生了。第1114行,声明UserList类的构造方法为private,这是为了避免在外部使用UserList类的构造方法创建其对象。要注意的是,如果在类中不写构造方法,那么Java编译器就会为这个类提供一个默认的不带参数的公开的构造方法,这样,在外部就可以通过类的构造方法创建对象了,那么Use

7、rList也就不再是一个单例类了。既然UserList类的构造方法是私有的,那么在外部就不能用new去构造对象,于是在代码的第1619行,定义了一个静态的方法getInstance(),在这个方法中,返回在类加载时创建的UserList类的对象。因为getInstance()方法本身是静态的,所以可以直接通过类名来调用。那么为什么要将UserList设计成单例类呢?这是因为UserList类的对象是用于存储和获取在线用户的列表,而这个用户列表对于所有的页面来说都应该是同一个,所以将UserList类设计成单例类,这样,所有的类访问的就是同一个UserList对象了。代码的第9行,定义了一个私有

8、的Vector类型的变量,在UserList类的构造方法中,对Vector类型的变量v进行了初始化,用于存放String类型的对象。注意,在这个地方没有使用ArrayList,是考虑到UserList对象可能会被多个线程同时访问,因为ArrayList不是同步的,而Vector是同步的,所以采用Vector来保存用户列表。User.java的完整代码如例15-7所示。例15-7 User.java1 package org.sunxin.ch15.online;23 import javax.servlet.http.HttpSessionBindingListener;4 import ja

9、vax.servlet.http.HttpSessionBindingEvent;56 public class User implements HttpSessionBindingListener7 8 private String name;9 private UserList ul=UserList.getInstance();10 11 public User()12 13 14 public User(String name)15 16 this.name=name;17 18 public void setName(String name)19 20 this.name=name;

10、21 22 public String getName()23 24 return name;25 26 public void valueBound(HttpSessionBindingEvent event)27 28 ul.addUser(name);29 30 public void valueUnbound(HttpSessionBindingEvent event)31 32 ul.removeUser(name);33 34User类实现了HttpSessionBindingListener接口,表示登录的用户。代码第9行,通过UserList类的静态方法getInstance(

11、)得到UserList类的对象,第2629行,当User对象加入到Session中时,Servlet容器将调用valueBound()方法,我们将用户的名字保存到用户列表中。第3033行,当User对象从Session中被删除时,Servlet容器将调用valueUnbound()方法,我们从用户列表中删除该用户。OnlineUserServlet.java的完整代码如例15-8所示。例15-8 OnlineUserServlet.java1package org.sunxin.ch15.online;23import javax.servlet.*;4import java.io.*;5im

12、port javax.servlet.http.*;6import java.util.Enumeration;78public class OnlineUserServlet extends HttpServlet910 public void doGet(HttpServletRequest req, HttpServletResponse resp)11 throws ServletException,IOException12 13 req.setCharacterEncoding(gb2312);14 String name=req.getParameter(user);15 Str

13、ing pwd=req.getParameter(password);16 17 if(null=name | null=pwd | name.equals() | pwd.equals()18 19 resp.sendRedirect(login.html);20 21 else22 23 HttpSession session=req.getSession();24 User user=(User)session.getAttribute(user);25 if(null=user | !name.equals(user.getName()26 27 user=new User(name)

14、;28 session.setAttribute(user,user);29 30 31 resp.setContentType(text/html;charset=gb2312);32 PrintWriter out=resp.getWriter();33 34 out.println(欢迎用户+name+登录);35 UserList ul=UserList.getInstance();36 out.println(当前在线的用户列表:);37 Enumeration enums=ul.getUserList();38 int i=0;39 while(enums.hasMoreEleme

15、nts()40 41 out.println(enums.nextElement();42 out.println(    );43 if(+i=10)44 45 out.println();46 47 48 out.println(当前在线的用户数:+i);49 out.println(退出登录);50 out.close();51 52 53 54 public void doPost(HttpServletRequest req, HttpServletResponse resp)55 throws ServletException,IOExcep

16、tion56 57 doGet(req,resp);58 59OnlineUser类用于向用户显示欢迎信息、当前在线用户列表和在线用户数。代码的第2429行,首先从Session中获取名为user的属性对象,通过判断它是否为空来判断在此次会话中用户是否已经登录。如果user对象不为null,那么接着判断在同一个会话中,用户是否更换了一个用户名登录。如果user对象为空或者当前登录的用户名和先前登录的用户名不同,则以用户的当前登录名创建一个User对象,将这个对象绑定到Session中,这个时候,Servlet容器就会调用User对象的valueBound()方法,将这个用户的名字保存在用户列表

17、中。第35行,得到UserList类的对象。第37行,得到用户列表的枚举对象。第3947行,循环取出在线用户的名字并输出,一旦输出超过10个用户名,就输出一个换行()。第48行,输出当前在线的用户数。第49行,输出“退出登录”的链接。LogoutServlet.java的完整代码如例15-9所示。例15-9 LogoutServlet.java1 package org.sunxin.ch15.online;23 import javax.servlet.*;4 import java.io.*;5 import javax.servlet.http.*;67 public class Log

18、outServlet extends HttpServlet8 9 public void doGet(HttpServletRequest req, HttpServletResponse resp)10 throws ServletException,IOException11 12 resp.setContentType(text/html;charset=gb2312);13 14 HttpSession session=req.getSession();15 User user=(User)session.getAttribute(user);16 session.invalidat

19、e();17 18 PrintWriter out=resp.getWriter();19 out.println(退出登录);20 out.println(user.getName()+,你已退出登录);21 out.println(重新登录);22 out.println();23 out.close();24 25LogoutServlet类用于退出登录。代码第16行,调用HttpSession对象的invalidate()方法,使Session失效,从而删除绑定到这个Session中的User对象,Servlet容器就会调用这个User对象的valueUnbound()方法,从用户列表

20、中删除该用户。Step4:编译上述四个Java源文件打开命令提示符,进入到源文件所在的目录F:JSPLessonch15srconline下,然后执行javac -d .WEB-INFclasses *.java在WEB-INFclasses目录下生成4个源文件对应的包和类文件。Step5:部署Servlet编辑WEB-INF目录下的web.xml文件,添加对本例中的Servlet的配置,内容如例15-10所示。例15-10 web.xml OnlineUserServlet org.sunxin.ch15.online.OnlineUserServlet OnlineUserServlet

21、/online/online logout org.sunxin.ch15.online.LogoutServlet logout /online/logout实现HttpSessionBindingListener接口的监听器类不需要在web.xml中进行配置。Step6:运行在线人数统计程序启动Tomcat服务器,打开IE浏览器,首先在地址栏中输入http:/localhost:8080/ch15/online/login.html出现登录页面后,输入用户名和密码,将看到如图15-1所示的页面。读者可以再打开一个浏览器,输入http:/localhost:8080/ch15/online/

22、login.html,然后登录,将看到如图15-2所示的页面。 图15-1 OnlineUserServlet显示一个用户在线 图15-2 OnlineUserServlet显示有两个用户在线读者可以退出其中一个用户的登录,然后刷新另外一个窗口中的页面,可以看到显示的在线用户数为1。读者可以多打开几个浏览器,进行测试。在线人数统计程序存在的问题:在第5.2.4节“Session和Cookie的深入研究”中介绍过,如果用户没有退出登录而直接关闭了浏览器,那么在服务器端的Session中,这个用户仍然是存在的,直到Session的超时值发生。所以在线人数统计只能做到在一个时间段内统计出大致的在线人数,而不能统计出精确的人数。为了提高统计的精确性,可以在客户端设置脚本,当浏览器关闭时,自动向服务器发送一个请求,服务器收到这个请求后,使Session失效。不过,这也不能做到100%的精确,因为还存在着客户端的浏览器异常终止,或者客户机器崩溃的可能。转载请注明出处: 程序员之家 http:/www.sunxin.org

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1