1 关于ScriptSession
ScriptSession不会与HttpSession同时建立
当咱们访问一个页面的时候,若是是第一次访问,就会建立一个新的HttpSession,以后再访问的时候,就会保持当前的Session,即便是刷新,也能保持当前的HttpSession。
可是,ScriptSession不一样,第一次访问,会建立一个ScriptSession,可是,若是你刷新,就会建立一个新的ScriptSession.
2 如何获得ScriptSession
在DWR中,咱们能够经过WebContextFactory.get()来取得一个WebContext对象,进而经过WebContext的getScriptSession()取得ScriptSession对象。
可是要注意,在咱们自定义的Servlet中,咱们也能够经过WebContextFactory.get()来取得一个WebContext,可是这种方法却不能取得ScriptSession对象。由于,此WebContext对象其实不是经过DWR的上下文环境获得的,因此,就根本没有建立ScriptSession对象。
假设这种方式也能获得ScriptSession的话,那么咱们实现“推”也就能够不局限在DWR的上下文环境中了,那么其灵活性就会大不少了。
因此,这就是咱们不能在Servlet中实现推的缘由。
3 关于刷新就建立一个新的ScriptSession问题
在咱们须要推送的页面中,若是你刷新如下,那么就提交一个Http的request,此时,若是是第一次,那么就会建立一个httpSession对象,同时,请求由DwrServlet来处理后,就会建立一个ScriptSession.这个ScriptSession会和你的request请求的URI绑定放在一个由ScriptSessionManager维护的Map里面(这里面实际上是一个URI对应的Set,在Set里面放置的是URI绑定的全部ScriptSession)。
当你刷新的时候,一样的一个HttpSession,却会建立一个新的ScriptSession,而后绑定到对应的URI上。
4 向全部的页面访问者推送
当咱们想向全部的页面访问者推送的时候,咱们只须要,取得全部的页面访问者,就能够“推”了。
如何取得全部的页面访问者?能够经过
// Collection pages = webContext.getScriptSessionsByPage("/SynMap/map/map.jsp");
来取得/SynMap/map/map.jsp的全部访问的ScriptSession
如何推送,
Util util = new Util(pages);
util.addFunctionCall("syningMap",new Double(x),new Double(y),new Integer(zoom));
经过此方法,就能够实现调用客户端的javascript函数,实现对客户端的操做。
5 在上面的推送中产生的问题
上面的方法已经能够实现向全部的访问者推送。可是问题是,在客户端,若是用户刷新一次或屡次,那么,Collection里面可能就保存了不少的无用的ScriptSession,因此不单单会影响性能问题,更重要的是,可能就不能实现你想要的功能。
好比,你想取得当前再现的有效用户,那么你就须要知道那些ScriptSession是有效的。
6 如何管理有效的ScriptSession
因为上面的问题,咱们就须要本身管理ScriptSession.其实,有效地HttpSession,就是那个和当前的HttpSession匹配的ScriptSession.
因此,咱们就能够本身维护一个Map,在这个Map里面,咱们定义key就是HttpSession的Id,其值就是ScriptSession对象。
在每一次页面载入的时候,都去注册此ScriptSession,那么就会把新的ScriptSession绑定到httpSession上面了。
// session and scriptSession map
Map sm = g.getSessions();
// hs is HttpSession
// ss is ScriptSession object
sm.put(hs.getId(), ss);
7 如何实现有效推送
经过上面的Map取得全部的有效ScriptSession集合
Collection pages = g.getSessions().values();
而后再推送,就能够了。
8 上面问题的新的解决方案
上面的技术问题和解决方案都是在DWR2.0的环境下遇到的。
昨天看了一下,即将正式发布的DWR3.0的文档,里面对AJAX Reverse技术增长了很多功能。
其中新加了一个象HttpSessionListener的东西,叫ScriptSessionListener
因此,我想,能够经过这个Listener实现上面的功能,也就是说,在监听到一个ScriptSession建立的时候,咱们就直接判断,并把此ScriptSession绑定到httpSession上,就能够了。一样用上面的那个map来管理就能够了。
这个是个人思路,我尚未实践,若是你须要的话,能够本身去试一下javascript