Web监听器

监听器


   是指专门用于对其他对象身上发生的事件或状态进行监听和相应处理的对象,
   当被监听的对象发生变化时,立即采取相应的行动。
   Web监听器
      Servlet规范中定义的一种特殊类
      用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件
      用于监听域对象的属性发生修改的事件
      可以在事件发生前、发生后做一些必要的处理
   用途
        统计在线人数和在线用户
系统启动时加载初始化信息
统计网站访问量
跟Spring结合
优先级:监听器大于过滤器,过滤器大于Servlet
   分类(根据监听的对象划分)
      用于监听应用程序环境对象(ServletContext)的事件监听器
      用于监听用户会话对象(HttpSession)的事件监听器
      用于监听请求消息对象(ServletRequest)的事件监听器
      (根据监听对象划分)
       监听域对象自身的创建和销毁的事件监听器
       监听域对象中的属性的增加和删除的事件监听器

       监听绑定到HttpSession域中的某个对象的状态的事件监听器

监听器实现的获取在线人数案例:

public class User {
     private String sessionIdString;
     private String ipString;
     private String firstTimeString;
	public String getSessionIdString() {
		return sessionIdString;
	}
	public void setSessionIdString(String sessionIdString) {
		this.sessionIdString = sessionIdString;
	}
	public String getIpString() {
		return ipString;
	}
	public void setIpString(String ipString) {
		this.ipString = ipString;
	}
	public String getFirstTimeString() {
		return firstTimeString;
	}
	public void setFirstTimeString(String firstTimeString) {
		this.firstTimeString = firstTimeString;
	}
     
     
}
@WebListener
public class MyHttpSessionListener implements HttpSessionListener{
   private int userNumber;
	public void sessionCreated(HttpSessionEvent se) {
		userNumber++;
		se.getSession().getServletContext().setAttribute("userNumber", userNumber);
	}

	public void sessionDestroyed(HttpSessionEvent se) {
		userNumber--;
		se.getSession().getServletContext().setAttribute("userNumber", userNumber);
	   ArrayList<User> userList =null;
	   userList = (ArrayList<User>) se.getSession().getServletContext().getAttribute("userList");
	   
	   if(SessionUtil.getUserBySessionId(userList, se.getSession().getId()) != null){
		   userList.remove(SessionUtil.getUserBySessionId(userList, se.getSession().getId()));
	   }
	}
      
}


@WebListener
public class MyServletRequestListener implements ServletRequestListener {
    private ArrayList<User> userList;
	@Override
	public void requestDestroyed(ServletRequestEvent arg0) {

	}

	@Override
	public void requestInitialized(ServletRequestEvent arg0) {
        userList = (ArrayList<User>)arg0.getServletContext().getAttribute("userList");
        if(userList == null){
        	userList = new ArrayList<User>();
        }
        
        HttpServletRequest request = (HttpServletRequest) arg0.getServletRequest();
        String sessionIdString = request.getSession().getId();
        
        if(SessionUtil.getUserBySessionId(userList, sessionIdString) == null){
        	User user = new User();
        	user.setSessionIdString(sessionIdString);
        	user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-ddd HH:mm:ss").format(new Date()));
        	user.setIpString(request.getRemoteAddr());
        	userList.add(user);
        }
        arg0.getServletContext().setAttribute("userList", userList);
	}

}

public class SessionUtil {
      public static Object getUserBySessionId(ArrayList<User> userList,String sessionIdString){
    	  for(int i = 0; i < userList.size(); i++){
    		  User user =userList.get(i);
    		  if(user.getSessionIdString().equals(sessionIdString)){
    			  return user;
    		  }
    	  }
    	  return null;
      }
}

页面:

  <body>
    当前在线用户人数:${userNumber}<br>
    <%
       ArrayList<User> userList = (ArrayList<User>)request.getServletContext().getAttribute("userList");
       if(userList != null){
        for(int i = 0; i < userList.size(); i++){
            User user = userList.get(i);
     %>
     IP:<%=user.getIpString() %>,FirstTime:<%=user.getFirstTimeString() %>,SessionId:<%=user.getSessionIdString() %><br/>
     <%
        }
        }
       %>
  </body>


  

你可能感兴趣的:(Web监听器)