今天依然是对项目进行修改和完善。忙里偷闲写了一个统计在线人数并显示名称的功能。写之前上网搜索了一下,没找到太令人满意的实现。把代码贴出来共享一下吧。
以下是一个保存在线人数的类,使用了单例模式
package com.teamlab.tool;
import java.util.Iterator;
import java.util.Vector;
import com.teamlab.entity.Employee;
public class EmployeeList implements java.io.Serializable {
private static final EmployeeList employeeList = new EmployeeList();
private Vector <Employee> v;
private EmployeeList()
{
v = new Vector<Employee>();
}
public static EmployeeList getInstance()
{
return employeeList;
}
public void addEmployee(Employee employee)
{
if(employee!=null)
v.add(employee);
}
public void removeEmployee(Employee employee)
{
if(employee!=null)
v.remove(employee);
}
public Iterator<Employee> getIterator()
{
return v.iterator();
}
public int size()
{
return v.size();
}
}
Employee类实现了HttpSessionBindingListener监听器接口。当Employee对象被放到session中或者从session中移除的时候,容器会自动调用valueBound或者valueUnbound方法。
public class Employee implements java.io.Serializable,HttpSessionBindingListener{
private EmployeeList el = EmployeeList.getInstance();
public void valueBound(HttpSessionBindingEvent arg0) {
el.addEmployee(this);
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
el.removeEmployee(this);
}
}
在Action中声明两个变量并设置相应的get和set方法
private EmployeeList employeeList = EmployeeList.getInstance();
private Iterator<Employee> el = employeeList.getIterator();
在jsp页面中就可以通过OGNL表达式访问它们了
<table cellpadding="3" cellspacing="3"">
<tr>
<td style="white-space: nowrap; vertical-align: top; font-family: Arial; font-size: 18px; color: #1a6309;">
Online (<s:property value="employeeList.size()"/>):
</td>
<td style="padding-top: 8px; vertical-align: top;">
<div class="clearFix">
<s:iterator value="el" >
<div style="padding: 0px 10px 7px 0px; float: left;">
<span class="userLink" style='white-space: nowrap;'>
<a class='linkDescribe' href="#"><s:property value="trueName"/></a>
</span>
</div>
</s:iterator>
</div>
</td>
</tr></table>