跟我学J2EE Web监听器组件——统计计算在线用户数量的应用实例
跟我学J2EE Web监听器组件——Web监听器组件技术及应用实例
1.1Web监听器组件技术及应用实例1.1.1Web监听器组件技术概述1、Web监听技术(1)Web监听器组件技术在Web应用中,可以部署一些特殊的Servlet类,通过它们从而实现对Web应用中的上下文信息、会话信息等的监听,最终实现在后台自动地完成某些特定的应用功能(2)为什么要提供Web监听器通过对这些信息的监听,从而可以在服务器的后台自动启动某些程序,完成一些特殊的应用。
2、Web应用的生命周期事件(1)Web应用程序生命周期事件当Servlet Contexts和Sessions被初始化或释放时,以及当向Servlet Contexts或Session 上添加或删除属性的时候,容器都将自动地通知对这些进行监听的“listener”对象。
Servlet生命周期事件与Java GUI中Swing的事件机制类似。
(2)生命周期事件的监听器接口的具体应用1)如果希望让应用系统的程序监听Web应用的启动和停止事件,则需要实现ServletContextListener接口;2)如果希望让应用系统的程序去监听Session的创建和失效事件,则需要实现HttpSessionListener接口3、与Web应用的生命周期事件有关的两个接口(1)ServletContextListener接口中的方法(2)ServletContextAttributesListener接口中的方法4、ServletContextListener接口中的方法(1)void contextInitialized(ServletContextEvent e)方法该方法在Web应用程序第一次准备处理Requests请求的时候(例如:Web Server启动并且ServletContext被加载和重新加载时)被执行。
本方法返回之前不能够处理Http Requests请求(2)void contextDestroyed(ServletContextEvent e)该方法在Web应用程序要被关闭的时候(例如:当Web Server关闭或当一个ServletContext 被移去或重新加载的时候) 被执行。
JSP实例程序:统计当前在线人数
JSP实例程序:统计当前在线人数/**这是管理user信息的类文件名为onLineUser.java*/import javax.servlet.http.*;import javax.servlet.*;import java.util.*;public class onLineUser implements HttpSessionBindingListener { public onLineUser(){}private Vector users=new Vector();public int getCount(){users.trimToSize();return users.capacity();}public boolean existUser(String userName){users.trimToSize();boolean existUser=false;for (int i=0;i<users.capacity();i++ ){if (userName.equals((String)users.get(i))){existUser=true;break;}}return existUser;}public boolean deleteUser(String userName) {users.trimToSize();if(existUser(userName)){int currUserIndex=-1;for(int i=0;i<users.capacity();i++){if(userName.equals((String)users.get(i))){currUserIndex=i;break;}}if (currUserIndex!=-1){users.remove(currUserIndex);users.trimToSize();return true;}}return false;}public Vector getOnLineUser(){return users;}public void valueBound(HttpSessionBindingEvent e) {users.trimToSize();if(!existUser(e.getName())){users.add(e.getName());System.out.print(e.getName()+"\t 登入到系统\t"+(new Date())); System.out.println(" 在线用户数为:"+getCount());}elseSystem.out.println(e.getName()+"已经存在");}public void valueUnbound(HttpSessionBindingEvent e) {users.trimToSize();String userName=e.getName();deleteUser(userName);System.out.print(userName+"\t 退出系统\t"+(new Date()));System.out.println(" 在线用户数为:"+getCount());}}///////////////////////////////////////////////////////////<%/**这是显示在线用户的jsp文件文件名为onLineUser.jsp*/%><%@ page contentType="text/html;charset=gb2312" %><%@ page import="onLineUser,java.util.*" %><jsp:useBean id="onlineuser" class="onLineUser" scope="application"/> <html><head><title>搞定JSP在线人数</title></head><body><center><p><h1>登陆成功,欢迎您访问!</h1></p></center><% session = request.getSession(false); %><%String username=request.getParameter("username");if (onlineuser.existUser(username)){out.println("用户<font color=red>"+username+"</font>已经登陆!"); }else{session.setMaxInactiveInterval(50); file://Sesion有效时长,以秒为单位session.setAttribute(username,onlineuser);out.println("欢迎新用户:<font color=red>"+username+"</font>登陆到系统!");}out.println("<br>当前在线用户人数:<fontcolor=red>"+onlineuser.getCount()+"</font><br>");Vector vt=onlineuser.getOnLineUser();Enumeration e = vt.elements();out.println("在线用户列表");out.println("<table border=1>");out.println("<tr><td>用户名</td></tr>");while(e.hasMoreElements()){out.println("<tr><td>");out.println((String)e.nextElement()+"<br>");out.println("</td></tr>");}out.println("</table>");%><center><p>yuking制作</p><p> </p><%out.println("<p><a href='logout.jsp?username="+username+"'>退出系统</a></p>");%></center></body></html>///////////////////////////////////////////////////////////////////<%/**这是用户退出的jsp文件文件名为logout.jsp*/%><%@ page contentType="text/html;charset=gb2312" %><%@ page import="onLineUser,java.util.*" %><jsp:useBean id="onlineuser" class="onLineUser" scope="application"/> <html><head><title>搞定JSP在线人数</title></head><body><center><p><h1>登陆成功,欢迎您访问!</h1></p></center><%String username=request.getParameter("username");if(onlineuser.deleteUser(username))out.println(username+"已经退出系统!");elseout.println(username+"没有登陆到系统!");%><center><p>制作</p><p> </p><p><a href="logout.jsp">退出系统</a></p></center></body></html>。
javaWeb在线用户统计
response.sendRedirect(request.getRequestURI());
return;
}
}else{
response.sendRedirect("index.jsp");
if(obj==null||!(obj instanceof PersonInfo)){
return false;
}
return username.equals(((PersonInfo)obj).getUsername());
import javax.servlet.http.HttpSessionEvent;
java web 在线用户统计
FilterAndListene 2011-02-16 17:24:24 阅读165 评论0 字号:大中小 订阅
看一下效果图先:
页面有点简陋,哈哈..大家将就着看吧,我美工不行啊,哈哈...
这个也是用了各种Listener实现的,看一下代码吧,相信一看都能明白了。
%>
<tr>
<td><%=id %></td>
<td><%=person==null ? " " : person.getUsername() %></td>
<td><%=DateFormat.getTimeInstance().format(sess.getCreationTime()) %></td>
Java开发在线人数统计功能
HttpSessionListener是个session监听器,它有两个方法:public void sessionCreated(HttpSessionEvent event){} 和 public voidsessionDestroyed(HttpSessionEvent event){} , 前者是在session被创建的时候执行,后者是在session被销毁的时候执行,通过对当前session的监听,达到统计在线人数的效果。
代码如下:首先建一个监听类 CountLineListener,实现 HttpSessionListener 接口,并添加未实现的方法 sessionCreated(){} 和 sessionDestroyed(){}:[java]package com.test.listener;import javax.servlet.ServletContext;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class CountLineListener implements HttpSessionListener{/************ 创建session时调用*/public void sessionCreated(HttpSessionEvent event) {System.out.println("创建session......");ServletContext context=event.getSession().getServletContext();Integer count=(Integer)context.getAttribute("count");if(count==null){count=new Integer(1);}else{int co = count.intValue( );count= new Integer(co+1);}System.out.println("当前用户人数:"+count);context.setAttribute("count", count);//保存人数}/************* 销毁session时调用*/public void sessionDestroyed(HttpSessionEvent event) {System.out.println("销毁session......");ServletContext context=event.getSession().getServletContext(); Integer count=(Integer)context.getAttribute("count");int co=count.intValue();count=new Integer(co-1);context.setAttribute("count", count);System.out.println("当前用户人数:"+count);}}监听类写好了,接下来就要在web.xml里配置此监听类,添加代码:[java]<listener><listener-class>com.test.listener.CountLineListener</listener-class> </listener>针对以上可以结合 servlet 写个小例子:(1) login.jsp[html]<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"></head><body><form method="POST" action="<%=request.getContextPath()%>/MyServlet"><input type="text" name="username"/><br/><input type="submit" value="登录"/></form></body></html>点击登录---->MyServlet(2) MyServlet.java[java]package com.test.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyServlet 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 {String user= request.getParameter("username");request.getSession().setAttribute("user", user);request.getRequestDispatcher("/index.jsp").forward(request,response); }}登录就跳到首页index.jsp,显示在线人数:[html]<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"></head><body>这里是首页,当前访问量:<%ServletContext context=session.getServletContext();Integer count=(Integer)context.getAttribute("count");%><%=count %><br/>当前用户:${er }</body></html>这样就简单实现统计当前在线人数的效果了。
通过代码示例跟我学J2EE Web组件应用开发项目综合训练实例(第3部分)
目录1.1J2EE Web组件应用开发项目综合训练实例(第3部分) (2)1.1.1添加系统后台相关的数据访问功能组件 (2)1.1.2修改Servlet程序并应用数据查询方法进行数据库表查询 (5)1.1.3在项目中应用JavaScript脚本程序实现表单验证 (9)1.1J2EE Web组件应用开发项目综合训练实例(第3部分)1.1.1添加系统后台相关的数据访问功能组件1、添加对用户信息进行操作的DAO类(1)类名称为UserInfoDAO,包名称为com.px1987.webdemo.dao(2)编程该类package com.px1987.webdemo.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class UserInfoDAO {ConnectionDataBase connectionDataBase=null;public UserInfoDAO() {connectionDataBase=new ConnectionDataBase();}/*** 下面的方法是实现登录查询的* @param oneUserInfoPO* @return*/public UserInfoPO queryOneUserInfoPO(UserInfoPO oneUserInfoPO){Connection jdbcConnection=null;PreparedStatement preparedStatement =null;ResultSet resultSet =null;UserInfoPO returnResultPO=null;/*** (1)获得JDBC连接对象*/jdbcConnection=connectionDataBase.getJDBCConnection();/*** (2)构建查询的SQL语句并转换为PreparedStatement对象*/String queryUserInfoSQL="select * from personinfo where loginName=? and loginPassWord=? and personType=?";try{try {preparedStatement=jdbcConnection.prepareStatement(queryUserInfoSQL);} catch (SQLException e) {e.printStackTrace();}/*** (3)执行相关的SQL语句,并获得返回的结果ResultSet对象*/try {preparedStatement.setString(1, oneUserInfoPO.getLoginName());preparedStatement.setString(2, oneUserInfoPO.getLoginPassWord());preparedStatement.setInt(3, oneUserInfoPO.getPersonType());resultSet=preparedStatement.executeQuery();} catch (SQLException e) {e.printStackTrace();}/*** (4)识别返回的结果中是否有数据*/try {if(!resultSet.next()){return null;}returnResultPO=new UserInfoPO();/*** 从resultSet对象中获得该记录的各个字段值,并保存到returnResultPO对象中* 自己实现吧!*/} catch (SQLException e) {e.printStackTrace();}}finally{try {jdbcConnection.close();} catch (SQLException e) {e.printStackTrace();}}return returnResultPO;}}1.1.2修改Servlet程序并应用数据查询方法进行数据库表查询package com.px1987.webdemo.servlet;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import erInfoDAO;import erInfoPO;public class UserInfoManageServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*** 首先获得请求的类型编号*/request.setCharacterEncoding("gbk");String requestType=request.getParameter("requestType");/*** 再识别请求的类型,分别进行转发到目标方法中进行对应的功能处理*/switch(Integer.parseInt(requestType)){case 1: //目前是登录请求吗?doLoginRequest(request, response);break;case 2: //目前是注册请求吗?doRegisterRequest(request, response);break;case 3: //目前是修改密码请求吗?doUpdatePassWordRequest(request, response);break;}}/*** 下面的方法是处理注册请求* @param request* @param response* @throws ServletException* @throws IOException*/public void doRegisterRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}/*** 下面的方法是处修改密码请求* @param request* @param response* @throws ServletException* @throws IOException*/public void doUpdatePassWordRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}/*** 下面的方法是处修登录请求* @param request* @param response* @throws ServletException* @throws IOException*/public void doLoginRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*** (1)获得请求的参数——登录表单的各个参数*/String verifyCode=request.getParameter("verifyCode");String userName=request.getParameter("userName");String userPassWord=request.getParameter("userPassWord");String userType=request.getParameter("userType");/*** (2)对请求的参数进行“功能处理”*/UserInfoPO oneUserInfoPO=new UserInfoPO();oneUserInfoPO.setLoginName(userName);oneUserInfoPO.setLoginPassWord(userPassWord);oneUserInfoPO.setPersonType(Integer.parseInt(userType));UserInfoPO returnResultPO=null;UserInfoDAO oneUserInfoDAO=new UserInfoDAO();returnResultPO=oneUserInfoDAO.queryOneUserInfoPO(oneUserInfoPO);boolean checkLoginResult=(returnResultPO!=null);/*** (3)根据处理后的结果状态(正确或者错误)分别显示不同的信息(或者跳转不同的页面)*/RequestDispatcher requestDispatcher=null;String gotoTargetPageFile=null;if(checkLoginResult){gotoTargetPageFile="/indexContent/index.jsp";}else{request.setAttribute("errorInfoText", "你所输入的帐号或者密码不正确,请重新登录!");gotoTargetPageFile="/errorDeal/showErrorInfo.jsp";}requestDispatcher=request.getRequestDispatcher(gotoTargetPageFile);requestDispatcher.forward(request, response);}}1.1.3在项目中应用JavaScript脚本程序实现表单验证1、JavaScript语言相关的知识(1)JavaScript脚本语言、基于对象(2)函数定义function(3)数据(变量)定义不需要给定数据类型(4)对象及内置对象2、主要的用途用于表单数据验证——检查3、在项目在应用JavaScript进行表单验证(1)新建一个javascript目录(2)在javascript目录内添加一个checkFormValid.js(3)在userLogin.jsp页面链接该checkFormValid.js<script language="javascript" type="text/javascript"src="${pageContext.request.contextPath}/javascript/checkFormValid.js" ></script>(4)修改<form>标签<form action="${pageContext.request.contextPath}/userInfoManageServlet" method="post"name="userLoginForm" onsubmit="return checkLoginFormValid(this);"> (5)在表单提交中进行检查的checkLoginFormValid代码function checkLoginFormValid(loginForm){var verifyCodeInputed=loginForm.verifyCode.value;if((verifyCodeInputed ==null) ||(verifyCodeInputed.length ==0)||(verifyCodeInputed =="")){window.alert("表单中的验证码不能为空,请输入有效的验证码!");loginForm.verifyCode.focus();return false;}if(verifyCodeInputed.length != 6){window.alert("表单中的验证码必须为6个字符!");loginForm.verifyCode.focus();return false;}var userNameInputed=erName.value;if((userNameInputed ==null) ||(userNameInputed.length ==0)||(userNameInputed =="")){window.alert("表单中的登录帐号不能为空,请输入有效的登录帐号!");erName.focus();return false;}var userPassWordInputed=erPassWord.value;if((userPassWordInputed ==null) ||(userPassWordInputed.length ==0)||(userPassWordInputed =="")){window.alert("表单中的登录密码不能为空,请输入有效的登录密码!");erPassWord.focus();return false;}if( (userPassWordInputed.length < 4) ||(userPassWordInputed.length > 8)){window.alert("表单中的登录密码必须为4-8个字符!");erPassWord.focus();return false;}return true;}(6)测试代码的正确性。
跟我学J2EE Web监听器组件——实现Web应用中的任务计划调度的应用实例
1.1实现Web应用中的任务计划调度的应用实例1、问题的背景(1)什么是任务计划调度我们都用过Windows的任务计划,同时也自己曾写过时钟报警、系统自动关机等趣味程序,哪如何在Web工程中实现类似的功能呢。
任务调度是大型J2EE web应用中常见的工作。
开发者希望以指定的间隔时间执行各类操作,并完成一些无需用户输入的任务。
(2)为何需要任务调度在Web应用中,大多数任务是以一种“防止用户长时间等待”的方式完成的。
在Google 搜索这样的例子中,减少等待时间对用户体验来说至关重要。
异步任务的一种解决方案是在用户提交后生成一个线程(来处理异步任务),但这也不能解决那些需要以一定时间间隔重复运行任务、或在每天的指定时间运行任务的情况。
(3)应用的示例让我们从一个数据库报表的例子来看看任务调度能如何帮助改善系统设计。
报表可能是错综复杂的,这取决于用户所需数据的种类,以及是否需要从一个或多个数据库收集大量数据。
用户可能需要很长时间来运行这样的“按需”报表。
因此,我们向这个报表示例中添加任务调度机制,以便用户可以安排在任何他们需要的时间生成报表,并以PDF或其他格式在email中发送。
用户可以让报表在每天的凌晨2:22,系统正处于低负荷时运行;也可以选择只在特定时间运行一次。
通过在报表应用中加入任务调度,我们可以为产品添加一项有用的功能,并改善用户体验。
2、在Java中定时执行任务的三种方法(1)java.util.Timer这个方法应该是最常用的,不过这个方法需要手工启动我们的任务。
Timer timer=new Timer();timer.schedule(new ListByDayTimerTask(),10000,86400000);注意:在这里的ListByDayTimerTask类必须extends TimerTask里面的run()方法。
(2)ServletContextListener这个方法在web容器环境比较方便,这样,在web server启动后就可以自动运行该任务,不需要手工操作。
J2EE 课程设计实训项目——《蓝梦网上商城》——应用J2EE Listener监听器组件显示在线用户总数
J2EE 课程设计实训项目——《蓝梦网上商城》——应用J2EE Listener 监听器组件显示在线用户总数1.1.1应用J2EE Listener组件显示在线用户数1、添加一个在线用户计数的组件(1)类名称为OnLineCounter,包名称为com.px1987.webshop.control.bean(2)编程该OnLineCounter组件package com.px1987.webshop.control.bean;import java.util.*;import erInfoVO;import com.px1987.webshop.control.listener.CounterOnLineVisitorListener;public class OnLineCounter{private static int onLine = 0;public static int getOnLine(){return onLine;}public static void addOneUser(){onLine++;}public static void reduceOneUser(){onLine--;}public static List getOnLineUserNameList(){Iterator onLineUserList=CounterOnLineVisitorListener.getOnLineUserList().iterator();List onLineUserNameList=new ArrayList();while(onLineUserList.hasNext()){UserInfoVO oneLoginUserInfoVO=(UserInfoVO)onLineUserList.next();onLineUserNameList.add(oneLoginUserInfoVO.getUserName());}return onLineUserNameList;}public static int getOnLineMemberUserNumber(){return CounterOnLineVisitorListener.getOnLineUserList().size();}}2、添加CounterOnLineVisitorListener监听器组件(1)类名称为CounterOnLineVisitorListener,包名称为com.px1987.webshop.control.listener,并且实现javax.servlet.http.HttpSessionListener和HttpSessionAttributeListener等接口(2)部署该CounterOnLineVisitorListener监听器组件<listener><listener-class>com.px1987.webshop.control.listener.CounterOnLineVisitorListener </listener-class></listener>(3)编程该Listener监听器组件package com.px1987.webshop.control.listener;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import com.px1987.webshop.control.bean.OnLineCounter;import erInfoVO;import java.util.*;public class CounterOnLineVisitorListener implementsHttpSessionAttributeListener, HttpSessionListener{private static List onLineUserList=new ArrayList();public void sessionCreated(HttpSessionEvent se){OnLineCounter.addOneUser();}public void sessionDestroyed(HttpSessionEvent se){OnLineCounter.reduceOneUser();}public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent){//识别该用户是否已经登录if(httpSessionBindingEvent.getName().equals("oneUserInfoVO")){UserInfoVO nowLoginUserInfo=(UserInfoVO)httpSessionBindingEvent.getValue();onLineUserList.add(nowLoginUserInfo);}}public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent){if(httpSessionBindingEvent.getName().equals("oneUserInfoVO")){UserInfoVO nowLoginUserInfo=(UserInfoVO)httpSessionBindingEvent.getValue();onLineUserList.remove(nowLoginUserInfo);}}public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent){}public static List getOnLineUserList(){return onLineUserList;}}3、添加对Cookie进行操作的JavaBean组件(1)类名称为ReadWriteCookie,包名称为com.px1987.webshop.control.bean(2)编程该组件package com.px1987.webshop.control.bean;import javax.servlet.*;import javax.servlet.jsp.*;import javax.servlet.http.*;import java.util.*;import com.px1987.webshop.business.vobject.*;public class ReadWriteCookie {private PageContext pageContext=null;Cookie lastAccessCookie=null;HttpServletRequest request=null;HttpServletResponse response=null;HttpSession session=null;ServletContext application=null;String nowDateString=null;UserInfoBaseVO oneUserInfoVO=null;String lastAccessDateString=null;String nowBrowseingUserName=null;String onLineGuestCounter="0";public ReadWriteCookie(){}public ReadWriteCookie(PageContext pageContext) {this.pageContext=pageContext;request=(HttpServletRequest)pageContext.getRequest();response=(HttpServletResponse)pageContext.getResponse();session=request.getSession();application=pageContext.getServletContext();}public void operateCookie(){Date nowDate=new Date();nowDateString=nowDate.toLocaleString();//取得Cookie资料(因为在Cookie中可以存储多个信息)Cookie[] cookies = request.getCookies();if(cookies==null){//建立Cookie变量lastAccessCookie = new Cookie("lastAccessDate", nowDateString);//设定Cookie在用户机器硬盘上的存活期为1年。
springboot用监听器统计在线人数案例分析
springboot⽤监听器统计在线⼈数案例分析本⽂在springboot 的项⽬,⽤HttpSessionListener 监听器(监听器的其中⼀种)统计在线⼈数,实质是统计session 的数量。
思路很简单,但是有个细节没处理好,让我调试了⼤半天,才把bug搞好。
先写个HttpSessionListener 监听器。
count 是session的数量(⼈数),session 创建的时候,会触发监听器的sessionCreated ⽅法,session销毁的时候,会触发监听器的sessionDestroyed ⽅法。
在监听器中计算完⼈数count,把他放进servletContext(可以理解为⼀个仓库,任意请求可以存储和获取⾥⾯的属性)。
注意监听器加上@WebListener,这样就不⽤配置。
@WebListenerpublic class OnLineCount implements HttpSessionListener {public int count=0;//记录session的数量//监听session的创建,synchronized 防并发bugpublic synchronized void sessionCreated(HttpSessionEvent arg0) {System.out.println("【HttpSessionListener监听器】count++ 增加");count++;arg0.getSession().getServletContext().setAttribute("count", count);}@Overridepublic synchronized void sessionDestroyed(HttpSessionEvent arg0) {//监听session的撤销System.out.println("【HttpSessionListener监听器】count-- 减少");count--;arg0.getSession().getServletContext().setAttribute("count", count);}}接着写⼀个查询session 数量的controller,我开始的时候是像下⾯这样写的,是错误的!从servletContext 中取出count ,把count返回前端。
跟我学J2EE Web监听器组件——加载Web应用系统的全局工作参数的应用实例
1.1加载Web应用系统的全局工作参数1、本示例的应用背景在Web应用系统中一般都会存在有许多全局工作参数,为了减少对全局工作参数的重复解析,可以在Web应用系统启动时一次性加载这些配置参数并缓存起来,在后台的Servlet 及业务功能的JavaBean组件中获得这些工作参数。
2、实现的主要方法是利用监听器技术——实现ServletContextListener接口3、实现该功能——在WebScheduleTaskListener程序中添加下面的代码package com.px1987.webcrm.listener;import java.util.HashMap;import java.util.Map;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import com.px1987.webcrm.model.task.ScheduleTask;public class WebScheduleTaskListener implements ServletContextListener {private java.util.Timer oneTaskTimer = null;private Map<String,String> allCommonParameterHashMap=null;public WebScheduleTaskListener() {}@Overridepublic void contextDestroyed(ServletContextEvent event) {if(oneTaskTimer!=null){oneTaskTimer.cancel();oneTaskTimer=null;}allCommonParameterHashMap.clear();allCommonParameterHashMap=null;}@Overridepublic void contextInitialized(ServletContextEvent event) {oneTaskTimer = new java.util.Timer(true);oneTaskTimer.schedule(new ScheduleTask(),0,60*60*1000); //ms//为了减少代码的复杂度,省掉了对XML解析的代码allCommonParameterHashMap=new HashMap<String,String>();allCommonParameterHashMap.put("JDBC_DBDriver_ClassName","com.mysql.jdbc.D river");allCommonParameterHashMap.put("JDBC_DSN_URL","jdbc:mysql://localhost:3306/w ebcrm");allCommonParameterHashMap.put("JDBC_dbUserName","root");allCommonParameterHashMap.put("JDBC_dbUserPassWord","root");event.getServletContext().setAttribute("allCommonParameter",allCommonParameterHashMap);}}4、在某个Servlet组件中获得由监听器解析的工作参数public void getCommonParameter() {Map<String,String> allCommonParameterHashMap=null;ServletContext application=this.getServletContext(); allCommonParameterHashMap=(HashMap<String,String>)application.getAttribute("allCommonParameter");String JDBC_DBDriver_ClassName=allCommonParameterHashMap.get("JDBC_DBDriver_ClassName");String JDBC_DSN_URL=allCommonParameterHashMap.get("JDBC_DSN_URL");StringJDBC_dbUserName=allCommonParameterHashMap.get("JDBC_dbUserName");String JDBC_dbUserPassWord=allCommonParameterHashMap.get("JDBC_dbUserPassWord");System.out.println("JDBC_DBDriver_ClassName="+JDBC_DBDriver_ClassName);System.out.println("JDBC_DSN_URL="+JDBC_DSN_URL);System.out.println("JDBC_dbUserName="+JDBC_dbUserName);System.out.println("JDBC_dbUserPassWord="+JDBC_dbUserPassWord);}5、再测试一下——进入系统登录功能页面。
javaweb中实现在线人数统计
javaweb中实现在线⼈数统计session并不是浏览器关闭时销毁的,⽽是在session失效的时候销毁下列代码就是监测session创建、销毁package com.my.count;import javax.servlet.http.*;public class SessionCounter implements HttpSessionListener {private static int activeSessions = 0;//session创建时执⾏public void sessionCreated(HttpSessionEvent se) {activeSessions++;}//session销毁时执⾏public void sessionDestroyed(HttpSessionEvent se) {if (activeSessions > 0)activeSessions--;}//获取活动的session个数(在线⼈数)public static int getActiveSessions() {return activeSessions;}}接下来就是配置web.xml<listener><listener-class>com.my.count.SessionCounter //这⾥是包名加类名</listener-class></listener>接下来就可以在jsp页⾯中使⽤<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ page import="com.my.count.SessionCounter"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'ApplicationTest.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>在线⼈数为:<%=SessionCounter.getActiveSessions() %></body></html>。
利用java监听器实现在线人数统计
利⽤java监听器实现在线⼈数统计本⽂实例为⼤家分享了java监听器实现在线⼈数统计的具体代码,供⼤家参考,具体内容如下1.在⼯程中创建监听类SessionListener 并且实现HttpSessionListener接⼝,代码如下import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class SessionListener 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;}}2.配置web.xml<listener><description>session监听器</description><listener-class>com.xxx.SessionListener</listener-class></listener>3.在JSP页⾯中显⽰在线⼈数<%int count=com.xxx.SessionListener.getCount();out.println("在线⼈数:"+count);%>注意:servlet中对session的监听有很多接⼝,功能很灵活,最常⽤的是监听Session和Attribute。
J2EE 用监听器实现同一用户只能有一个在线
J2EE 用监听器实现同一用户只能有一个在线这里我们研究的是已登陆或将要登陆的用户,游客不在研究的范围之内。
这一点大家应当很简单就能理解的吧。
那么我们应当怎样去实现同一用户只能有一个在线这样的一个小功能呢?有人可能就会这样设想了:\"这不是很容易吗?只要在数据库中用一个字段来标志用户的状态就行了,比如假如用户登陆了就将状态设为1,退出了就将这个用户的状态设为0,OK,搞定。
\" 但是,事实上是不是这样呢?其实不全是。
为什么这样说呢?其实假如你的主意跟上面那样或相像的话,应当说是犯了一个比较严峻的错误。
我还是举个例子来解释吧。
现在绝大多数的网站中都有登陆和退出两项功能吧?好了,上面的设想仅仅是针对这两项功能来说用法。
但是你有没有想过?如果现在有一个用户正常登陆上了,但是这回状况有点特别了,这个用户登陆上但是这个用户就偏偏不点退出,然后就走了或者离开了或者忙别的事情去了,反正这个用户登陆上就不管别的了,他就挂在那里。
这种状况是允许发生了,而且也是比较频繁的一种状况。
那假如是这种状况,上面的那种设想你还认为是正确的吗?那就不正确了!对session有过一点了解的人员应当都知道,在java中session的默认的销毁时光是大于或等于30分钟,假如你对session的生命周期不做任何配置的话,根据上面的设想,那么只要用户登陆上之后,这时该用户的状态设置为1,在大于30分钟的时光内假如该用户没有向服务器端发起任何哀求的话,那么这个session就会被销毁掉,注重了,这时session生命周期结束以后自动销毁的,并不是用户点退出按钮来销毁的,那这样就不能触发用户退出大事,那这个用户的状态你就没法转变了,也就是说,假如根据上面的设想,你想想,假如碰到这样的状况,那这个用户的状态就向来都是1了,那这个用户以后再想登陆就再也登陆不上了。
很显然,这样是不对的。
那应当怎样来解决这个问题呢?大家看到我这篇文章的标题就应当知道了的吧。
HttpsessionListener实现在线人数统计
HttpsessionListener实现在线⼈数统计最近在学servlet jsp,⽤的林信良先⽣的 jsp&servlet 这本书,在第五章有道在线⼈数统计的课后题完成,做⼀次记录.实际效果:⼀:⽤户类:1package cc.openhome.controler;23public class User {4private String name;5private String sessionId;6private String ip;7private String firstTime;8private String userAgent;9public User(){1011 }1213public String getName() {14return name;15 }1617public String getIp() {18return ip;19 }2021public String getSessionId() {22return sessionId;23 }2425public String getFirstTime() {26return firstTime;27 }2829public String getUserAgent() {30return userAgent;31 }3233public void setUserAgent(String userAgent) {erAgent = userAgent;35 }3637public void setName(String name) { = name;39 }4041public void setFirstTime(String firstTime) {42this.firstTime = firstTime;43 }4445public void setIp(String ip) {46this.ip = ip;47 }4849public void setSessionId(String sessionId) {50this.sessionId = sessionId;51 }5253 }public class User⼆:登录页⾯:1package cc.openhome.controler;23import javax.servlet.ServletException;4import javax.servlet.annotation.WebServlet;5import javax.servlet.http.Cookie;6import javax.servlet.http.HttpServlet;7import javax.servlet.http.HttpServletRequest;8import javax.servlet.http.HttpServletResponse;9import java.io.IOException;10import java.text.SimpleDateFormat;11import java.util.*;1213 @WebServlet("/login.do")14public class Login extends HttpServlet {1516private ArrayList<User> ulist;17private Map<String,String> users;18public Login(){19 users = new HashMap<String,String>();20 users.put("liming","123456");21 users.put("⼩猪","123456");22 users.put("⼩林","123456");23 }2425 @Override26protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2728 req.setCharacterEncoding("UTF-8");29 String uname = req.getParameter("user");30 String pssd = req.getParameter("pwd");3132 String page = "login.html";3334if (users.containsKey(uname) && users.get(uname).equals(pssd)) {35 req.getSession().setAttribute("uname", uname);36 String sessionId = req.getSession().getId();37 ArrayList<User> ulist = (ArrayList<User>) getServletContext().getAttribute("ulist");38if(ulist == null){39 ulist = new ArrayList<User>();40 getServletContext().setAttribute("ulist",ulist);41 }42 User u = new User();43 u.setSessionId(sessionId);44 u.setName(uname);45 u.setIp(req.getRemoteAddr());46 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:MM:ss");47 u.setFirstTime(df.format(new Date()));48 u.setUserAgent(req.getHeader("user-agent"));49 ulist.add(u);50 page = "welcome.view";51 }52 resp.sendRedirect(page);53 }54 }三:统计在线⼈数:1package cc.openhome.controler;24import javax.servlet.ServletContext;5import javax.servlet.annotation.WebListener;6import javax.servlet.http.HttpSession;7import javax.servlet.http.HttpSessionEvent;8import javax.servlet.http.HttpSessionListener;9import java.util.List;1011 @WebListener12public class OnlineUserCounter implements HttpSessionListener {13private static int counter;1415public static int getCounter(){16return counter;17 }1819 @Override20public void sessionCreated(HttpSessionEvent se) {21 System.out.println("新建session: "+se.getSession().getId());2223 }2425 @Override26public void sessionDestroyed(HttpSessionEvent se) {27 HttpSession session = se.getSession();28 ServletContext application = session.getServletContext();29 String username = (String) session.getAttribute("username");3031 List ulist = (List)32 application.getAttribute("ulist");33 ulist.remove(username);34 System.out.println(username+"已经退出!");3536 }37 }四:登录成功页⾯显⽰1package cc.openhome.view;23import er;4import cc.openhome.controler.OnlineUserCounter;5import javax.servlet.ServletException;6import javax.servlet.annotation.WebServlet;7import javax.servlet.http.HttpServlet;8import javax.servlet.http.HttpServletRequest;9import javax.servlet.http.HttpServletResponse;10import javax.servlet.http.HttpSession;11import java.io.IOException;12import java.io.PrintWriter;13import java.util.ArrayList;14import java.util.Iterator;15import java.util.List;1617 @WebServlet("/welcome.view")18public class Welcome extends HttpServlet {19 @Override20protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2122 resp.setContentType("text/html;charset=UTF-8");23 PrintWriter out = resp.getWriter();24 HttpSession session = req.getSession(false);25 out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01'" +26 "Transitional//EN");27 out.println("<html>");28 out.println("<head>");29 out.println("<title>欢迎</title>");30 out.println("</head>");31 out.println("<body>");3233 ArrayList<User> ul = (ArrayList <User>) getServletContext().getAttribute("ulist");34 out.println("<h1> ⽬前在线⼈数 "+ ul.size() +"⼈</h1>");35 Iterator<User> it = ul.iterator();36while (it.hasNext()){37 User u = it.next();38 out.println("<h4>id: "+ u.getSessionId() +" </h4>");39 out.println("<h4>⽤户: "+ u.getName()+" </h4>");40 out.println("<h4>ip: "+ u.getIp() +" </h4>");41 out.println("<h4>访问时间: "+ u.getFirstTime() +" </h4>");42 out.println("<h4>浏览器信息: "+ u.getUserAgent() +" </h4>");43 out.println("<br>");44 }4546 out.println("</body>");47 out.println("</html>");48 out.close();4950 }51 }五:登录的前端页⾯:1<!DOCTYPE html>2<html lang="en">3<head>4<meta charset="UTF-8">5<title>登录</title>6</head>7<body>8<form action="login.do" method="post">9⽤户名: <input type="text" name="user"><br>10密码: <input type="password" name="pwd"><br>11提交: <input type= "submit">12</form>13</body>14</html>longin.html六:实际效果:七:总结1.httpsessionListener ⼯作机制2,ArrayList 使⽤⼋:不⾜之处:1页⾯展⽰⽤的是:在servlet中⽤的html,还没有学习jsp.2.已知问题:同⼀个⽤户同时登录,重新显⽰为⼀新⽤户,后⾯再改参考资料:本⼈菜鸟⼀枚,如有问题请⼤神不吝赐教!。
java页面在线访问人数统计和在线登录人数统计
java页⾯在线访问⼈数统计和在线登录⼈数统计java 页⾯在线访问⼈数统计和在线登录⼈数统计OnlineSessionListener监听器(实现HttpSessionListener)接⼝来实现页⾯在线访问⼈数统计,当有⽤户访问到页⾯就会创建⼀个session,此时会触发public voidsessionCreated(HttpSessionEvent se)⽅法,如果session失效,此时会触发public void sessionDestroyed(HttpSessionEvent se)⽅法。
在此⽅法⾥我们⽤OnlineList进⾏在线访问⼈数的统计public class OnlineList {private static final OnlineList onlineList = new OnlineList();private int maxSession;private int activeSession;private OnlineList(){//v = new Vector();}public static OnlineList getInstance(){return onlineList;}public void addSession(){activeSession++;if(activeSession>=maxSession){maxSession=activeSession;}}public void delSession(){if(activeSession > 0)activeSession--;}public int getActiveSession(){return activeSession;}public int getmaxSession(){return maxSession;}}public class OnlineSessionListener implements HttpSessionListener {private OnlineList ol = OnlineList.getInstance();public void sessionCreated(HttpSessionEvent arg0) {ol.addSession();}public void sessionDestroyed(HttpSessionEvent arg0) {ol.delSession();}}⽤UserListener监听器(实现HttpSessionAttributeListener接⼝)来实现在线登录⼈数统计,当有⽤户添加到session中,监听器就调⽤public void valueBound(HttpSessionBindingEventevent)⽅法。
统计在线用户数
统计在线用户数使用HttpSessionListener统计在线人数import javax.servlet.http.*;public class SessionCounter implements HttpSessionListener{//记录当前活跃的session个数private static int activeSessions = 0;//每次在session创建的时候,将session个数加1public void sessionCreated(HttpSessionEvent se){activeSessions++;}//每次在session销毁的时候,将session个数减1public void sessionDestroyed(HttpSessionEvent se){if(activeSessions > 0){activeSessions--;}}//提供静态方法获取当前活跃的session个数public static int getActiveSessions() {return activeSessions;}}web.xml中对监听器进行配置:<listener><listener-class>stat.SessionCounter</listener-class></listener>其他方法:方法很多:(共6种)1.用session超时,session为null就表示下线了2.也可以采用数据库中设置临时表来处理一个用户登陆时向表中插进一条记录,用户离开时候删除该记录如想统计在线人数,简单地执行select count(*) from table... 即可3.application对象中可以记住现在的人数,application的生命周期和服务器的生命周期一样长。
4.还有一种方法要用到一个文件global.jsa ,方法是(在JSP中)是sessionDestroy(),其中它是以session对象为参数的。
用java实现统计在线人数
{ } } 2、要做的就是实现任务类 OnlineCounter 了 public class OnlineCounter { private static List list = new ArrayList(); private static List list1 = new ArrayList(); private OnlineCounter() { } // 统计当前在线会员人数 public static void doUser(Object object,boolean bl) { //得到用户当前访问时间 String nowtime = getTime("mm:ss"); //Str 数组用来存放用户的 id 和访问时间 String[] str = new String; str[0] = object.toString();
str[1] = nowtime; //temp 数组用来临时存放从 list 里面取出的用户的 id 和访问时间 String[] temp = new String; //循环 list for (int i = 0; i < list.size(); i++) { temp = (String[])list.get(i); //如果从 list 里面取出的用户 ip 和 str 里面存放的 id 相同,则更新访问时间 if(bl==false && temp[0].equals(str[0])) { list.set(i,str); return; } //如果监听类中穿过来 bl==true,则认为不在线 if(bl==true && temp[0].equals(str[0])) { list.remove(i); } }
servlet监听完成统计在线人数,显示在线人员列表(附源码)
String password = request.getParameter("password");
ServletContext application = this.getServletContext();//取得application对象
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public UserPOJO(int id, String username, String password) {
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
res.close();
pstate.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
//取得application对象
application.setAttribute("allUser", list);
//将集合设置到application范围属性中去
}
public vSessionBindingEvent se) {
List<String> list = (List<String>)application.getAttribute("allUser");
案例9 应用Servlet 监听器统计网站访问量_Java Web程序设计案例教程_[共2页]
④ counter.jsp 关键代码如下:
<h2>当前在线人数为:<%=utils.OnlineCounter.getOnline()%></h2>
7.4.2 案例 9 应用 Servlet 监听器统计网站访问量
【设计要求】 在案例 8 的基础上修改,实现网站计数器的功能。用来计算访问该网站(Web 应用)的
总人数。实现当服务器重启时能够连续计数的功能。 【学习目标】 灵活掌握应用上下文监听器与会话监听器的运用方法。 【思路分析】 (1)网站访问量保存在 Web 应用属性中。 (2)每当有 session 创建时,使网站的访问量增 1。 (3)当服务器关闭时,将 Web 应用属性中保存的访问量写入服务器端的磁盘文件中。 (4)当服务器启动时,从该磁盘文件中读取初始化数据到 Web 应用属性中。 【实施过程】 (1)创建应用上下文监听器——ApplCounterListener.java。当 Web 应用启动时,读取指定磁
技
3
// 创建 session 时调用此方法
术
4
OnlineCounter.raise();
5}
6 public void sessionDestroyed(HttpSessionEvent e ){
7
// session 卸载时调用此方法
8
OnlineCounter.reduce();
9}
10 }
</listener>
7章
③ OnlineCounterListener .java(在 listeners 包中创建)关键代码如下:
S e rvlet
1 public class OnlineCounterListener implements HttpSessionListener {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1统计计算在线用户数量的监听器例1、本实例的应用背景在网站中经常需要进行在线人数的统计。
过去的一般做法是结合登录和退出功能,即当用户输入用户名密码进行登录的时候计数器加1,然后当用户点击退出按钮退出系统的时候计数器减1。
这种处理方式存在一些缺点,例如:用户正常登录后,可能会忘记点击退出按钮,而直接关闭浏览器,导致计数器减1的操作没有及时执行;网站上还经常有一些内容是不需要登录就可以访问的,在这种情况下也无法使用上面的方法进行在线人数统计。
我们可以利用Servlet规范中定义的事件监听器(Listener)来解决这个问题,实现“更准确”的在线人数统计功能。
2、HttpSessionListener事件监听器对每一个正在访问的用户,J2EE应用服务器会为其建立一个对应的HttpSession对象。
当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象,并触发HttpSession创建事件,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。
相反,当这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,触发HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。
3、实现的基本原理可见,对应于一个用户访问的开始和结束,相应的有sessionCreated方法和sessionDestroyed 方法执行。
这样,我们只需要在HttpSessionListener实现类的sessionCreated方法中让计数器加1,在sessionDestroyed方法中让计数器减1,就轻松实现了网站在线人数的统计功能。
4、编程实现----实现对HttpSessionListener事件监听器程序(1)在项目中添加一个HttpSessionListener事件监听器程序类类名称为OnLineCounterListener ,包名称为com.px1987.webcrm.listener,实现HttpSessionListener、javax.servlet.http.HttpSessionAttributeListener接口(2)将产生出下面的程序结果(3)编程该程序package com.px1987.webcrm.listener;import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import erInfoVO;import com.px1987.webcrm.util.OnLineCounter;public class OnLineCounterListener implements HttpSessionListener, HttpSessionAttributeListener {public OnLineCounterListener() {}@Overridepublic void sessionCreated(HttpSessionEvent arg0) {OnLineCounter.incrementCounter();}@Overridepublic void sessionDestroyed(HttpSessionEvent arg0) {OnLineCounter.reduceCounter();}@Overridepublic void attributeAdded(HttpSessionBindingEvent event) {if("oneUserInfoVO".equals(event.getName())){UserInfoVO oneUserInfoVO=(UserInfoVO)event.getValue();OnLineCounter.addOneUserInfoVOToList(oneUserInfoVO);}}@Overridepublic void attributeRemoved(HttpSessionBindingEvent event) { if("oneUserInfoVO".equals(event.getName())){UserInfoVO oneUserInfoVO=(UserInfoVO)event.getValue();OnLineCounter.removeOneUserInfoVOFromList(oneUserInfoVO);}}@Overridepublic void attributeReplaced(HttpSessionBindingEvent arg0) {}}由于session监听的是HTTP连接,只要有用户与server连接,就算连接的是一个空白的jsp页面,也会触发session事件,所以此处的session实际上指的是connection。
(4)部署该监听器<listener><listener-class>com.px1987.webcrm.listener.OnLineCounterListener</listener-class></listener>5、在项目中添加一个计数器功能类(1)类名称为OnLineCounter,包名称为com.px1987.webcrm.util(2)编程该计数器类package com.px1987.webcrm.util;import java.util.Vector;import java.util.List;import erInfoVO;public class OnLineCounter {private static int onlineUserCounter = 0;private static List<UserInfoVO> onLineLoginUserInfoList=new Vector<UserInfoVO>();public static synchronized List<UserInfoVO> getOnLineLoginUserInfoList() {return OnLineCounter.onLineLoginUserInfoList;}public static synchronized void setOnLineLoginUserInfoList(List<UserInfoVO> onLineLoginUserInfoList) {OnLineCounter.onLineLoginUserInfoList = onLineLoginUserInfoList;}public static synchronized void addOneUserInfoVOToList(UserInfoVO oneUserInfoV o) { OnLineCounter.onLineLoginUserInfoList.add(oneUserInfoV o);}public static synchronized void removeOneUserInfoVOFromList(UserInfoVO oneUserInfoV o) {if(OnLineCounter.onLineLoginUserInfoList.size()==0){return ;}OnLineCounter.onLineLoginUserInfoList.remove(oneUserInfoV o);}public static synchronized String getAllOnLineUserNameList() {int onLineLoginUserConter=OnLineCounter.onLineLoginUserInfoList.size();if(onLineLoginUserConter==0){return "目前还没有用户登录系统";}StringBuffer allUserNames=new StringBuffer();for(int index=0; index <onLineLoginUserConter;index++){UserInfoVO oneUserInfoV o=(UserInfoVO)OnLineCounter.onLineLoginUserInfoList.get(index);String oneUsername=oneUserInfoV o.getUserName();allUserNames.append("<a href='#'>"+oneUsername+"<a>");if(index!=(onLineLoginUserConter-1)){allUserNames.append(",");}}return allUserNames.toString();}public static synchronized void incrementCounter() {OnLineCounter.onlineUserCounter++;}public static synchronized void reduceCounter(){if(OnLineCounter.onlineUserCounter==0){return;}OnLineCounter.onlineUserCounter--;}public static synchronized int getOnLineUserCounter(){return OnLineCounter.onlineUserCounter;}}注意:为什么要将onLineLoginUserInfoList对象设计成static(单例对象)呢?这是因为onLineLoginUserInfoList对象是用于存储和获取在线用户信息的列表,而这个用户列表对于Web应用系统来说应该是同一个,所以将onLineLoginUserInfoList对象设计成单例对象。