dwr网上使用例子
转:
dwr实现聊天室功能
用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种。通常我们要实现无刷新,一般会使用到Ajax。Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔若干秒时间向服务器发出轮询以进行更新,另一种方法是服务器始终打开与浏览器的连接并在数据可用时发送给浏览器。第一种方法一般利用setTimeout或是setInterval定时请求,并返回最新数据,这无疑增加了服务器的负担,浪费了大量的资源。而第二种方法也会浪费服务器资源,长期的建立连接;而相对第一种来说,第二种方式会更优于第一种方法;这里有一个一对多和多对一的关系,而comet向多个客户端推送数据就是一对多的关系。而具体使用哪种方式,要看你当前的需求而定,没有绝对的。
为什么使用Comet?
轮询方法的主要缺点是:当扩展到更多客户机时,将生成大量的通信量。每个客户机必须定期访问服务器以检查更新,这为服务器资源添加了更多负荷。最坏的一种情况是对不频繁发生更新的应用程序使用轮询,例如一种 Ajax 邮件 Inbox。在这种情况下,相当数量的客户机轮询是没有必要的,服务器对这些轮询的回答只会是 “没有产生新数据”。虽然可以通过增加轮询的时间间隔来减轻服务器负荷,但是这种方法会产生不良后果,即延迟客户机对服务器事件的感知。当然,很多应用程序可以实现某种权衡,从而获得可接受的轮询方法。
尽管如此,吸引人们使用 Comet 策略的其中一个优点是其显而易见的高效性。客户机不会像使用轮询方法那样生成烦人的通信量,并且事件发生后可立即发布给客户机。但是保持长期连接处于打开状态也会消耗服务器资源。当等待状态的 servlet 持有一个持久性请求时,该 servlet 会独占一个线程。这将限制 Comet 对传统 servlet 引擎的可伸缩性,因为客户机的数量会很快超过服务器栈能有效处理的线程数量。
如果本示例结合Jetty应用服务器效果会更好。
开发环境:
System:Windows
WebBrowser:IE6+、Firefox3+
JavaEE Server:tomcat5.0.2.8、tomcat6
IDE:eclipse、MyEclipse 8
开发依赖库:
JavaEE5、Spring 3.0.5、dwr 3
Email:hoojo_@126.com
Blog:http://blog.csdn.net/IBM_hoojo or http://hoojo.cnblogs.com/
一、准备工作
1、 下载dwr的相关jar包
https://java.net/downloads/dwr/Development%20Builds/Build%20116/dwr.jar
程序中还需要spring的相关jar包
http://ebr.springsource.com/repository/app/library/version/detail?name=org.springframework.spring&version=3.0.5.RELEASE
需要的jar包如下

