java使用监听器实现一个统计网站在线人数的示例
程序员文章站
2024-03-12 20:58:20
本文主要介绍了java使用监听器实现一个统计网站在线人数的示例,具有一定的参考价值,有需要的朋友可以了解一下。
(1)创建一个监听器实现类
要大致统计一个网站的...
本文主要介绍了java使用监听器实现一个统计网站在线人数的示例,具有一定的参考价值,有需要的朋友可以了解一下。
(1)创建一个监听器实现类
要大致统计一个网站的在线人数,首先,可以通过servletcontextlistener监听,当web应用上下文启动时,在servletcontext中添加一个list,用来准备存放在线的用户名;然后,可以通过httpsessionattributelistener监听,当用户登录成功把用户名设置到session中时同时将用户名存放到servletcontext中的list列表中;最后通过httpsessionlistener监听,当用户注销会话时将用户名从应用上下文范围中的list列表中删除。
所以,编写onlinelistener类实现servletcontextlistener、httpsessionattributelistener、httpsessionlistener接口,具体代码如下:
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中像如下添加元素即可
<!-- 注册一个监听器 --> <listener> <!-- 指定监听器实现类的全限定名 --> <listener-class> com.web.servlet.onlinelistener </listener-class> </listener
最后,我们创建几个servlet来测试这个监听器实现的功能。
处理用户登录的servlet类代码:
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的类代码
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文件,用来供用户登录,代码如下:
<!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容器总,并启动。打开浏览器访问即可
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。