<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    使用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接口,它的作用是計算當前有多少個在線用戶:

    1. /**
    2. *@Author?bromon
    3. *2004-6-12
    4. */
    5. package?org.bromon.test;
    6. import?javax.servlet.*;
    7. import?javax.servlet.http.*;
    8. public?class?SessionCount?implements?HttpSessionListener
    9. {
    10. ????private?static?int?count=0;
    11. ????public?void?sessionCreated(HttpSessionEvent?se)
    12. ????{
    13. ????????count++;
    14. ????????System.out.println(“session創建:”+new?java.util.Date());
    15. ????}
    16. ????public?void?sessionDestroyed(HttpSessionEvent?se)
    17. ????{
    18. ???????count--;
    19. ???????System.out.println(“session銷毀:”+new?java.util.Date());
    20. ????}
    21. ????public?static?int?getCount()
    22. ????{
    23. ???????return(count);
    24. ?????}
    25. }



       怎么樣,是不是一目了然?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,保存它的相關信息,比如:
    1. //check.jsp
    2. <%
    3. ????String?name=request.getParameter(“name”);
    4. ????Name=new?String(name.getBytes(“ISO8859-1”));
    5. ????session.setAttribute(“user”,name);
    6. %>


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

    1. /**
    2. *@Author?bromon
    3. *2004-6-12
    4. */
    5. package?org.bromon.test;
    6. import?javax.servlet.*;
    7. import?javax.servlet.http.*;
    8. import?java.util.*;
    9. public?class?OnlineList?implements?HttpSessionAttributeListener
    10. {
    11. ????private?static?List?list=new?ArrayList();
    12. ????public?void?attributeAdded(HttpSessionBindingEvent?se)
    13. ????{
    14. ????????if(“user”.equals(se.getName()))
    15. ????????{
    16. ????????????list.add(se.getValue());
    17. ?????????}
    18. ????}
    19. ????public?void?attributeRemoved(HttpSessionBindingEvent?se)
    20. ????{
    21. ?????????if(“user”.equals(se.getName()))
    22. ?????????{
    23. ????????????list.remove(se.getValue());
    24. ?????????}
    25. ????}
    26. ????public?void?attributeReplaced(HttpSessionBindingEvent?se){}
    27. ????public?static?List?getList()
    28. ????{
    29. ?????????return(list);
    30. ?????}
    31. }


    寫個簡單的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通信,看這段代碼:

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



       豁然開朗,這段代碼就是打開一個HTTP連接,以標準的HTTP格式傳遞數據,如果你喜歡,可以用XML的格式來傳遞。更改一下xml對象的構造方式就可以兼容Mozilla和Netscape。下面來寫一個輪詢,每隔一段時間刷新一次用戶列表,當然,是不需要刷新頁面的:

    1. <html>
    2. <head><title>探測器</title>
    3. <script?language="javascript">
    4. function?detect()
    5. {
    6. xml?=?new?ActiveXObject("Microsoft.XMLHTTP");?
    7. var?post="?";//構造要攜帶的數據?
    8. xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打開一個到服務器的連接,以異步方式通信?
    9. xml.setrequestheader("content-length",post.length);?
    10. xml.setrequestheader("content-type","application/x-www-form-urlencoded");?
    11. xml.send(post);//發送數據?
    12. var?res?=?xml.responseText;//接收服務器返回的數據?
    13. list.innerText=res;
    14. setTimeout(“detect()”,5000);//每隔5秒鐘輪詢一次
    15. }?
    16. </script>
    17. <body?onload=”detect()”>
    18. <a?id=”list”></a>
    19. </body>
    20. </html>


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

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

    posted on 2006-04-26 15:35 都市淘沙者 閱讀(701) 評論(0)  編輯  收藏 所屬分類: AJAX/XML/ANT/SOAP/WEBService

    主站蜘蛛池模板: 精品亚洲一区二区三区在线观看| 亚洲免费在线观看视频| 国产又长又粗又爽免费视频 | 7m凹凸精品分类大全免费| 亚洲人成网站在线观看播放| 黄色片网站在线免费观看| 在线视频免费国产成人| 久久人午夜亚洲精品无码区| 国产yw855.c免费视频| 菠萝菠萝蜜在线免费视频| 亚洲国产小视频精品久久久三级| 一边摸一边桶一边脱免费视频 | 朝桐光亚洲专区在线中文字幕| 午夜a级成人免费毛片| 亚洲AV无码成人精品区日韩| 国产极品粉嫩泬免费观看| 特黄aa级毛片免费视频播放| 亚洲黄片毛片在线观看| h在线看免费视频网站男男| 亚洲精品乱码久久久久久蜜桃不卡 | 久久w5ww成w人免费| 亚洲电影在线免费观看| 无人在线直播免费观看| 亚洲第一街区偷拍街拍| 亚洲国产精品尤物yw在线| 中文字幕av免费专区| 亚洲综合色丁香麻豆| 天天摸天天操免费播放小视频 | 久久精品免费网站网| 亚洲人成在线播放网站岛国| 国产精品视频免费观看| 亚洲AV无码一区二区大桥未久| 亚洲综合久久夜AV | 97青青草原国产免费观看| 亚洲人成网站免费播放| 免费在线观看你懂的| 久久精品视频免费看| 亚洲欧美日韩国产精品一区| 久久亚洲色一区二区三区| **一级毛片免费完整视| 美女裸免费观看网站|