dwr后台推送技术.docx_第1页
dwr后台推送技术.docx_第2页
dwr后台推送技术.docx_第3页
dwr后台推送技术.docx_第4页
dwr后台推送技术.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

dwr 后台推送技术 实例分为两个页面sendMsg.jsp页面 ,发送一段消息给后台 ,然后后台将消息推送到showMsg.jsp页面web.xml配置html view plaincopyprint?1. 2. 3. dwr3 4. 5. index.jsp 6. 7. 8. dwr-invoker 9. uk.ltd.getahead.dwr.DWRServlet 10. 11. debug 12. true 13. 14. 15. 16. pollAndCometEnabled 17. true 18. 19. 1 20. 21. 22. dwr-invoker 23. /dwr/* 24. 25. dwr3 index.jsp dwr-invoker uk.ltd.getahead.dwr.DWRServlet debug true pollAndCometEnabled true 1 dwr-invoker /dwr/*sendMsg.java 推送类java view plaincopyprint?1. package com.zf.dwr; 2.3. import java.util.Collection; 4.5. import org.directwebremoting.ScriptBuffer; 6. import org.directwebremoting.ScriptSession; 7. import org.directwebremoting.WebContext; 8. import org.directwebremoting.WebContextFactory; 9. import xy.dwr.Util; 10.11. public class SendMsg 12.13. SuppressWarnings(deprecation) 14. public void sendMsg(String msg) 15. /得到上下文 16. WebContext contex = WebContextFactory.get(); 17.18. /得到要推送到 的页面 dwr3为项目名称 , 一定要加上。 19. Collection sessions = contex.getScriptSessionsByPage(/dwr3/showMsg.jsp); 20.21. /不知道该怎么解释这个 , 22. Util util = new Util(sessions); 23.24. /下面是创建一个javascript脚本 , 相当于在页面脚本中添加了一句 show(msg); 25. ScriptBuffer sb = new ScriptBuffer(); 26. sb.appendScript(show(); 27. sb.appendData(msg); 28. sb.appendScript(); 29.30. /推送 31. util.addScript(sb); 32. 33. package com.zf.dwr;import java.util.Collection;import org.directwebremoting.ScriptBuffer;import org.directwebremoting.ScriptSession;import org.directwebremoting.WebContext;import org.directwebremoting.WebContextFactory;import xy.dwr.Util;public class SendMsg SuppressWarnings(deprecation)public void sendMsg(String msg)/得到上下文WebContext contex = WebContextFactory.get();/得到要推送到 的页面 dwr3为项目名称 , 一定要加上。Collection sessions = contex.getScriptSessionsByPage(/dwr3/showMsg.jsp);/不知道该怎么解释这个 , Util util = new Util(sessions);/下面是创建一个javascript脚本 , 相当于在页面脚本中添加了一句 show(msg); ScriptBuffer sb = new ScriptBuffer();sb.appendScript(show();sb.appendData(msg);sb.appendScript();/推送util.addScript(sb);dwr.xml配置html view plaincopyprint?1. 2. 5. 6. 7. 8. com.zf.dwr.SendMsg 9. 10. 11. com.zf.dwr.SendMsg sendMsg.jsphtml view plaincopyprint?1. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. $(function() 13. dwr.engine.setActiveReverseAjax(true); 14. $(#but).click(function() 15. SendMsg.sendMsg($(#msg).val(); 16. ); 17. ); 18. 19. Insert title here 20. 21. 22. 23. 24. 25. $(function()dwr.engine.setActiveReverseAjax(true);$(#but).click(function()SendMsg.sendMsg($(#msg).val();););Insert title here showMsg.jsphtml view plaincopyprint?1. 3. 4. 5. 6. 7. 8. 9. 10. 11. $(function() 12. /这句话千万不能少 ,表示允许使用推送技术 13. dwr.engine.setActiveReverseAjax(true); 14. ); 15. /这个函数是提供给后台推送的时候 调用的 16. function show(msg) 17. $(#message).text(msg); 18. 19. 20. Insert title here 21. 22. 23. 24. 25. $(function()/这句话千万不能少 ,表示允许使用推送技术dwr.engine.setActiveReverseAjax(true););/这个函数是提供给后台推送的时候 调用的 function show(msg)$(#message).text(msg);Insert title here 使用dwr推送技术时 需要有WebContext 对象,但是 WebContext 对象需要通过 WebContextFactory.get();获取 , 而WebContextFactory.get(); 方法只有当页面请求某个java方法时,在该方法中调用WebContextFactory.get(); 才能得到值。 否则是取不到值的。 然后通过WebContext 获取指定的页面 。再向页面推送消息 。 有一个问题是当后来又新开了页面,却收不到消息 。 可以使用一个线程,去定时的更新Collection 对象DWR推技术在开发中需要注意的ScriptSession问题 1 关于ScriptSessionScriptSession不会与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 mapMap sm = g.getSessions();/ hs is HttpSession/ ss is ScriptSession objectsm.put(hs.getId(), ss);7 如何实现有效推送通过上面的Map取得所有的有效ScriptSession集合Collection pages = g.getSessions().values();然后再推送,就可以了。8 上面问题的新的解决方案上面的技术问题和解决方案都是在DWR2.0的环境下遇到的。昨天看了一下,即

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论