用监听器实现一个统计网站在线人数的功能。
提示:创建一个监听器类,通过ServletContextListener监听,当容器启动时,在ServletContext中添加一个List,用来准备存放在线的用户名;
然后,可以通过HttpSessionAttributeListener监听,当用户登录成功把用户名设置到Session中时同时将用户名存放到ServletContext中的List列表中;
最后通过HttpSessionListener监听,当会话注销时将用户名从应用上下文范围的List列表中删除。
login.jsp
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>欢迎来到此页面</title>
</head>
<body>
<form action="ListenerUser" method="post">
用户名:<input type="text" name="name"/><br/>
<input type="submit" value="登录" />
</form>
</body>
ListenerUser.java
package listener;
import java.awt.Event;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class ListenerUser implements ServletContextListener,HttpSessionAttributeListener,HttpSessionListener{
private ServletContext sc=null;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
@Override
public void contextInitialized(ServletContextEvent sce) {
List<String> list=new ArrayList<String>();
sc=sce.getServletContext();
sc.setAttribute("online", list);
System.out.println("容器已启动~~~");
}
@Override
public void attributeAdded(HttpSessionBindingEvent e) {
List<String> number=(List<String>) sc.getAttribute("online");
if("name".equals(e.getName())){
number.add((String) e.getValue());
}
sc.setAttribute("online", number);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
List<String> num=(List<String>)sc.getAttribute("online");
String username=(String) event.getSession().getAttribute("name");
num.remove(username);
sc.setAttribute("online", num);
}
}
ServletUser.java
package listener;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;import com.sun.xml.internal.ws.Closeable;public class ServletUser extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("utf-8");String name=req.getParameter("name");if(name != null){req.getSession().setAttribute("name", name);}List<String> online=(List<String>) getServletContext().getAttribute("online");resp.setContentType("text/html;charset=utf-8"); PrintWriter pw=resp.getWriter();pw.println("<title>用户列表</title>"); pw.println(" "); pw.println("当前用户是:" + name); int size = online == null ? 0 : online.size(); for (int i = 0; i < size; i++) { if(i > 0){ pw.println("<br>"); } pw.println(i + 1 + "." + online.get(i)); } pw.println("<a href=\""+resp.encodeURL("ListenerDelete")+"\">注销</a><br/>");pw.flush();pw.close();}}
ServletDelete.java
package listener;
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;
public class ServletDelete extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
req.getSession().invalidate();
List<String> online=(List<String>) getServletContext().getAttribute("online");
PrintWriter pw=resp.getWriter();
resp.setContentType("text/html;charset=utf-8");
pw.println("<h2>当前用户</h2>");
int size = online == null ? 0 : online.size();
for (int i = 0; i < size; i++) {
if(i > 0){
pw.println("<br>");
}
pw.println(i + 1 + "." + online.get(i));
}
pw.println("<a href='\'login.jsp\''>返回登录</a>");
pw.flush();
pw.close();
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Test-F_L</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>FilterLog</filter-name>
<filter-class>filter.Filter_log</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterLog</filter-name>
<url-pattern>/log/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>ListenerU</servlet-name>
<servlet-class>listener.ServletUser</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerU</servlet-name>
<url-pattern>/user/ListenerUser</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ListenerD</servlet-name>
<servlet-class>listener.ServletDelete</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerD</servlet-name>
<url-pattern>/user/ListenerDelete</url-pattern>
</servlet-mapping>
</web-app>