ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:21.52KB ,
资源ID:4152933      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4152933.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(dwr推技术.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

dwr推技术.docx

1、dwr推技术DWR推技术在开发中需要注意的ScriptSession问题 (作者zhyiwww,转载请您注明出处,zhyi)1 关于ScriptSessionScriptSession不会与HttpSession同时创建当我们访问一个页面的时候,如果是第一次访问,就会创建一个新的HttpSession,之后再访问的时候,就会保持当前的Session,即使是刷新,也能保持当前的HttpSession。但是,ScriptSession不同,第一次访问,会创建一个ScriptSession,但是,如果你刷新,就会创建一个新的ScriptSession.2 如何得到ScriptSession在DWR中

2、,我们可以通过WebContextFactory.get()来取得一个WebContext对象,进而通过WebContext的getScriptSession()取得ScriptSession对象。但是要注意,在我们自定义的Servlet中,我们也可以通过WebContextFactory.get()来取得一个WebContext,但是这种方法却不能取得ScriptSession对象。因为,此WebContext对象其实不是通过DWR的上下文环境得到的,所以,就根本没有创建ScriptSession对象。假设这种方式也能得到ScriptSession的话,那么我们实现“推”也就可以不局限在DW

3、R的上下文环境中了,那么其灵活性就会大很多了。所以,这就是我们不能在Servlet中实现推的原因。3 关于刷新就创建一个新的ScriptSession问题在我们需要推送的页面中,如果你刷新以下,那么就提交一个Http的request,此时,如果是第一次,那么就会创建一个httpSession对象,同时,请求由DwrServlet来处理后,就会创建一个ScriptSession.这个ScriptSession会和你的request请求的URI绑定放在一个由ScriptSessionManager维护的Map里面(这里面其实是一个URI对应的Set,在Set里面放置的是URI绑定的所有Script

4、Session)。当你刷新的时候,同样的一个HttpSession,却会创建一个新的ScriptSession,然后绑定到对应的URI上。4 向所有的页面访问者推送当我们想向所有的页面访问者推送的时候,我们只需要,取得所有的页面访问者,就可以“推”了。如何取得所有的页面访问者?可以通过/ Collection pages = webContext.getScriptSessionsByPage(/SynMap/map/map.jsp);来取得/SynMap/map/map.jsp的所有访问的ScriptSession如何推送,Util util = new Util(pages);util.a

5、ddFunctionCall(syningMap,new Double(x),new Double(y),new Integer(zoom);通过此方法,就可以实现调用客户端的javascript函数,实现对客户端的操作。5 在上面的推送中产生的问题上面的方法已经可以实现向所有的访问者推送。但是问题是,在客户端,如果用户刷新一次或多次,那么,Collection里面可能就保存了很多的无用的ScriptSession,所以不仅仅会影响性能问题,更重要的是,可能就不能实现你想要的功能。比如,你想取得当前再现的有效用户,那么你就需要知道那些ScriptSession是有效的。6 如何管理有效的Scr

6、iptSession由于上面的问题,我们就需要自己管理ScriptSession.其实,有效地HttpSession,就是那个和当前的HttpSession匹配的ScriptSession.所以,我们就可以自己维护一个Map,在这个Map里面,我们定义key就是HttpSession的Id,其值就是ScriptSession对象。在每一次页面载入的时候,都去注册此ScriptSession,那么就会把新的ScriptSession绑定到httpSession上面了。/ session and scriptSession mapMap sm = g.getSessions();/ hs is H

7、ttpSession/ ss is ScriptSession objectsm.put(hs.getId(), ss);7 如何实现有效推送通过上面的Map取得所有的有效ScriptSession集合Collection pages = g.getSessions().values();然后再推送,就可以了。8 上面问题的新的解决方案上面的技术问题和解决方案都是在DWR2.0的环境下遇到的。昨天看了一下,即将正式发布的DWR3.0的文档,里面对AJAX Reverse技术增加了不少功能。其中新加了一个象HttpSessionListener的东西,叫ScriptSessionListener

8、所以,我想,可以通过这个Listener实现上面的功能,也就是说,在监听到一个ScriptSession创建的时候,我们就直接判断,并把此ScriptSession绑定到httpSession上,就可以了。同样用上面的那个map来管理就可以了。这个是我的思路,我还没有实践,如果你需要的话,可以自己去试一下。新版本的DWR开发实现推技术会更加方便,期待吧!1、服务器推技术通过客户端发出请求获取服务器端数据的方式通常称为“拉”技术,很形象说明客户端在拉取服务器端数据,而有时候需要服务器端主动向客户端“推”数据,比如监测聊天上线人数主动向上线发送消息,后台数据库发生变化是主动更新所有客户端展示。2、

9、Reverse Ajax实现服务器推技术DWR2.x的推技术也叫DWR Reverse Ajax(逆向Ajax)主要是在BS架构中,从服务器端向多个浏览器主动推数据的一种技术。DWR的逆向Ajax主要包括两种模式:主动模式和被动模式。其中主动模式包括polling和comet两种,被动模式只有piggyback这一种。(1)piggyback方式,是默认的方式。如果后台有什么内容需要推送到前台,是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。只有等到下次请求页面主动发起了,中间的变化内容才传递回页面。(2)comet方式当服务端建立和浏览器的连接,

10、将页面内容发送到浏览器之后,对应的连接并不关闭,只是暂时挂起。如果后面有什么新的内容需要推送到客户端的时候直接通过前面挂起的连接再次传送数据。服务器所能提供的连接数目是一定的,在大量的挂起的连接没有关闭的情况下,可能造成新的连接请求不能接入,从而影响到服务质量。(3)polling方式由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。只不过用了dwr之后这部分工作由框架帮我们完成了。3、配置web.xml使用reverse ajax(1)piggyb

11、ack方式,默认的dwr在web.xml文件的配置即piggyback方式。(2)comet需要增加如下配置pollAndCometEnabledtrueactiveReverseAjaxEnabledtrue(3)polling方式:在comet方式的基础之上,再配置以下参数org.directwebremoting.extend.ServerLoadMonitor/param-namorg.directwebremoting.impl.PollingServerLoadMonitor disconnectedTime600004、编写聊天消息处理类public class MessageM

12、anager private static List msgList = new LinkedList(); public List getMsgList() return msgList; public synchronized void sendMessage(String msg) msgList.add(msg); showMessage(); private void showMessage() WebContext wctx = WebContextFactory.get(); String currentPage = wctx.getCurrentPage(); ScriptBu

13、ffer script = new ScriptBuffer(); script.appendScript(receiveMessages().appendData(msgList).appendScript(););/ 调用页面的javascript方法把值添到页面上。 Collection pages = wctx.getScriptSessionsByPage(currentPage);/ 循环出所有的会话页面并执行 for (Iterator it = pages.iterator(); it.hasNext();) ScriptSession otherSession = (Scri

14、ptSession) it.next(); otherSession.addScript(script); 5、dwr.xml中配置聊天消息处理类 6、页面代码 ReverseAjax.html dwr.engine.setActiveReverseAjax(true); function receiveMessages(msg) var message=; for(var i=0;imsg.length;i+) message+=msgi+; $(content).innerHTML=message function init() messageManager.getMsgList(call

15、back); function callback(msg) var message=; for(var i=0;imsg.length;i+) message+=msgi+; $(content).innerHTML=message window.onload=init; send 1、首先要下载dwr 3.0 地址 http:/directwebremoting.org/dwr/download.html2、在web.xml中加入dwr的servlet和相关配置 dwr-invoker uk.ltd.getahead.dwr.DWRServlet debug true pollAndCome

16、tEnabled true 1 dwr-invoker /dwr/* pollAndCometEnabled是指dwr 的reverse ajax是使用polling 和comet的方式,在这个例子中可以明显地从页面上看出来是用的polling+comet附:关于reverse-ajax的实现有3种方式polling 就是隔一段时间向服务器发送一request来检查服务端是否有数据更新comet 就是一个长http请求,在请求期间服务端可以向客户端push数据,但是这种做法要求server和brower长期建立一个通信通道,而且效率很低piggyback 就是服务端的更新数据都在排队等待,等到

17、下一次有请求过来,那么这些等待更新数据就伴随这次请求一起发送到brower有关更详细的reverse-ajax技术介绍可以参考http:/getahead.org/dwr/reverse-ajax3、创建一个dwr.xml,用于配置你要制定的java代码映射类,以及允许使用的方法和convertercreate是只一个java的js映射,其中include是可以在js使用的方法convert 是指对应js到java,或者java到js的对象转换,其中include是可以转换的属性4、写服务段的java代码DWRHelperpackage com.cloverworxs.uma.helper;i

18、mport java.util.Collection;import java.util.LinkedList;import org.directwebremoting.WebContext;import org.directwebremoting.WebContextFactory;import org.directwebremoting.proxy.dwr.Util;public class DWRHelper public void addMessage(String text,String name) String tempStr = name+说:+text; LinkedList m

19、essages = new LinkedList(); if (text != null & text.trim().length() 0) messages.addFirst(new Message(tempStr); /messages.addLast(new Message(text); while (messages.size() 10) messages.removeLast(); / Reverse Ajax code to be added here shortly WebContext wctx = WebContextFactory.get(); String current

20、Page = wctx.getCurrentPage(); / Clear the input box in the browser that kicked off this page only Util utilThis = new Util(wctx.getScriptSession(); utilThis.setValue(text, ); / For all the browsers on the current page: Collection sessions = wctx.getScriptSessionsByPage(currentPage); Util utilAll = n

21、ew Util(sessions); / Clear the list and add in the new set of messages utilAll.removeAllOptions(chatlog); utilAll.addOptions(chatlog, messages, text); Messagepackage com.cloverworxs.uma.helper;import org.directwebremoting.Security;public class Message public Message(String newtext) text = newtext; if (text.length() 256) text = text.substring(0, 256); text = Security.replaceXmlCharacters(text); public long getId() return id; public String getText() return text; private long id = System.currentTimeMillis(); private String text;5、到此为止可以写页面代码了,下面的代码html或者jsp都可以Insert title hereJava Chat

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1