免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
再論Session事件的捕獲

    最近又有網(wǎng)友問到,如何用Session實(shí)現(xiàn)在線統(tǒng)計(jì)的功能,其實(shí)只要對(duì)Servlet規(guī)范詳細(xì)了解一下,明白其基本原理,編寫一個(gè)類似的功能并不是一件很復(fù)雜的事情。我以前的一篇文章,最初也是發(fā)表在JavaResearch上的(http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=2164),不過可能源碼沒有全部給出,只給出了最重點(diǎn)的源碼,所以還是有很多網(wǎng)友給我發(fā)信索取全部源碼。因?yàn)槟莻€(gè)項(xiàng)目是以前做的,所以我手頭上也沒有原來的代碼了,所以可能有的網(wǎng)友的要求就滿足不了了,在這里一并致歉。

    第一篇文章是基于Servlet2.2規(guī)范編寫的,那時(shí)候沒有HttpSessionListener,鑒于目前絕大多數(shù)的應(yīng)用服務(wù)器都支持2.3的規(guī)范,所以為了回應(yīng)網(wǎng)友的提問,特地又基于2.3以上的規(guī)范編寫了一個(gè)簡(jiǎn)單的測(cè)試?yán)印?br>這個(gè)例子的最主要功能就是提供在線用戶列表顯示(既然用戶列表都可以顯示了,那人數(shù)統(tǒng)計(jì)自然也不在話下了)。

    在給出代碼之前,先簡(jiǎn)單說一下監(jiān)聽器的常識(shí)。

    HttpSessionListener:網(wǎng)友rdfei 在他的文章(http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=18541)中也已經(jīng)進(jìn)行了比較詳細(xì)的描述,這是2.3以上規(guī)范所提供的一個(gè)新功能,也就是可以定義監(jiān)聽器監(jiān)聽HttpSession對(duì)象的創(chuàng)建和銷毀。每當(dāng)有新的用戶訪問網(wǎng)站,應(yīng)用服務(wù)器會(huì)創(chuàng)建一個(gè)HttpSession對(duì)象,每當(dāng)Session超時(shí),應(yīng)用服務(wù)器則會(huì)銷毀這個(gè)對(duì)象。
HttpSessionBindingListener:每當(dāng)往Session中存入一個(gè)對(duì)象(setAttribute)或從Session中刪除一個(gè)對(duì)象的時(shí)候,如果這個(gè)對(duì)象實(shí)現(xiàn)了此監(jiān)聽器接口,應(yīng)用服務(wù)器將會(huì)自動(dòng)調(diào)用接口相應(yīng)的方法。

    需要注意的一點(diǎn)就是,在sessionDestroyed方法和valueUnbound方法中,你可以得到HttpSession對(duì)象的實(shí)例,但是其getAttribute方法不再可用,也就是在這兩個(gè)方法中,你不能再次得到存入session中的對(duì)象。

基于以上這些粗淺的認(rèn)識(shí),再簡(jiǎn)單介紹一下我提供的測(cè)試?yán)拥那闆r:

