思想:
1:统计在线人数。
只是访问了这个网页的人员。 一个session的创建就是一个在线人数+1。让所有人都可以看到。把在线人数到ServletContext中。
2:统计登录人数。
是指输出的正确的用户名和密码以后用户的数量。
登录以后:将用户以xxx为key值(如以user为key)放到session的属性中去。监听器监听到此session属性的变化,
当属性名为user时,登录人数+1并放到ServletContext中
一个session的创建就是一个在线人数+1。让所有人都可以看到。把在线人数放到ServletContext中。
思想:实现HttpSessionListener,在sessionCreated的方法中+1,sessionDestroyed的方法中-1.
publicclass SListener implements HttpSessionListener {
/**
* 当有人访问时,就会有一个session被创建,监听到session创建,count就+1
*/
publicvoidsessionCreated(HttpSessionEvent se) {
//从application中获取已经存在的数量
ServletContext app =se.getSession().getServletContext();
AtomicInteger count = (AtomicInteger)app.getAttribute("online");
if(count==null){
count= newAtomicInteger(1);
}else{
count.addAndGet(1);
}
//再把count放到application中去
app.setAttribute("online",count);
publicvoidsessionDestroyed(HttpSessionEvent se) {
ServletContextapp = se.getSession().getServletContext();
AtomicIntegercount = (AtomicInteger) app.getAttribute("online");
count.addAndGet(-1);
app.setAttribute("online",count);
}
}
是指输入了用户名和密码的用户。
登录以后:将用户以xxx为key值(如以user为key)放到session的属性中去。
就可以监听登录人数。
应该是实现一个HttpSessionAttributeListner监听器。
监听属性的变化:
1:开发登录页面
<body>
主页:<br/>
在线人数:${online.get()}<br/>
登录人数:${logined.get()}<br/>
<c:choose>
<c:when test="${empty sessionScope.user}">
<form name="x"action="<c:url value='/LoginServlet'/>"
method="post">
Name:<input type="text"name="name"><br/>
<input type="submit"value="登录">
form>
c:when>
<c:otherwise>
欢迎你:${user}
<br/>
<a href="<c:url value='/LoginServlet'/>">退出a>
c:otherwise>
c:choose>
body>
html>
开发以一的界面如下:
2:开发登录的servlet
publicclass LoginServlet extends HttpServlet {
/**
* 此方法操作用户的退出
*/
publicvoid doGet(HttpServletRequest request, HttpServletResponseresponse)
throws ServletException, IOException {
// 删除自己放到session中的数据
request.getSession().removeAttribute("user");
// 重定向到登录页面
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
/**
* 此方法操作用户的登录
*/
publicvoid doPost(HttpServletRequest request, HttpServletResponseresponse)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
// 获取用户名
String name = request.getParameter("name");
if (name != null && !name.trim().equals("")) {
System.err.println("登录成功");
request.getSession().setAttribute("user", name.trim());
} else {
System.err.println("你的用户名和密码不对");
}
// 重定向到登录页面
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
}
3:开发属性监听器,用户计算登录人数
package czb.listener;
import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
publicclassSAListener implementsHttpSessionAttributeListener {
// 执行了session.setAttribute("user","")
publicvoidattributeAdded(HttpSessionBindingEvent se) {
// 1判断是否有与user为key的
Stringkey = se.getName();
if (key.equals("user")) {
// 2获取这个ServletContext对象,读取登陆人数
ServletContextapp = se.getSession().getServletContext();
// 3.先获取登陆人数
AtomicIntegercount = (AtomicInteger) app.getAttribute("logined");
if (count == null) {
count= newAtomicInteger(1);
}else{
count.addAndGet(1);
}
// 4.把登陆人数放回到ServletContext
app.setAttribute("logined",count);
}
}
publicvoidattributeRemoved(HttpSessionBindingEvent se) {
// 1判断是否有与user为key的
Stringkey = se.getName();
if (key.equals("user")) {
// 2.获取ServletContext,读取登陆人数
ServletContextapp = se.getSession().getServletContext();
//3.读取登陆人数
AtomicInteger count = (AtomicInteger)app.getAttribute("logined");
count.addAndGet(-1);
//4.修改后的登陆人数放回到app
app.setAttribute("logined",count);
}
}
publicvoid attributeReplaced(HttpSessionBindingEventse) {
}
}