2、 建立一个WebProject,名称DWRComet
在web.xml中添加dwr、spring配置如下:
- <--><listener><listener-class></listener-class></listener><--><context-param><param-name></param-name><param-value></param-value></context-param><listener><listener-class></listener-class></listener><servlet><servlet-name></servlet-name><servlet-class></servlet-class><init-param><param-name></param-name><param-value></param-value></init-param><--><init-param><param-name></param-name><param-value></param-value></init-param></servlet><servlet-mapping><servlet-name></servlet-name><url-pattern></url-pattern></servlet-mapping>
3、 在src目录加入applicationContext-beans.xml配置,这个配置专门配置bean对象,用来配置需要注入的对象。
- <?xml= =?><beans=
- =
- =
- =
- =
- =
- ="http://www.springframework.org/schema/beans
- ></beans>
4、 在WEB-INF目录添加dwr.xml文件,基本代码如下
- <? = =?>><></>
以上的准备基本完毕,下面来完成无刷新聊天室代码
1、 聊天实体类Model
- packageimport * <b>function:</b>
- * @author hoojo
- * @createDate 2011-6-3 下午06:40:07
- * @file Message.java
- * @package com.hoo.entity
- * @project DWRComet
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */publicclassprivateintprivateprivate
- }
2、 编写聊天信息的事件
- packageimport * <b>function:</b>发送聊天信息事件
- * @author hoojo
- * @createDate 2011-6-7 上午11:24:21
- * @file MessageEvent.java
- * @package com.hoo.util
- * @project DWRComet
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */publicclassextendsprivatestaticfinallongpublicsuper}
继承ApplicationEvent,构造参数用于传递发送过来的消息。这个事件需要一个监听器监听,一旦触发了这个事件,我们就可以向客户端发送消息。
3、 发送消息服务类,用户客户端发送消息。dwr需要暴露这个类里面的发送消息的方法
- packageimportimportimportimport * <b>function:</b>客户端发消息服务类业务
- * @author hoojo
- * @createDate 2011-6-7 下午02:12:47
- * @file ChatService.java
- * @package com.hoo.chat
- * @project DWRComet
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */publicclassimplementsprivatepublicvoidthrowsthis * <b>function:</b> 向服务器发送信息,服务器端监听ChatMessageEvent事件,当有事件触发就向所有客户端发送信息
- * @author hoojo
- * @createDate 2011-6-8 下午12:37:24
- * @param msg
- */publicvoid
- new}
上面的sendMessage需要浏览器客户端调用此方法完成消息的发布,传递一个Message对象,并且是触发ChatMessageEvent事件。
4、 编写监听器监听客户端是否触发ChatMessageEvent
- packageimportimportimportimportimportimportimportimportimportimportimport * <b>function:</b>监听客户端事件,想客户端推出消息
- * @author hoojo
- * @createDate 2011-6-7 上午11:33:08
- * @file SendMessageClient.java
- * @package com.hoo.util
- * @project DWRComet
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */()
- publicclassimplementsprivatepublicvoidthis()
- publicvoid
- ifinstanceof
- );
- fornew + (time.getMonth() + ) + + time.getDate() + + time.getMinutes() + + time.getSeconds();
- );
- }
上面的代码主要是监听客户端的事件,一旦客户端有触发ApplicationEvent事件或是其子类,就会执行onApplicationEvent方法。代码中通过instanceof判断对象实例,然后再执行。如果有触发ChatMessageEvent事件,就获取所有连接chat.jsp这个页面的ScriptSession。然后像所有的ScriptSession中添加script。这样被添加的ScriptSession就会在有连接chat.jsp的页面中执行。
所以这就是客户端为什么会执行服务器端的JavaScript代码。但前提是需要在web.xml中添加dwrComet配置以及在chat页面添加ajax反转。
5、 下面开始在bean容器和dwr的配置中添加我们的配置
applicationContext-beans.xml配置
- <bean= =/><bean= =/>
上面的chatService会在dwr配置中用到
dwr.xml配置
- <allow><convert= =><param= = /></convert><create= =><param= = /></create></allow>
charService的sendMessage方法传递的是Message对象,所以要配置Message对象的convert配置。
上面的create的creator是spring,表示在spring容器中拿chatService对象。里面的参数的beanName表示在spring容器中找name等于charService的bean对象。
6、 客户端chat.jsp页面代码
- <= = =%>< = .getContextPath();
- = .getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- >><html><head><base=><title></title><meta= =><meta= =><meta= =><script= =></script><script= =></script><script= =></script><script=> = Date();
- = .util.getValue("content");
- = .util.getValue("userName");
- = (encodeURI(name + " say:\n" + content));
- = {"msg": info, "time": time};
- = (decodeURI(data.msg));
- = .util.getValue("info");
- </script></head><body=><textarea= = = =></textarea><hr/><input= =/><br/><textarea= = =></textarea><input= == =/></body></html>
首先,你需要导入dwr的engine.js文件,这个很重要,是dwr的引擎文件。其次你使用的那个类的方法,也需要在导入进来。一般是interface下的,并且在dwr.xml中配置过的create。
上面的js中调用的charService类中的sendMessage方法,所以在jsp页面中导入的是ChatService.js。
在body的onload事件中,需要设置反转Ajax,这个很重要。
showMessage是ChatMessageClient的onApplicationEvent方法中的appendScript中需要执行的方法。data参数也是在那里传递过来的。
每当发送sendMessage方法后就会触发ChatMessageEvent事件,然后监听的地方就会执行onApplicationEvent方法,在这个方法中又会执行浏览器中的showMessage方法。

