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

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

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

    zhyiwww
    用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
    posts - 536,comments - 394,trackbacks - 0
    (作者zhyiwww,轉(zhuǎn)載請(qǐng)您注明出處,zhyiwww@163.com)

    1 關(guān)于ScriptSession
    ScriptSession不會(huì)與HttpSession同時(shí)創(chuàng)建
    當(dāng)我們?cè)L問(wèn)一個(gè)頁(yè)面的時(shí)候,如果是第一次訪問(wèn),就會(huì)創(chuàng)建一個(gè)新的HttpSession,之后再訪問(wèn)的時(shí)候,就會(huì)保持當(dāng)前的Session,即使是刷新,也能保持當(dāng)前的HttpSession。
    但是,ScriptSession不同,第一次訪問(wèn),會(huì)創(chuàng)建一個(gè)ScriptSession,但是,如果你刷新,就會(huì)創(chuàng)建一個(gè)新的ScriptSession.


    2 如何得到ScriptSession
    在DWR中,我們可以通過(guò)WebContextFactory.get()來(lái)取得一個(gè)WebContext對(duì)象,進(jìn)而通過(guò)WebContext的getScriptSession()取得ScriptSession對(duì)象。
    但是要注意,在我們自定義的Servlet中,我們也可以通過(guò)WebContextFactory.get()來(lái)取得一個(gè)WebContext,但是這種方法卻不能取得ScriptSession對(duì)象。因?yàn)椋薟ebContext對(duì)象其實(shí)不是通過(guò)DWR的上下文環(huán)境得到的,所以,就根本沒(méi)有創(chuàng)建ScriptSession對(duì)象。
    假設(shè)這種方式也能得到ScriptSession的話,那么我們實(shí)現(xiàn)“推”也就可以不局限在DWR的上下文環(huán)境中了,那么其靈活性就會(huì)大很多了。

    所以,這就是我們不能在Servlet中實(shí)現(xiàn)推的原因。

    3 關(guān)于刷新就創(chuàng)建一個(gè)新的ScriptSession問(wèn)題
    ?在我們需要推送的頁(yè)面中,如果你刷新以下,那么就提交一個(gè)Http的request,此時(shí),如果是第一次,那么就會(huì)創(chuàng)建一個(gè)httpSession對(duì)象,同時(shí),請(qǐng)求由DwrServlet來(lái)處理后,就會(huì)創(chuàng)建一個(gè)ScriptSession.這個(gè)ScriptSession會(huì)和你的request請(qǐng)求的URI綁定放在一個(gè)由ScriptSessionManager維護(hù)的Map里面(這里面其實(shí)是一個(gè)URI對(duì)應(yīng)的Set,在Set里面放置的是URI綁定的所有ScriptSession)。
    當(dāng)你刷新的時(shí)候,同樣的一個(gè)HttpSession,卻會(huì)創(chuàng)建一個(gè)新的ScriptSession,然后綁定到對(duì)應(yīng)的URI上。

    4 向所有的頁(yè)面訪問(wèn)者推送
    當(dāng)我們想向所有的頁(yè)面訪問(wèn)者推送的時(shí)候,我們只需要,取得所有的頁(yè)面訪問(wèn)者,就可以“推”了。
    如何取得所有的頁(yè)面訪問(wèn)者?可以通過(guò)
    //??? ??? Collection pages = webContext.getScriptSessionsByPage("/SynMap/map/map.jsp");
    來(lái)取得/SynMap/map/map.jsp的所有訪問(wèn)的ScriptSession
    如何推送,
    Util util = new Util(pages);
    util.addFunctionCall("syningMap",new Double(x),new Double(y),new Integer(zoom));
    通過(guò)此方法,就可以實(shí)現(xiàn)調(diào)用客戶端的javascript函數(shù),實(shí)現(xiàn)對(duì)客戶端的操作。

    5 在上面的推送中產(chǎn)生的問(wèn)題
    上面的方法已經(jīng)可以實(shí)現(xiàn)向所有的訪問(wèn)者推送。但是問(wèn)題是,在客戶端,如果用戶刷新一次或多次,那么,Collection里面可能就保存了很多的無(wú)用的ScriptSession,所以不僅僅會(huì)影響性能問(wèn)題,更重要的是,可能就不能實(shí)現(xiàn)你想要的功能。

    比如,你想取得當(dāng)前再現(xiàn)的有效用戶,那么你就需要知道那些ScriptSession是有效的。

    6 如何管理有效的ScriptSession

    由于上面的問(wèn)題,我們就需要自己管理ScriptSession.其實(shí),有效地HttpSession,就是那個(gè)和當(dāng)前的HttpSession匹配的ScriptSession.
    所以,我們就可以自己維護(hù)一個(gè)Map,在這個(gè)Map里面,我們定義key就是HttpSession的Id,其值就是ScriptSession對(duì)象。
    在每一次頁(yè)面載入的時(shí)候,都去注冊(cè)此ScriptSession,那么就會(huì)把新的ScriptSession綁定到httpSession上面了。
    // session and scriptSession map
    Map sm = g.getSessions();
    // hs is HttpSession
    // ss is ScriptSession object
    sm.put(hs.getId(), ss);

    7 如何實(shí)現(xiàn)有效推送
    通過(guò)上面的Map取得所有的有效ScriptSession集合
    Collection pages = g.getSessions().values();
    然后再推送,就可以了。

    8 上面問(wèn)題的新的解決方案
    上面的技術(shù)問(wèn)題和解決方案都是在DWR2.0的環(huán)境下遇到的。
    昨天看了一下,即將正式發(fā)布的DWR3.0的文檔,里面對(duì)AJAX Reverse技術(shù)增加了不少功能。
    其中新加了一個(gè)象HttpSessionListener的東西,叫ScriptSessionListener
    所以,我想,可以通過(guò)這個(gè)Listener實(shí)現(xiàn)上面的功能,也就是說(shuō),在監(jiān)聽(tīng)到一個(gè)ScriptSession創(chuàng)建的時(shí)候,我們就直接判斷,并把此ScriptSession綁定到httpSession上,就可以了。同樣用上面的那個(gè)map來(lái)管理就可以了。
    這個(gè)是我的思路,我還沒(méi)有實(shí)踐,如果你需要的話,可以自己去試一下。
    新版本的DWR開(kāi)發(fā)實(shí)現(xiàn)推技術(shù)會(huì)更加方便,期待吧!!




    |----------------------------------------------------------------------------------------|
                               版權(quán)聲明  版權(quán)所有 @zhyiwww
                引用請(qǐng)注明來(lái)源 http://www.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2008-10-24 09:24 zhyiwww 閱讀(6783) 評(píng)論(6)  編輯  收藏 所屬分類: j2ee

    FeedBack:
    # re: DWR推技術(shù)在開(kāi)發(fā)中需要注意的ScriptSession問(wèn)題[未登錄](méi)
    2008-11-21 11:03 | Gavin
    沒(méi)看懂:
    // session and scriptSession map
    Map sm = g.getSessions();
    // hs is HttpSession
    // ss is ScriptSession object
    sm.put(hs.getId(), ss);

    這里那個(gè)g.getSessions()的g是什么?  回復(fù)  更多評(píng)論
      
    # re: DWR推技術(shù)在開(kāi)發(fā)中需要注意的ScriptSession問(wèn)題
    2008-11-21 16:05 | zhyiwww
    這個(gè)部分是我寫(xiě)的代碼,自己去維護(hù)一個(gè)Session的Map,用來(lái)實(shí)現(xiàn)Session和ScriptSession的對(duì)應(yīng)。
    其實(shí)這個(gè)Map就是你要管理的Session集合。  回復(fù)  更多評(píng)論
      
    # re: DWR推技術(shù)在開(kāi)發(fā)中需要注意的ScriptSession問(wèn)題
    2008-12-10 16:35 | 陳一
    # re: DWR推技術(shù)在開(kāi)發(fā)中需要注意的ScriptSession問(wèn)題
    2009-02-24 16:39 | 鐘僥
    對(duì)于第三條為什么不能在servlet中獲取webcontext不是很懂,能解釋下嗎,謝謝了!  回復(fù)  更多評(píng)論
      
    # re: DWR推技術(shù)在開(kāi)發(fā)中需要注意的ScriptSession問(wèn)題
    2010-04-22 15:26 | baomi
    寫(xiě)的很好,通俗易懂!  回復(fù)  更多評(píng)論
      
    # re: DWR推技術(shù)在開(kāi)發(fā)中需要注意的ScriptSession問(wèn)題[未登錄](méi)
    2014-03-26 22:41 | dd
    @Gavin
    我也想知道  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲最新永久在线观看| 免费在线观看亚洲| 日韩精品成人亚洲专区| 亚洲国产综合无码一区| 亚洲真人无码永久在线观看| 亚洲a级在线观看| 亚洲人成网国产最新在线| 亚洲精品国产精品| 成人影片一区免费观看| 成人黄动漫画免费网站视频 | 波多野结衣在线免费观看| 亚洲福利精品一区二区三区| 亚洲国产小视频精品久久久三级| 亚洲网址在线观看你懂的| 污视频网站在线观看免费| 国产精品免费久久久久久久久| 欧洲一级毛片免费| 亚洲综合区小说区激情区 | 亚洲乱码中文字幕综合234| 亚洲国产精品日韩在线| 亚洲精品无码av中文字幕| 国产精品亚洲AV三区| 特级无码毛片免费视频尤物| 免费人成年激情视频在线观看| 337p日本欧洲亚洲大胆精品555588 | 亚洲国产欧洲综合997久久| 99re6热视频精品免费观看| 毛片a级毛片免费播放下载| 国产亚洲精品xxx| 免费国产污网站在线观看不要卡| 免费精品国产自产拍在线观看图片 | 精品亚洲麻豆1区2区3区| 国产黄色片免费看| 日本无卡码免费一区二区三区| 亚洲精品在线电影| 国内少妇偷人精品视频免费| 亚洲精品免费网站| 亚洲大尺度无码专区尤物| 亚洲人成人网毛片在线播放| 亚洲成人免费在线| 日本亚洲国产一区二区三区|