(作者zhyiwww,转载请您注明出处,zhyiwww@163.com)
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(Direct Web Remoting)是一种Java库,它允许JavaScript在客户端与服务器端进行直接的交互,从而实现在Web应用程序中的Ajax功能。DWR的主要目标是简化前后端的数据交换,提高用户体验,使得Web应用能够像桌面...
DWR(Direct Web Remoting)是一种...在阅读这份中文文档时,你可以深入理解DWR的工作原理,学习如何配置和使用DWR,以及如何在实际项目中解决各种问题。通过实践,你将能够利用DWR创建更加动态和交互性强的Web应用。
2. **安装与配置**:文档会介绍如何将DWR集成到Java Web项目中,包括添加依赖、配置web.xml以及创建DWR配置文件dwr.xml。 3. **DWR的API**:DWR提供了多种接口和类,如`Engine`、`Util`、`Ajax`等,这些API在文档中...
7. **最佳实践**:提供关于如何有效使用DWR,避免常见问题,以及优化性能的建议。 8. **示例**:通过实际的代码示例展示DWR的使用方法,帮助开发者快速上手。 9. **进阶主题**:可能包括异步调用、批量调用、CSP...
### DWR中处理List知识点详解 #### 一、DWR简介 DWR(Direct Web Remoting)是一种简化Ajax开发的框架,它使得JavaScript能够直接调用服务器端的Java方法,从而实现更简单、更直接的远程调用。通过DWR框架,开发者...
在《DWR中文文档v0.9》中,读者可以找到关于如何配置DWR、创建DWR接口、调用远程方法、处理异常、调试DWR应用等全面的教程和示例。这份文档不仅适合初学者,也对有经验的开发者有很高的参考价值,可以帮助他们更好地...
- **DWR与Acegi**:解决Acegi安全框架下DWR的权限问题。 #### DWR中的JavaScript - **简单的回调函数**:介绍如何使用DWR进行异步调用,并在调用完成后执行回调函数。 - **调用元数据对象**:元数据对象包含关于...
- **配置文件编辑**: 在`web.xml`中添加DWR相关的servlet和filter配置。 - **编写Service**: 创建一个简单的Java类作为服务端处理逻辑。 - **测试DWR**: 启动服务器并通过浏览器访问DWR提供的资源进行测试。 - **...
DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现实时的JavaScript到服务器端Java对象的通信。这个“DWR中文教程(外带DWR包)”为初学者提供了一个全面的入门指南,帮助理解并掌握DWR的基本概念和...
2. **XML解析错误**:通常与DWR配置文件中的XML语法有关,需要仔细检查XML文件格式。 3. **使用weblogic的类路径问题**:确保DWR库文件正确添加到了WebLogic服务器的类路径中。 4. **没有cookies的情况下使用DWR**:...
DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现实时的、双向的JavaScript和服务器端代码交互。这个技术允许开发者在客户端浏览器上执行服务器端的方法,就像它们是本地JavaScript函数一样,极大...
8. **调试与日志**:学习如何在开发过程中利用DWR的内置调试工具和日志功能,以便于找出和解决问题。 9. **集成Spring框架**:如果你的项目使用了Spring,教程可能会介绍如何将DWR与Spring集成,实现依赖注入和事务...
3. **配置DWR**:在使用DWR时,你需要在Web应用的`web.xml`中配置DWR的Servlet,并创建相应的DWR配置文件(如`dwr.xml`),以定义允许暴露给JavaScript的Java类和方法。 4. **DWR的安全性**:DWR提供了安全机制,如...
这份中文文档详细介绍了DWR的相关概念和技术,对于学习和使用DWR的开发者来说是一份非常宝贵的资源。 **1. DWR基本概念** DWR的核心是反向Ajax(Reverse AJAX),即服务器可以主动向客户端发送数据,而不仅仅局限于...
在DWR2中,使用ScriptSession管理器来区分不同用户并跟踪他们的会话。当用户登录时,你可以通过添加ScriptSessionListener到ScriptSessionManager,并在sessionCreated方法中设置用户的标识。然而,在DWR3中,文档的...
在这个压缩包中,"DWR开发培训.ppt"可能是一个演示文稿,用于教学或研讨会,其中可能包含PPT幻灯片,系统地介绍了DWR的各个方面,可能包括实例演示、最佳实践和常见问题解答。 总的来说,这个DWR教程包提供了一套...
dwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwr
DWR(Direct Web ...通过“DWR中文官方文档”,开发者可以学习到如何在实际项目中有效利用DWR,提高Web应用的交互性和响应速度。文档涵盖了安装、配置、使用示例、API参考等多个方面,是学习和使用DWR的宝贵资源。