我在项目中实际的是以这个为根据,然后自己修改的
dwr网上使用例子的更多相关文章
- DWR入门的例子(一个)
DWR(Direct Web Remoting)是WEB远程调用框架.使用这种框架使AJAX发展至今已成为非常easy.使用DWR能client利用JavaScript直接调用服务端的Java方法并返 ...
- Ajax框架,DWR介绍,应用,例子
使用Ajax框架 1. 简化JavaScript的开发难度 2. 解决浏览器的兼容性问题 3. 简化开发流程 常用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax提供 ...
- dwr框架介绍
转: [DWR框架]过时了吗? 置顶 2018年06月02日 11:59:02 许你笑颜 阅读数:4129 版权声明: https://blog.csdn.net/smileyan9/articl ...
- dwr框架中DWRUtil的方法
dwr框架中DWRUtil的方法 2008-10-14 17:57:23| 分类: JAVA | 标签: |举报 |字号大中小 订阅 7. util.js 功能 util.js包含了一些工 ...
- xfire webServeic 例子
xfire webServeic 例子,参考网上众多例子,自己写得完成了,给大家分享 大家只要按这个目录去建文件就可以了,然后运行,至于其中原理慢慢理会吧 环境:myeclipse 10 +xfire ...
- Android调用天气预报的WebService简单例子
下面例子改自网上例子:http://express.ruanko.com/ruanko-express_34/technologyexchange5.html 不过网上这个例子有些没有说明,有些情况不 ...
- PL/pgSQL的 RETURN NEXT例子
从网上找到例子: 可以说,RETURN NEXT要用在循环中: 例子一: 数据准备: CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT); ...
- ViewPager的简单例子
这个例子是按照官网上的例子写的,有点抄袭的嫌疑,但是自己单独写一下会加深自己的印象. 首先是MainAcitivity.xml: <LinearLayout xmlns:android=&quo ...
- macaca测试web小例子
上午刚把macaca的环境在公司的电脑上吧web 端的环境给搭建好,于是乎,看看网上的例子,看看官方的文档 https://macacajs.github.io/wd.py/ 可以在这个链接看到原滋原 ...
随机推荐
- WPF编程,通过Double Animation动态更改控件属性的一种方法。
原文:WPF编程,通过Double Animation动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/a ...
- 使用FindAncestor查找方式绑定且不需要使用datacontext
原文:使用FindAncestor查找方式绑定且不需要使用datacontext <UserControl x:Class="QuJiao.AnimationVideoPlayer&q ...
- springboot的热部署和dubug
采用了项目聚合,产生一些不同,遇到的问题和解决方法分享下. 项目结构: rebuilder2 -htran 主项目 -htran-api 1.htran.pom <parent> < ...
- [2016北京集训测试赛17]crash的游戏-[组合数+斯特林数+拉格朗日插值]
Description Solution 核心思想是把组合数当成一个奇怪的多项式,然后拉格朗日插值..:哦对了,还要用到第二类斯特林数(就是把若干个球放到若干个盒子)的一个公式: $x^{n}=\su ...
- python基础学习1-列表使用
python 列表相关操作方法 namelist = ['a','b','c','d','1','2','3','4'] namelist1 = ['a','b','c','d','1','2','3 ...
- 上google的方法
最近Google又被墙了....哎,纠结..... 说实话,咱都是良民,爱党爱国,真心不想干啥,只想查点资料的,输入google都上不去了. 方法: 1. FQ.很麻烦,有时候改来改去也容易出错,速度 ...
- mybatis源码-解析配置文件(二)之解析的流程
目录 1. 简介 2. 配置文件解析流程分析 2.1 调用 2.2 解析的目的 2.3 XML 解析流程 2.3.1 build(parser) 2.3.2 new XMLConfigBuilder( ...
- flask_admin 笔记二 授权和权限
权限当然就是让有应该权限的用户能执行某些操作,把没有权限的用户限制在外面.Flask-admin提供了几种方法来处理: 1, Http basic Auth 最简单的身份验证形式是HTTP基本身份验证 ...
- PAT甲题题解-1049. Counting Ones-数学问题
n位数,总共有0~10^n-1共计10^n个数那么所有数出现的总次数变为n*(10^n)个数1出现的次数便是十分之一,所以n位数中,1出现的次数为n*10^(n-1)知道这一个后,接下来就方便求了. ...
- Todo&Rocket
Todo是怎么实现的? 前面两篇博客分别介绍了MVC和Backbone.js的逻辑,但是实战获真知,在来一篇来显示下Todo是怎么通过Backbone.js连接起来的. 忽略掉所有的代码,我们只是打开 ...