本文主要介绍了java使用监听器实现一个统计网站在线人数的示例,具有一定的参考价值,有需要的朋友可以了解一下。
(1)创建一个监听器实现类
要大致统计一个网站的在线人数,首先,可以通过ServletContextListener监听,当Web应用上下文启动时,在ServletContext中添加一个List,用来准备存放在线的用户名;然后,可以通过HttpSessionAttributeListener监听,当用户登录成功把用户名设置到Session中时同时将用户名存放到ServletContext中的List列表中;最后通过HttpSessionListener监听,当用户注销会话时将用户名从应用上下文范围中的List列表中删除。
所以,编写OnLineListener类实现ServletContextListener、HttpSessionAttributeListener、HttpSessionListener接口,具体代码如下:
1
2
3
4
5
6
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
package com.web.servlet;
import Java.util.LinkedList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//在线人数统计监听器实现类
public class OnlineListener implements ServletContextListener,
HttpSessionAttributeListener, HttpSessionListener {
private ServletContext application = null ;
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
public void contextInitialized(ServletContextEvent arg0) {
//初始化一个application对象
this .application = arg0.getServletContext();
//设置一个列表属性,用于保存在想用户名
this .application.setAttribute( "online" , new LinkedList<String>());
}
//往会话中添加属性时会回调的方法
public void attributeAdded(HttpSessionBindingEvent arg0) {
//取得用户名列表
List<String> online = (List<String>) this .application
.getAttribute( "online" );
if ( "username" .equals(arg0.getName())) {
//将当前用户名添加到列表中
online.add((String) arg0.getValue());
}
//将添加后的列表重新设置到application属性中
this .application.setAttribute( "online" , online);
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
}
//会话销毁时会回调的方法
public void sessionDestroyed(HttpSessionEvent arg0) {
//取得用户名列表
List<String> online = (List<String>) this .application
.getAttribute( "online" );
//取得当前用户名
String username = (String) arg0.getSession().getAttribute( "username" );
//将此用户名从列表中删除
online.remove(username);
//将删除后的列表重新设置到application属性中
this .application.setAttribute( "online" , online);
}
}
|
(2)在web.xml中注册监听器
监听器实现好后,还需要在web.xml文件中进行注册才能起作用,只需要在web.xml中像如下添加元素即可
1
2
3
4
5
6
7
|
<!-- 注册一个监听器 -->
< listener >
<!-- 指定监听器实现类的全限定名 -->
< listener-class >
com.web.servlet.OnlineListener
</ listener-class >
</listener
|
最后,我们创建几个Servlet来测试这个监听器实现的功能。
处理用户登录的Servlet类代码:
1
2
3
4
5
6
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
package com.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//处理用户登录的Servlet
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this .doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding( "utf-8" ); //设置相应内容类型
String username= request.getParameter( "username" ); //获取请求参数中的用户名
//往session中添加属性,会触发HttpSessionAttributeListener中的attributeAdded方法
if (username != null && !username.equals( "" )) {
request.getSession().setAttribute( "username" ,username);
}
//从应用上下文中获取在线用户名列表
List<String> online = (List<String>)getServletContext().getAttribute( "online" );
response.setContentType( "text/html;charset=utf-8" );
PrintWriter out = response.getWriter();
out.println( "<HTML>" );
out.println( " <HEAD><TITLE>用户列表</TITLE></HEAD>" );
out.println( " <BODY>" );
out.println( "当前用户是:" + username);
out.print( " <hr/><h3>在线用户列表</h3>" );
int size = online == null ? 0 : online.size();
for ( int i = 0 ; i < size; i++) {
if (i > 0 ){
out.println( "<br/>" );
}
out.println(i + 1 + "." + online.get(i));
}
//注意: 要对链接URL进行自动重写处理
out.println( "<hr/><a href=" / " mce_href=" / "" " + response.encodeURL(" logout ") + " / ">注销</a>" );
out.println( " </BODY>" );
out.println( "</HTML>" );
out.flush();
out.close();
}
}
|
处理用户登录Servlet的类代码
1
2
3
4
5
6
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
43
44
45
46
47
|
package com.web.servlet;
import java.io.*;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*;
//处理用户注销会话的Servlet
public class LogoutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this .doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding( "utf-8" );
//销毁会话,会触发SessionLinstener中的sessionDestroyed方法
request.getSession().invalidate();
//从应用上下文中获取在线用户名列表
List<String> online = (List<String>)getServletContext().getAttribute( "online" );
response.setContentType( "text/html;charset=utf-8" );
PrintWriter out = response.getWriter();
out.println( "<HTML>" );
out.println( " <HEAD><TITLE>用户列表</TITLE></HEAD>" );
out.println( " <BODY>" );
out.print( " <h3>在线用户列表</h3>" );
int size = online == null ? 0 : online.size();
for ( int i = 0 ; i < size; i++) {
if (i > 0 ){
out.println( "<br/>" );
}
out.println(i + 1 + "." + online.get(i));
}
out.println( "<hr/><a href=" / " mce_href=" / "" index.html/ ">主页</a>" );
out.println( " </BODY>" );
out.println( "</HTML>" );
out.flush();
out.close();
}
}
|
然后创建一个index.html文件,用来供用户登录,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< html >
< head >
< meta http-equiv = "content-type" content = "text/html; charset=UTF-8" >
< title >index.html</ title >
</ head >
< body >
< form action = "login" method = "post" >
用户名:< input type = "text" name = "username" />
< input type = "submit" value = "登录" />< br />< br />
</ form >
</ body >
</ html >
|
把WEB部署到Tomcat容器总,并启动。打开浏览器访问即可
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。