分享好友 最新动态首页 最新动态分类 切换频道
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>
最新文章
微信跳转抖音链接生成步骤,在线免费创建
市场营销获客工具【爱短链】全域跳转工具,打通私域引流关键一步:轻松将公域流量,引导至私域,通过链接点击直达,方便快捷,无风险提示跳转,助力企业/商家高速获客》》点此生成链接
Desk平台设计_今日desk设计教程
摘要:Desk平台设计,今日desk设计教程,新片场素材小编谈梓Desk平台设计,今日desk设计教程相关内容整理,如果您对Desk平台设计,今日desk设计教程感兴趣欢迎访问免费阅读。Desk平台设计,今日desk设计教程一、Desk平台在线设计教程介绍Udesk
新股速递 | 360金融,互联网巨头旗下金融科技公司上市第一股
本文由“华盛证券”供稿,文中观点不代表智通财经观点。360金融是由360金服(北京奇步天下科技有限公司运营的集团)孵化,成立于2016年7月,并于2018年9月拆分独立运营发展,自成立到赴美上市,时间不足三年。根据招股书,从放款额算,360
WordPress后台上传文件大小受限制解除方法
WordPress后台上传文件大小受限制解除方法最近刚录了一个外贸photoshop教程一,录制后想把视频上传到网站,然后就遇到了一个问题,就是视频太大,后台无法上传。wordpress后台默认支持上传文件的大小是50M, 但我录制的视频教程经压缩后还
华为云数智融合平台支撑MetaERP计划引擎更智能更实时
计划引擎是ERP系统中计划组件的大脑,要能根据实时的供需数据运算得出精准的计划指令。华为的供应链覆盖了数万种采购物料,每年交易额超过千亿,物料清单层级高达十层,约束条件和场景多达上百个。每次计划引擎的输入量都达到千万级,需要
SEO神器揭秘,提升网站排名的优化技术软件解析
《揭秘SEO排名技术软件:高效提升网站搜索引擎优化》一文深入解析了SEO排名技术软件的原理与功能,介绍如何利用该利器助力网站在搜索引擎中实现快速排名,显著提高SEO优化效率。随着互联网的飞速发展,搜索引擎优化(SEO)已经成为企业网站
免费seo优化诊断推广(免费seo推广计划)
大家好,今天小编关注到一个比较有意思的话题,就是关于免费seo优化诊断推广的问题,于是小编就整理了5个相关介绍免费seo优化诊断推广的解答,让我们一起看看吧。seo优化推广多少钱?什么叫seo优化?做百度推广SEO优化赚钱吗,利润可观吗?
LOL-2021季中赛RNG夺冠荣耀头像领取网址大揭秘:独家分享-庆祝胜利荣耀时刻
在电子竞技的浩瀚星空中,有一支队伍如流星划过,带来了耀眼的荣光。他们就是英雄联盟(League of Legends,简称LOL)赛场上的巨擘——RNG战队。当2021季中赛的胜利属于他们时,无数的粉丝为之欢腾,为这支队伍的荣耀时刻献上最热烈的掌声
天猫母婴店铺开通需要什么条件?母婴类目入驻天猫有哪些要求?
新亲子互动交易时代的来临,针对母婴电商而言即是机会,都是考验,依据大数据显示少年儿童群体规模在过去十年展现增长势头,经济发展水平的不断提高推动儿童经济销售市场非常大的市场潜力。那样天猫母婴类店面如何开通呢?天猫数据表明,婴
为什么SEO优化应该与独立站的营销战略紧密结合?提升网站流量与品牌曝
- SEO优化能够提升独立站的自然流量,增强品牌曝光度。SEO优化是提升独立站自然流量和增强品牌曝光度的重要手段之一。首先,SEO优化能够通过提高网站在搜索引擎结果页面(SERP)中的排名,吸引更多的潜在客户。当用户在搜索引擎中输入与品
相关文章
推荐文章
发表评论
0评