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

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

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

    Java學習

    java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經搬家了,新的地址是 http://www.javaly.cn 如果有對文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會盡力幫助解決。一起進步

     

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

    /**
    *@Author bromon
    *2004-6-12
    */
    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接口:

    /**
    *@Author bromon
    *2004-6-12
    */
    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()”>
    <a id=”list”></a>
    </body>
    </html>

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

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

    posted on 2008-10-16 10:44 找個美女做老婆 閱讀(202) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    公告

    本blog已經搬到新家了, 新家:www.javaly.cn
     http://www.javaly.cn

    常用鏈接

    留言簿(6)

    隨筆檔案

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲无成人网77777| 亚洲色av性色在线观无码| 国产精品亚洲lv粉色| 成年女人男人免费视频播放| 久久亚洲精品无码| a级毛片免费全部播放| 9久9久女女免费精品视频在线观看| 免费国产高清视频| 亚洲熟妇无码久久精品| 一区二区三区AV高清免费波多| 免费A级毛片无码久久版| 午夜不卡AV免费| 久久久久亚洲精品天堂久久久久久| 亚洲熟妇无码久久精品| 91视频国产免费| 无码天堂亚洲国产AV| 国产亚洲一区区二区在线 | 无码国产精品一区二区免费3p| 久久亚洲美女精品国产精品| 风间由美在线亚洲一区| va亚洲va日韩不卡在线观看| 女人隐私秘视频黄www免费| 久久狠狠高潮亚洲精品| 青青青国产免费一夜七次郎 | 99爱在线精品视频免费观看9| 亚洲综合久久成人69| 暖暖日本免费在线视频 | 在线看无码的免费网站| 久久亚洲国产最新网站| 亚洲欧洲日产国码一级毛片 | 亚洲无限乱码一二三四区| 午夜两性色视频免费网站| 国产高清对白在线观看免费91 | 亚洲色欲久久久久综合网| 亚洲欧美日韩一区二区三区| 美女视频黄免费亚洲| 国产成人精品久久亚洲高清不卡| 国产亚洲精午夜久久久久久| 色播精品免费小视频| 免费中文字幕视频| 亚洲国产超清无码专区|