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来管理就可以了。
这个是我的思路,我还没有实践,如果你需要的话,可以自己去试一下。
新版本的DWR开发实现推技术会更加方便,期待吧!!
分享到:
相关推荐
在实际应用中,需要注意处理好并发问题,优化推送效率,以及考虑浏览器兼容性,确保在各种环境下都能稳定工作。 总结来说,DWR推技术是实现服务器主动向客户端推送数据的一种高效方式,尤其适用于需要实时数据更新...
标题中的“dwr推技术官方实例”是指DWR提供的关于其推技术的实际操作示例,这些示例可能涵盖了DWR 2.0.4及以上版本的最新功能。由于高质量的实例资源在网络上可能不易找到,所以这份实例集合显得尤为宝贵。 描述中...
在"聊天DWR推送"实例中,我们可能会看到以下关键技术点: - **聊天室接口**:服务器端定义了一个或多个处理聊天消息的Java类,这些类提供了添加、获取和广播消息的方法。 - **JavaScript接口**:DWR自动生成了与...
通过这个简单的点对点聊天实例,我们可以深入理解DWR如何实现反向Ajax和推送技术,以及如何在实际项目中应用。同时,这也是一个很好的起点,可以进一步扩展到群聊、文件传输等更复杂的Web交互场景。在实际开发中,...
在这个“dwr推技术简单案例”中,我们将深入理解DWR的核心概念,学习如何设置和使用DWR来实现实时数据推送。 首先,我们需要了解DWR的基本工作原理。DWR通过在浏览器和服务器之间建立一个持久连接,使得服务器可以...
另外,`DWR推技术在开发中需要注意的ScriptSession问题 - zhyiwww - BlogJava.mht`文件可能包含了开发者在实际开发过程中遇到的一个常见问题——ScriptSession。ScriptSession是DWR用于跟踪客户端会话的机制,但如果...
7. **实现推送逻辑**:在实际业务中,当用户A执行特定操作时,可以通过DWR调用服务器端的推送方法,该方法会找到目标用户B的`scriptSession`,并推送数据。用户B的前端JavaScript会在适当的时间接收并处理这些数据。...
DWR是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
但在服务器推送技术中,服务器主动将数据推送到客户端,而无需客户端发起新的请求。这种技术对于实时性要求高的应用,如聊天室、股票交易、在线游戏等,具有显著优势。 **DWR的服务器推送实现**: DWR使用一种称为...
在DWR3中实现推送技术,首先需要在服务器端配置DWR引擎,并创建相应的Java类和方法,这些方法会被客户端的JavaScript调用。然后,在JavaScript端,可以通过DWR提供的API来订阅特定的推送通道,这样当服务器有新数据...
8. **错误处理**:在开发过程中,还需要考虑错误处理机制,确保在网络中断或其他异常情况下,应用能够恢复并给出适当的提示。 通过以上步骤,我们可以利用DWR创建一个功能完备的反转聊天应用。DWR简化了服务器与...
- `web.xml`:在Servlet容器中部署DWR时,需要在应用的部署描述符中配置DWR的Servlet,使其能够处理AJAX请求。 6. **示例代码解析**: - HTML/JavaScript部分可能包含DWR的`<script>`标签引入,以及调用服务器端...
在描述中提到的"DWR服务器推技术整合Struts2",意味着我们将DWR与流行的MVC框架Struts2相结合,以创建一个具有聊天功能的Web应用。Struts2提供了一个强大的架构来处理HTTP请求,并结合DWR,可以创建一个动态的、交互...
要启用DWR的推技术,首先需要在web.xml文件中进行相应的配置。具体步骤如下: 1. **配置DWRServlet** 首先,需要在web.xml中注册DWRServlet,并设置初始化参数。例如,可以开启debug模式以方便调试,同时指定是否...
不过,要注意的是,虽然DWR简化了实时通信的实现,但也会增加服务器的负载,因此在高并发场景下需要谨慎使用。同时,对于大型项目,可能还需要考虑与其他技术如WebSocket结合使用,以达到最佳性能和可扩展性。
在IT行业中,消息推送是一项重要的技术,它使得服务器能够实时地向客户端发送数据,而无需客户端不断地轮询请求。在本教程中,我们将探讨如何利用Direct Web Remoting (DWR) 和Spring框架来实现这样的功能。 DWR是...
**DWR(Direct Web Remoting)**是一种Java技术,它允许JavaScript在客户端直接调用服务器端的Java方法,实现浏览器与服务器之间的实时交互。DWR的出现极大地简化了Web应用中的AJAX(Asynchronous JavaScript and ...
DWR提供了强大的调试工具和日志记录功能,可以帮助开发者在开发过程中快速定位问题,优化性能。 8. **运行与测试** 在完成上述配置和编写代码后,我们可以使用Maven的`mvn package`命令将项目打包成WAR文件,然后...
在这个压缩包中,包含了一系列关于DWR技术分析、学习资料以及相关的界面开发内容,对于理解和掌握DWR技术至关重要。 首先,DWR的XML配置文件是连接客户端与服务器端的关键,它定义了哪些Java对象和方法可以被...
不过,需要注意的是,由于HTTP的无状态性,长时间的连接可能会导致一些问题,因此在实际应用中,应结合具体业务需求和浏览器特性进行适当调整。同时,随着WebSocket等技术的发展,DWR的服务器推送功能可能逐渐被取代...