下面,我们利用HttpSessionBindingListen
Step1:配置Web应用程序的运行目录
在%CATALINA_HOME%\conf\Catalina\localhost\目录下新建ch15.xml文件,输入如例15-4所示的内容。
例15-4
<Context docBase="F:\JSPLesson\ch15" reloadable="true"/>
Step2:编写login.html
将编写好的login.html文件放到F:\JSPLesson\ch15\online目录下。完整的代码如例15-5所示。
例15-5
<html>
</html>
Step3:编写UserList.java,User.java,OnlineUserServlet.java和LogoutServlet.java
为了和本章其他例子中的类相区别,本例中的类定义在org.sunxin.ch15.online包中。编写UserList.java,User.java,OnlineUserServlet.java和LogoutServlet.java源文件,将编写好的源文件放到F:\JSPLesson\ch15\src\online目录下。
UserList.java的完整代码如例15-6所示。
例15-6
1.package org.sunxin.ch15.online;
2.
3.import java.util.Vector;
4.import java.util.Enumeration;
5.
6.public class UserList
7.{
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.}
那么为什么要将UserList设计成单例类呢?这是因为UserList类的对象是用于存储和获取在线用户的列表,而这个用户列表对于所有的页面来说都应该是同一个,所以将UserList类设计成单例类,这样,所有的类访问的就是同一个UserList对象了。
代码的第9行,定义了一个私有的Vector类型的变量,在UserList类的构造方法中,对Vector类型的变量v进行了初始化,用于存放String类型的对象。注意,在这个地方没有使用ArrayList,是考虑到UserList对象可能会被多个线程同时访问,因为ArrayList不是同步的,而Vector是同步的,所以采用Vector来保存用户列表。
User.java的完整代码如例15-7所示。
例15-7
1. package org.sunxin.ch15.online;
2.
3. import javax.servlet.http.HttpSessionBindingListen
4. import javax.servlet.http.HttpSessionBindingEvent;
5.
6. public class User implements HttpSessionBindingListen
7. {
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.}
User类实现了HttpSessionBindingListen
OnlineUserServlet.java的完整代码如例15-8所示。
例15-8
1.package org.sunxin.ch15.online;
2.
3.import javax.servlet.*;
4.import java.io.*;
5.import javax.servlet.http.*;
6.import java.util.Enumeration;
7.
8.public class OnlineUserServlet extends HttpServlet
9.{
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.}
OnlineUser类用于向用户显示欢迎信息、当前在线用户列表和在线用户数。代码的第24~29行,首先从Session中获取名为user的属性对象,通过判断它是否为空来判断在此次会话中用户是否已经登录。如果user对象不为null,那么接着判断在同一个会话中,用户是否更换了一个用户名登录。如果user对象为空或者当前登录的用户名和先前登录的用户名不同,则以用户的当前登录名创建一个User对象,将这个对象绑定到Session中,这个时候,Servlet容器就会调用User对象的valueBound()方法,将这个用户的名字保存在用户列表中。第35行,得到UserList类的对象。第37行,得到用户列表的枚举对象。第39~47行,循环取出在线用户的名字并输出,一旦输出超过10个用户名,就输出一个换行(<br>)。第48行,输出当前在线的用户数。第49行,输出“退出登录”的链接。
LogoutServlet.java的完整代码如例15-9所示。
例15-9
1. package org.sunxin.ch15.online;
2.
3. import javax.servlet.*;
4. import java.io.*;
5. import javax.servlet.http.*;
6.
7. public class LogoutServlet extends HttpServlet
8. {
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.}
LogoutServlet类用于退出登录。代码第16行,调用HttpSession对象的invalidate()方法,使Session失效,从而删除绑定到这个Session中的User对象,Servlet容器就会调用这个User对象的valueUnbound()方法,从用户列表中删除该用户。
Step4:编译上述四个Java源文件
打开命令提示符,进入到源文件所在的目录F:\JSPLesson\ch15\src\online下,然后执行
javac -d ..\..WEB-INF\classes *.java
在WEB-INF\classes目录下生成4个源文件对应的包和类文件。
Step5:部署Servlet
编辑WEB-INF目录下的web.xml文件,添加对本例中的Servlet的配置,内容如例15-10所示。
例15-10
…
<servlet>
org.sunxin.ch15.online.OnlineUserServlet
</servlet-class>
</servlet>
<servlet-mapping>
</servlet-mapping>
<servlet>
</servlet>
<servlet-mapping>
</servlet-mapping>
…
实现HttpSessionBindingListen
Step6:运行在线人数统计程序
启动Tomcat服务器,打开IE浏览器,首先在地址栏中输入
http://localhost:8080/ch15/online/login.html
出现登录页面后,输入用户名和密码,将看到如图15-1所示的页面。
读者可以再打开一个浏览器,输入http://localhost:8080/ch15/online/login.html,然后登录,将看到如图15-2所示的页面。
图15-1
读者可以退出其中一个用户的登录,然后刷新另外一个窗口中的页面,可以看到显示的在线用户数为1。读者可以多打开几个浏览器,进行测试。
本文来源于:IT学习网(www.ITxuexi.com)
详文请参考:http://www.itxuexi.com/tech/java/web/5181250227071.html