測(cè)試?yán)涌偣舶缦挛募?br>OnlineUserListener.java:它實(shí)現(xiàn)了HttpSessionListener接口
OnlineUsers.java:它包含了所有正在訪問網(wǎng)站的用戶信息,為了方便起見,它也實(shí)現(xiàn)了HttpSessionBindingListener接口(實(shí)際中你最好把他們分開吧)
User.java:這是用戶的信息
test.jsp:為了方便,我把登錄,退出,顯示在線用戶列表等功能都做在同一個(gè)jsp文件里了。
下面是具體的代碼:

  1. /**
  2.  * OnlineUserListener.java
  3.  * Created on 2004-11-19
  4.  */
  5. package com.ccctc.view.web;
  6. import javax.servlet.http.HttpSessionEvent;
  7. import javax.servlet.http.HttpSessionListener;
  8. /**
  9.  * @author litf
  10.  * 
  11.  */
  12. public class OnlineUserListener
  13.     implements HttpSessionListener {
  14.     /**
  15.      * 瀏覽器第一次訪問的時(shí)候,調(diào)用本方法
  16.      * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
  17.      */
  18.     public void sessionCreated(HttpSessionEvent event) {
  19.         User u = new User();
  20.         u.setName("guest");
  21.         u.setId(event.getSession().getId());
  22.         event.getSession().setAttribute("currentUser",u);
  23.         OnlineUsers.getInstance().addUser(u);
  24.     }
  25.     /**
  26.      * Session超時(shí)的時(shí)候,調(diào)用本方法
  27.      * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
  28.      */
  29.     public void sessionDestroyed(HttpSessionEvent event) {
  30.         OnlineUsers.getInstance().removeUser(event.getSession().getId());
  31.     }
  32. }


  1. /**
  2.  * OnlineUsers.java
  3.  * Created on 2004-11-19
  4.  */
  5. package com.ccctc.view.web;
  6. import java.util.Collection;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import javax.servlet.http.HttpSession;
  10. import javax.servlet.http.HttpSessionBindingEvent;
  11. import javax.servlet.http.HttpSessionBindingListener;
  12. /**
  13.  * @author litf
  14.  * 在線用戶統(tǒng)計(jì)
  15.  */
  16. public class OnlineUsers implements HttpSessionBindingListener{
  17.     private Map users = new HashMap();
  18.     
  19.     private static OnlineUsers onlineUsers = new OnlineUsers();
  20.     
  21.     public static OnlineUsers getInstance(){
  22.         return onlineUsers;
  23.     }
  24.     
  25.     /**
  26.      * @return
  27.      */
  28.     public Collection getUsers() {
  29.         return users.values();
  30.     }
  31.     
  32.     public void addUser(User user) {
  33.         users.put(user.getId(),user);
  34.     }
  35.     
  36.     public void removeUser(String userId){
  37.         users.remove(userId);
  38.     }
  39.     
  40.     /**
  41.      * 對(duì)象實(shí)例(即OnlineUserListener的實(shí)例)作為一個(gè)屬性被設(shè)置到session的
  42.      * 時(shí)候,會(huì)調(diào)用本方法,這種情況一般發(fā)生在點(diǎn)擊登錄按鈕以后的處理過程中
  43.      * 設(shè)置
  44.      * @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
  45.      */
  46.     public void valueBound(HttpSessionBindingEvent event) {
  47.         //現(xiàn)在暫時(shí)不需要額外處理,你可以在這里記錄日志等
  48.     }
  49.     /**
  50.      * 當(dāng)Session超時(shí),或本實(shí)例被從session中移除的時(shí)候被調(diào)用,這種情況一般
  51.      * 發(fā)生在注銷方法的處理過程中
  52.      * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
  53.      */
  54.     public void valueUnbound(HttpSessionBindingEvent event) {
  55.         try {
  56.             HttpSession session = event.getSession();
  57.             User u = (User)session.getAttribute("currentUser");
  58.             u.setName("guest");
  59.         } catch (RuntimeException e) {
  60.             //e.printStackTrace();
  61.         }
  62.     }
  63.     
  64. }


  1. /**
  2.  * User.java
  3.  * Created on 2004-11-19
  4.  */
  5. package com.ccctc.view.web;
  6. /**
  7.  * @author litf
  8.  * 
  9.  */
  10. public class User{
  11.     private String address;
  12.     private String id;
  13.     private String name;
  14.     /**
  15.      * @see java.lang.Object#equals(java.lang.Object)
  16.      */
  17.     public boolean equals(Object obj) {
  18.         if (obj == null || !(obj instanceof User)) {
  19.             return false;
  20.         }
  21.         if(this.id !=null && this.id.equals(((User)obj).getId())){
  22.             return true;
  23.         }
  24.         return false;
  25.     }
  26.     /**
  27.      * @return
  28.      */
  29.     public String getAddress() {
  30.         return address;
  31.     }
  32.     /**
  33.      * @return
  34.      */
  35.     public String getId() {
  36.         return id;
  37.     }
  38.     /**
  39.      * @return
  40.      */
  41.     public String getName() {
  42.         return name;
  43.     }
  44.     /**
  45.      * @param string
  46.      */
  47.     public void setAddress(String string) {
  48.         address = string;
  49.     }
  50.     /**
  51.      * @param string
  52.      */
  53.     public void setId(String string) {
  54.         id = string;
  55.     }
  56.     /**
  57.      * @param string
  58.      */
  59.     public void setName(String string) {
  60.         name = string;
  61.     }
  62.     
  63.     /**
  64.      * @see java.lang.Object#toString()
  65.      */
  66.     public String toString() {
  67.         return "name:"+name + ",id:" + id + ",address:"+address;
  68.     }
  69. }


test.jsp

  1. <%@ page import="com.ccctc.view.web.*" %>
  2. <%
  3. User u = (User)session.getAttribute("currentUser");
  4. String name = request.getParameter("user");
  5. if(u != null){
  6.     String remote = request.getRemoteAddr();
  7.     u.setAddress(remote);
  8.     
  9. }
  10. //User Login
  11. if(name != null){
  12.     if(u != null){
  13.         session.setAttribute("_listener",OnlineUsers.getInstance());
  14.         u.setName(name);
  15.         
  16.     }
  17. }
  18. //User Logout
  19. String logout = request.getParameter("logout");
  20. if(logout != null){
  21.     session.removeAttribute("_listener");
  22. }
  23. %>
  24. current users:<p>
  25. <% 
  26. java.util.Collection l = OnlineUsers.getInstance().getUsers();
  27. for(java.util.Iterator it = l.iterator(); it.hasNext();)
  28. {
  29.     User tu = (User)it.next();
  30.     if(u.equals(tu))
  31.     {
  32. %>
  33. <font color=red><%=tu.getName()%>:<%=tu.getAddress()%> </font>  
  34. <%
  35.     }else{
  36. %>
  37. <%=tu.getName()%>:<%=tu.getAddress()%>  
  38. <% 
  39.     }
  40. }
  41. %>
  42. <form action="/cctc/login.jsp">
  43. User : <input name="user" type="text"> <br>
  44. <input type="submit" name="Submit">
  45. </form>
  46. <p>
  47. <a href="/cctc/login.jsp?logout=true">Logout</a> <p>
  48. <a href="/cctc/login.jsp">refresh</a>


web.xml文件中增加:

  1.     <listener>
  2.         <listener-class>com.ccctc.view.web.OnlineUserListener</listener-class>
  3.     </listener>


附件:SessionTest.rar(95K) 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java程序員從笨鳥到菜鳥之(二十三)常見亂碼解決以及
Java Web應(yīng)用開發(fā)基礎(chǔ)│教與學(xué)(教學(xué)大綱 教學(xué)進(jìn)度表)
web.xml中l(wèi)istener的作用及使用(轉(zhuǎn))
JAVA_WEB面試筆試題
jsp文件下載完整方法
Java三大器之監(jiān)聽器(Listener)的工作原理和代碼演示
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服