(1)创建一个监听器实现类
import java.util.List;
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;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
}
//会话销毁时会回调的方法
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
List<String> online = (List<String>)this.application.getAttribute("online");
String username = (String) arg0.getSession().getAttribute("username");
online.remove(username);
this.application.setAttribute("online", online);
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
List<String> online = (List<String>)this.application.getAttribute("online");
if("username".equals(event.getName())){
online.add((String) event.getValue());
}
this.application.setAttribute("online", online);
}
public void attributeRemoved(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
}
public void attributeReplaced(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
}
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
//应用上下文初始化时调用
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
this.application = arg0.getServletContext();
this.application.setAttribute("online", new LinkedList<String>());
}
}
(2)在web.xml中注册监听器
<!-- 注册监听器 -->
<listener>
<listener-class>com.web.listener.OnlineListener</listener-class>
</listener>
(3)处理用户登录的Servlet代码
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
doPost(req,resp);
}
public void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
req.setCharacterEncoding("utf-8");
String username = (String) req.getParameter("username");
//往session中添加属性
//会触发HttpSessionAttributeListener中的attributeAdded方法
req.getSession().setAttribute("username", username);
}
//从应用上下文中获取在线用户名列表
List<String> online = (List<String>)getServletContext().getAttribute("online");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>用户列表</TITLE></HEAD>");
out.println("<BODY>");
out.println("当前用户是:"+username);
out.println("<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));
System.out.println(i+1+"."+online.get(i));
}
//注意:要对链接URL进行自动重写处理
out.println("<hr/><a href=\""+ resp.encodeURL("logout")+"\">注销</a>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
(4)处理用户注销的Servlet代码
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
doPost(req,resp);
}
public void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
req.setCharacterEncoding("utf-8");
//销毁会话,会触发SessionListener中的sessionDestroyed方法
req.getSession().invalidate();
List<String> online =(List<String>)getServletContext().getAttribute("online");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>用户列表</TITLE></HEAD>");
out.println("<BODY>");
out.println("<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=\"index.html\">主页</a>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
(5)在web.xml中配置以上两个Servlet
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.web.listener.LoginServlet</servlet-class>
</servlet>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>logout</servlet-name>
<servlet-class>com.web.listener.LogoutServlet</servlet-class>
</servlet>
<servlet-name>logout</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
(6)创建一个index.html文件,用来供用户登录,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<form action="login" method="post">
用户名:<input type="text" name ="username" style="height: 32px; "/>
<input type="submit" value="登陆"/><br/><br/>
</form>
</body>
</html>