常言笑的家

          Spring, Hibernate, Struts, Ajax, RoR

          用xmlhttp和Java session監聽改善站內消息系統

            這個題目含有許多需要解釋的概念,最容易說明的是“站內消息”,這是很多論壇都有的功能,可以通過web向其他的在線用戶發送消息,很多用戶都使用過。站內消息的第一個好處是大家都不需要安裝客戶端,你不用知道對方的MSN或者QQ,就能與他聯系,稱贊他的觀點或者是給他一頓臭罵。第二個好處是客戶管理方便,利用session來維護在線名單,各種腳本都已經把session操作封裝得很易用了,不用像其他無狀態的即時通信工具(比如使用UDP通信的工具)一樣,要費一些腦細胞來解決在線名單的問題。缺點嘛,就是實時性不好,一般是在用戶跳轉或者刷新頁面才能探測消息、更新在線名單。

            Session監聽嘛,沒什么好解釋的,java提供了很靈活的事件機制來監聽session,可以監聽session的創建和銷毀,監控session所攜帶數據的創建、變化和銷毀,可以監聽session的銳化和鈍化(了解對象序列化的兄弟應該知道這個),其他的平臺是個什么情況我不太清楚,估計也差不多吧。如果能夠對所有客戶的session進行監控,就不用再去操作麻煩而危險的Application了。

            Xmlhttp是MS推的一項技術,功能很復雜,可以做很多事情,比如客戶端可以在簡單的HTML中打開HTTP連接,主動向server請求數據并獲得返回數據,是DOM技術一個非常重要的應用,利用它來寫無刷新的動態頁面簡直是so easy,做過web開發的兄弟應該明白它的意義有多么重大。

          一、 session監聽

            servlet中對session的監聽有很多接口,功能很靈活,最常用的是監聽Session和Attribute。這里要澄清一下概念,servlet中的session監聽和Attribute監聽含義有差別,session監聽指的不是我們一般所理解的放置一個session或者銷毀一個session,這是Attribute監聽的功能,因為servlet中放置session的語法是session.setAttribute(“session名”,要放入的對象)。而session監聽,監聽的是HTTP連接,只要有用戶與server連接,就算連接的是一個空白的jsp頁面,也會觸發session事件,所以此處的session實際上指的是connection,用來統計當前在線用戶數最合適了。不知道我說清楚了沒有。下面分別講解這兩種監聽方式。

            1、 session監聽

            首先編寫一個session監聽類,實作HttpSessionListener接口,它的作用是計算當前有多少個在線用戶:

          package org.bromon.test; 

          import javax.servlet.*
          import javax.servlet.http.*

          public class SessionCount implements HttpSessionListener 

          private static int count=0

          public void sessionCreated(HttpSessionEvent se) 

          count
          ++
          System.out.println(“session創建:”
          +new java.util.Date()); 
          }
           

          public void sessionDestroyed(HttpSessionEvent se) 

          count
          --
          System.out.println(“session銷毀:”
          +new java.util.Date()); 
          }
           

          public static int getCount() 

          return(count); 
          }
           
          }
           

            怎么樣,是不是一目了然?count被定義為static,是因為要保證整個系統只有這一個count。如果你實在不放心,可以把它寫成一個單例類。

            然后在web.xml中聲明這個監聽器:
          <listener>
          <listener-class>
          org.bromon.test.SessionCount
          </listener-class>
          </listener>

            編寫一個測試頁面test.jsp,內容是獲得count:
          <%
          int count=org.bromon.test.SessionCount.getCount();
          out.println(count);
          %>


            需要注意的是,這里根本不涉及任何session的操作。重啟動App server,試著連接test.jsp,可以看到監聽器已經開始工作。

            2、 Attribute監聽

            作為一個站內消息系統,肯定要獲得所有登陸者的ID,才有可能互發消息。這就涉及Attribute監聽。假設我們寫了個用戶登陸的模塊,用戶通過身份驗證之后會產生一個session,保存它的相關信息,比如:

          //check.jsp 
          <% 
          String name=request.getParameter(“name”); 
          Name
          =new String(name.getBytes(“ISO8859-1”)); 
          session.setAttribute(“user”,name); 
          %>

            做過jsp的兄弟應該對這段代碼再熟悉不過了,下面寫個監聽器來監聽用戶登陸,把所有用戶的ID保存到一個List當中,這個監聽器實作HttpSessionAttributeListener接口:
          package org.bromon.test; 

          import javax.servlet.*
          import javax.servlet.http.*
          import java.util.*

          public class OnlineList implements HttpSessionAttributeListener 

          private static List list=new ArrayList(); 

          public void attributeAdded(HttpSessionBindingEvent se) 

          if(“user”.equals(se.getName())) 

          list.add(se.getValue()); 
          }
           
          }
           

          public void attributeRemoved(HttpSessionBindingEvent se) 

          if(“user”.equals(se.getName())) 

          list.remove(se.getValue()); 
          }
           
          }
           

          public void attributeReplaced(HttpSessionBindingEvent se){} 

          public static List getList() 

          return(list); 
          }
           
          }

            寫個簡單的jsp來得到用戶列表:
          <%
          java.util.List list
          =org.bromon.test.OnlineList.getList();
          out.println(“共有”
          +list.size()+”名用戶已登陸:”);
          for(int I=0;I<lise.size();i++)
          {
          out.println(list.get(i));
          }
          %>


            也許你說,這有什么神奇呢,監聽session而已,不著急,看看xmlhttp。


          二、 XMLHTTP

            XMLHTTP的用處很多,這里只說我們需要的,就是無刷新的與server通信,看這段代碼:

          <script language="javascript"> 
          xml 
          = new ActiveXObject("Microsoft.XMLHTTP"); 
          var post=" ";//構造要攜帶的數據 
          xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打開一個到服務器的連接,以異步方式通信 
          xml.setrequestheader("content-length",post.length); 
          xml.setrequestheader(
          "content-type","application/x-www-form-urlencoded"); 
          xml.send(post);
          //發送數據 
          var res = xml.responseText;//接收服務器返回的數據 
          document.write(res); 
          </script>

            豁然開朗,這段代碼就是打開一個HTTP連接,以標準的HTTP格式傳遞數據,如果你喜歡,可以用XML的格式來傳遞。更改一下xml對象的構造方式就可以兼容Mozilla和Netscape。下面來寫一個輪詢,每隔一段時間刷新一次用戶列表,當然,是不需要刷新頁面的:
          <html> 
          <head><title>探測器</title> 
          <script language="javascript"> 
          function detect() 

          xml 
          = new ActiveXObject("Microsoft.XMLHTTP"); 
          var post=" ";//構造要攜帶的數據 
          xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打開一個到服務器的連接,以異步方式通信 
          xml.setrequestheader("content-length",post.length); 
          xml.setrequestheader(
          "content-type","application/x-www-form-urlencoded"); 
          xml.send(post);
          //發送數據 
          var res = xml.responseText;//接收服務器返回的數據 
          list.innerText=res; 
          setTimeout(“detect()”,
          5000);//每隔5秒鐘輪詢一次 
          }
           
          </script> 
          <body onload=”detect()”> 
          <id=”list”></a> 
          </body> 
          </html>

            這樣的通信方式數據量很小,不用重新傳遞整個頁面,5秒鐘輪一次,普通PC也能承受較大的在線數。構造一個探測器來監聽在線列表和消息,效果是很好的,即使你的客戶坐在電腦前袖手旁觀,鍵鼠都不碰一下,也能保證數據即時傳遞,頁面也不會發生跳轉和刷新。

            Session監聽加上XMLHTTP通信,開發一個較為完善的站內消息系統實在易如反掌。

          posted on 2007-06-26 11:34 常言笑 閱讀(348) 評論(0)  編輯  收藏 所屬分類: JAVASCRIPT/AJAX

          My Links

          Blog Stats

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 镇坪县| 梧州市| 甘谷县| 金乡县| 防城港市| 仪征市| 宜川县| 普陀区| 西乌珠穆沁旗| 东兴市| 泸州市| 富宁县| 安平县| 汶上县| 新竹县| 沾化县| 丹寨县| 宁夏| 房产| 呼和浩特市| 鹤山市| 丰镇市| 黎川县| 海门市| 珲春市| 嵊州市| 保德县| 东乌| 波密县| 阳朔县| 桂平市| 阳新县| 定襄县| 平邑县| 疏附县| 宁津县| 长沙市| 分宜县| 荣成市| 西昌市| 彰化市|