分享好友 最新动态首页 最新动态分类 切换频道
DWR数据反推实例
2024-11-01 23:22

DWR数据反推实例

http://www.elecfans.com/news/wangluo/20100804221337.html
http://blog.csdn.net/shimiso/article/details/8151362
http://wenku.baidu.com/view/150b957e168884868762d61f.html
http://lgf444.iteye.com/blog/190098
http://www.blogjava.net/zhutianxiang/archive/2009/03/05/258092.html
DWR2.x的推技术也叫DWR Reverse Ajax(逆向Ajax)主要是在BS架构中,从服务器端向多个浏览器主动推数据的一种技术。
在DWR所开的线程中使用Reverse Ajax时,通过WebContextFactory.get()获取WebContext对象,进而获取脚本Session。
在DWR之外使用Reverse Ajax时,就要用到ServerContext,在Spring环境中要得到ServerContext,就需要用到Spring的ServletContextAware接口。
一、Reverse Ajax的实现有3种方式
DWR的逆向Ajax主要包括两种模式:主动模式和被动模式。其中主动模式包括polling和comet两种,被动模式只有piggyback这一种。
1、piggyback方式
这是默认的方式。
如果后台有什么内容需要推送到前台,是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。
只有等到下次请求页面主动发起了,中间的变化内容才传递回页面。
2、comet方式
当服务端建立和浏览器的连接,将页面内容发送到浏览器之后,对应的连接并不关闭,只是暂时挂起。如果后面有什么新的内容需要推送到客户端的时候直接通过前面挂起的连接再次传送数据。
服务器所能提供的连接数目是一定的,在大量的挂起的连接没有关闭的情况下,可能造成新的连接请求不能接入,从而影响到服务质量。
3、polling方式
由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。只不过用了dwr之后这部分工作由框架帮我们完成了。
二、使用DWR的推技术的步骤
1、在web.xml文件中增加以下配置信息
<servlet>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<param-name>debug</param-name>
<!-- DWR默认采用piggyback方式 -->
<!-- 使用polling和comet的方式 -->
<param-name>pollAndCometEnabled</param-name>
<!-- comet方式 -->
<param-name>activeReverseAjaxEnabled</param-name>
<!-- polling方式:在comet方式的基础之上,再配置以下参数 -->
<param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name>
<param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value>
<!-- 毫秒数。页面默认的请求间隔时间是5秒 -->
<param-name>disconnectedTime</param-name>
<param-value>60000</param-value>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name>
</param-name> <param-value>true</param-value> </init-param> --> <!-- polling方式:在comet方式的基础之上,再配置以下参数 --> <!-- <init-param> <param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name> <param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value> </init-param> --> <!-- 毫秒数。页面默认的请求间隔时间是5秒 --> <!-- <init-param> <param-name>disconnectedTime</param-name> <param-value>60000</param-value> </init-param> --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
<listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener</listener-class>
<listener> <listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener</listener-class> </listener>
<listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextListener</listener-class>
<listener> <listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextListener</listener-class> </listener>
2、在dwr.xml中增加以下配置信息
<create creator="new" javascript="DWRHelper">
<param name="class" value="com.cjm.web.dwr.DWRHelper"/>
<include method="addMessage"/>
<include method="test"/>
</create>
<convert converter="bean" match="com.cjm.web.dwr.Message">
<param name="include" value="id,text"/>
</convert>
<create creator="new" javascript="DWRHelper"> <param name="class" value="com.cjm.web.dwr.DWRHelper"/> <include method="addMessage"/> <include method="test"/> </create> <convert converter="bean" match="com.cjm.web.dwr.Message"> <param name="include" value="id,text"/> </convert>
3、pojo类Message的源码
public class Message {
private long id = System.currentTimeMillis();
private String text;
public Message(){
public Message(String newText){
text = newText;
public long getId() {
return id;
public void setId(long id) {
this.id = id;
public String getText() {
return text;
public void setText(String text) {
this.text = text;
public class Message { private long id = System.currentTimeMillis(); private String text; public Message(){ } public Message(String newText){ text = newText; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } }
4、DWRHelper类源码
public class DWRHelper {
private static linkedList<Message> messages = new linkedList<Message>();
private static ReentrantLock lock = new ReentrantLock(); //JDK5锁
public void addMessage(String text){
try{
lock.lock();
if(text!=null && text.trim().length()>0){
messages.addFirst(new Message(text));
if(messages.size()>10){
messages.removeLast();
}catch(Exception ex){
ex.printStackTrace();
}finally{
lock.unlock();
//获得DWR上下文
WebContext webContext = WebContextFactory.get();
//获取当前页面URL,比如/ext3/test_tag.jsp
String currentPage = webContext.getCurrentPage();
//当前脚本sessin
scriptSession scriptSession = webContext.getscriptSession();
//设置页面控件的值
Util util = new Util(scriptSession);
util.setValue("text", ""); //这里是清空页面输入框的值
//设置脚本sessin的属性值
scriptSession.setAttribute("uid", "cjm");
//获取脚本session的属性值
for(Iterator it=scriptSession.getAttributeNames();it.hasNext();){
String attrName = (String)it.next();
System.out.println(attrName + "=" + scriptSession.getAttribute(attrName));
//获取所有浏览当前页面的脚本session
Collection<scriptSession> sessions = webContext.getscriptSessionsByPage(currentPage);
Util utilAll = new Util(sessions);
//执行客户端脚本
scriptBuffer script = new scriptBuffer();
script.appendscript("clientFunction(")
.appendData(scriptSession.getAttribute("uid"))
.appendscript(");");
for(scriptSession session: sessions){
session.addscript(script);
//更新这些脚本session的一些元素
utilAll.removeAllOptions("messages");
utilAll.addOptions("messages", messages, "id", "text");
public class DWRHelper { private static linkedList<Message> messages = new linkedList<Message>(); private static ReentrantLock lock = new ReentrantLock(); //JDK5锁 public void addMessage(String text){ try{ lock.lock(); if(text!=null && text.trim().length()>0){ messages.addFirst(new Message(text)); if(messages.size()>10){ messages.removeLast(); } } }catch(Exception ex){ ex.printStackTrace(); }finally{ lock.unlock(); } //获得DWR上下文 WebContext webContext = WebContextFactory.get(); //获取当前页面URL,比如/ext3/test_tag.jsp String currentPage = webContext.getCurrentPage(); //当前脚本sessin scriptSession scriptSession = webContext.getscriptSession(); //设置页面控件的值 Util util = new Util(scriptSession); util.setValue("text", ""); //这里是清空页面输入框的值 //设置脚本sessin的属性值 scriptSession.setAttribute("uid", "cjm"); //获取脚本session的属性值 for(Iterator it=scriptSession.getAttributeNames();it.hasNext();){ String attrName = (String)it.next(); System.out.println(attrName + "=" + scriptSession.getAttribute(attrName)); } //获取所有浏览当前页面的脚本session Collection<scriptSession> sessions = webContext.getscriptSessionsByPage(currentPage); Util utilAll = new Util(sessions); //执行客户端脚本 scriptBuffer script = new scriptBuffer(); script.appendscript("clientFunction(") .appendData(scriptSession.getAttribute("uid")) .appendscript(");"); for(scriptSession session: sessions){ session.addscript(script); } //更新这些脚本session的一些元素 utilAll.removeAllOptions("messages"); utilAll.addOptions("messages", messages, "id", "text"); } }
5、JSP页面源码
Html代码
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type='text/javascript' src='/ext3/dwr/engine.js'></script>
<script type='text/javascript' src='/ext3/dwr/util.js'></script>
<script type='text/javascript' src='/ext3/dwr/interface/DWRHelper.js'></script>
</head>
<!-- 通过 dwr.engine.setActiveReverseAjax(true); 启动该页面的Reverse Ajax功能 -->
<body οnlοad="dwr.engine.setActiveReverseAjax(true);sendMessage();">
<p>输入信息: <input id="text" οnkeypress="dwr.util.onReturn(event, sendMessage)" />
<input type="button" value="Send" οnclick="sendMessage()" /></p>
<script type="text/javascript">
function sendMessage() {
DWRHelper.addMessage(dwr.util.getValue("text"));
</script>
<hr/>
<select id="messages"></select>
</body>
最新文章
如何看网站的关键词_如何看网站的关键词数量
如何看网站的关键词_如何看网站的关键词数量接下来,我将为大家解答有关如何看网站的关键词的问题,希望我的回答对大家有所帮助。现在,我们就开始探讨一下如何看网站的关键词的话题吧。文章目录列表:1.怎么查看别人设置的关键词如何查看关
九一传媒公司如何打造符合市场需求的高效网站?专业的网页设计与SEO优化服务解析
随着互联网的快速发展,越来越多的公司开始重视网站的建设和优化,特别是对于一些专业的传媒公司来说,拥有一个高质量的网站是提升品牌形象、扩大市场影响力的重要方式。九一传媒公司作为一家专业的传媒公司,其网站建设不仅注重设计美观,
外贸SEO中,如何通过优化网站的移动端页面提升谷歌搜索排名?网站优化
- 移动端页面优化的重要性及对谷歌排名的影响在当前数字化时代,移动端页面优化的重要性愈发突出,尤其是在外贸SEO领域,优化移动端页面不仅是提升用户体验的必要手段,更是影响谷歌搜索排名的关键因素。随着智能手机和其他移动设备的普及
九枝兰专访SEO老炮儿Zac:企业主如何高效开展SEO
导语:大家都在说,如今的SEO越来越难做,很多站点关闭、站长失业,但还是有很多网站发展得越来越好,最关键的是要抓住不变的真理:用户至上,能够让用户用最舒适的方式获得有价值的信息就是最好的SEO。同时,要不断了解新的因素对搜索引擎
wordpress插件路径/常州seo排名收费
1)BlockingCollection 阻塞问题 从队列中取出数据,修改后重新放入队列,岂知取的时候队列空了会阻塞,用的方法是reqCol.GetConsumingEnumerable, 本来在消费端阻塞是想要的结果,但临时修改时ÿ
SEM(搜索引擎营销)
ylbtech-Miscellaneos:SEM(搜索引擎营销)搜索引擎营销:英文Search Engine Marketing ,我们通常简称为“SEM”。就是根据用户使用搜索引擎的方式利用用户检索信息的机会尽可能将营销信息传递给目标用户。简单来说,搜索引擎营销就是基于
快手报白是否成功怎么看?需要找客服吗? 2024技术攻略!超好用)
1986年04月11日私域社交电商服务,微信小程序开发,微信分销系统,网站建设,全网营销,特殊类目报白,抖音财经金融直播权限,抖音黄v认证,白名单,抖音直播间,运营,小店入驻,账号运营等全互联网业务,短视频全系业务,抖音小店开通,抖音小店代运营
“人工智能+”潜力巨大
2022年底ChatGPT横空出世,拉开了生成式人工智能(AIGC)的序幕,2024年初文生视频大模型Sora再一次引发全球热议,从大语言模型到多模态模型,人们看到了人工智能(AI)技术的飞速发展以及它所带来的无限可能。在博鳌亚洲论坛2024年年会上
Win10开启HDR变灰蒙蒙怎么办?Win10开启HDR变灰蒙蒙的解决方法
Win10开启HDR变灰蒙蒙的解决方法在Windows 10中,启用HDR(高动态范围)可以提供更加逼真和生动的图像显示效果。然而,有些用户在尝试开启HDR后却发现屏幕变得灰蒙蒙的,这可能会影响到他们的观影和游戏体验。如果你也遇到了这个问题,不要
【Google Pixel XXL(双4G)UC浏览器下载】谷歌PIXELXXLUC浏览器17.1.6.1347免费下载
UC专注16年,成就全球第三方手机浏览器全球6亿人上网必备APP,群众的眼睛是雪亮的头条视频小说网盘小游戏,想你之所想一应俱全UC浏览器全新版本清新亮相,打开优雅简洁新世界【来听听用户的心声】从用智能手机就一直在使用的浏览器,非常的
相关文章
推荐文章
发表评论
0评