- 浏览: 132687 次
- 性别:
- 来自: 武汉
最新评论
-
ping2010:
“备注:半推的第一个例子中,服务器是推向指定的ScriptSe ...
dwr3 Reverse Ajax学习小结 -
r4196503:
14行 copy(imgFile, newPath); 第一 ...
kindeditor上传图片的修改 -
muqingren:
你这个绑定多个表单对象能实现吗?
Spring MVC - Binding to multiple commands -
skying8603:
Util util = new Util(session); ...
dwr3 Reverse Ajax学习小结 -
soliucheng:
在修改数据的时候不需要吧,他会自己把版本号跟上。Hiberna ...
ss3ex中Hibernate的乐观锁使用
按照官网的例子,自己搭建了Clock等实例,回个头来总结下其中遇到的问题:
1、piggyback方式
dwr默认采用的是piggyback这种被动模式,如果需要采用这种模式的话不需要任何额外的配置就能完成。所谓的Piggyback指的是如果后台有什么内容需要推送到前台(即调用页面的js方法),是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。该方式可以替代我以前用的Jquery等的ajax方式。
2、polling方式
由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。类似于Ajax的轮询方式,只不过用了dwr之后这部分工作由框架帮我们完成了。
3、comet模式
指的的当服务端建立和浏览器的连接,将页面内容发送到浏览器之后,对应的连接并不关闭,只是暂时挂起。如果后面有什么新的内容需要推送到客户端的时候直接通过前面挂起的连接再次传送数据。既然有了comet模式,那么我就基本不用考虑polling方式了 。
重点的说下comet模式,即推模式。在官网的例子中用到了3种,分别如下:
Clock实例中
查看了源代码,发现了Browser中还有一个方法,里面也是用的ServerContextFactory,而且还能简化这个例子:
JavascriptChat 实例中
JavaChat 中
我认为JavaChat中的用法比JavascriptChat中的要简单。
再总结下关于“全推”和“半推”的使用方法,所谓全推是指上面的所有例子,客户端能看到服务端推的全部内容,半推就是客户端中只有部分能看到,或者说根据客户的权限不同,客户看到的服务端推的内容是不一样的。
全推的实现不用说了,半推的2种实现:
1、参照网上的一篇DWR聊天代码,用的是DWR2.0,我改成了3.0,大体是一样的,核心思路为:每创建一个 ScriptSession,就用户id和页面脚本session绑定
然后根据用户id获得指定用户的页面脚本session
推送消息时,只推送指定ScriptSession的用户
2、直接在页面中设置好用户的权限组DIV等标签,SS3EX中页面是动态的,根据用户登陆的标记,设置好标签,如:<security:authorize ifNotGranted="ROLE_ANONYMOUS"><div id="admin"></div>"></security:authorize>,服务端推送消息时采取JavaChat 中的方法,选择相应的标签ID推送消息,
备注:半推的第一个例子中,服务器是推向指定的ScriptSession用户,这里有个BUG,就是当用户刷新页面时,HttpSession不变,但是ScriptSession每刷新一次就增加一个,虽然最终也能把全部适合的ScriptSession找到,但是我还是觉得不是很好。
1、piggyback方式
dwr默认采用的是piggyback这种被动模式,如果需要采用这种模式的话不需要任何额外的配置就能完成。所谓的Piggyback指的是如果后台有什么内容需要推送到前台(即调用页面的js方法),是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。该方式可以替代我以前用的Jquery等的ajax方式。
2、polling方式
由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。类似于Ajax的轮询方式,只不过用了dwr之后这部分工作由框架帮我们完成了。
3、comet模式
指的的当服务端建立和浏览器的连接,将页面内容发送到浏览器之后,对应的连接并不关闭,只是暂时挂起。如果后面有什么新的内容需要推送到客户端的时候直接通过前面挂起的连接再次传送数据。既然有了comet模式,那么我就基本不用考虑polling方式了 。
重点的说下comet模式,即推模式。在官网的例子中用到了3种,分别如下:
Clock实例中
public void setClockDisplay(final String output) { String page = ServerContextFactory.get().getContextPath()+ "/clock.html"; Browser.withPage(page, new Runnable() { public void run() { Util.setValue("clockDisplay", output); } }); },对于这里的page,起先我设置的是一个ACTION,测试了好长时间没有成功,后来查看了源代码,发现了问题,因为Clock.java中用到了
public Clock() { ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); executor.scheduleAtFixedRate(this, 1, 1, TimeUnit.SECONDS); }ScheduledThreadPoolExecutor多线程,固实现的工厂类必须要是ServerContextFactory,而不能是WebContextFactory,在官网的例子中找到了依据(ServerContextFactory is a lot like WebContextFactory, however it will work outside a DWR thread. Since we're using the ScheduledThreadPoolExecutor thread here, we need to use ServerContext and not WebContext.),进一步说明由于用了多线程,所以page 处是不能用action的,因为不能是WebContextFactory。
查看了源代码,发现了Browser中还有一个方法,里面也是用的ServerContextFactory,而且还能简化这个例子:
Browser.withAllSessions(new Runnable() { public void run() { Util.setValue("clockDisplay", output); } });经过测试,确实如此好用 。
JavascriptChat 实例中
Browser.withCurrentPage(new Runnable() { public void run() { ScriptSessions.addFunctionCall("receiveMessages", messages); } });调用页面上的JS方法,这就是所谓的Reverse Ajax的经典展现。
JavaChat 中
Browser.withCurrentPage(new Runnable() { public void run() { // Clear the list and add in the new set of messages Util.removeAllOptions("chatlog"); Util.addOptions("chatlog", messages, "text"); } });
我认为JavaChat中的用法比JavascriptChat中的要简单。
再总结下关于“全推”和“半推”的使用方法,所谓全推是指上面的所有例子,客户端能看到服务端推的全部内容,半推就是客户端中只有部分能看到,或者说根据客户的权限不同,客户看到的服务端推的内容是不一样的。
全推的实现不用说了,半推的2种实现:
1、参照网上的一篇DWR聊天代码,用的是DWR2.0,我改成了3.0,大体是一样的,核心思路为:每创建一个 ScriptSession,就用户id和页面脚本session绑定
// 这里取会话(HttpSession)的id为用户id user = new User(request.getSession().getId(), username); //保存用户到列表 users.add(user); //将用户id和页面脚本session绑定 this.setScriptSessionFlag(user.getUserid()); /** * 将用户id和页面脚本session绑定 * @param userid */ public void setScriptSessionFlag(String userid) { WebContextFactory.get().getScriptSession().setAttribute("userid", userid); }
然后根据用户id获得指定用户的页面脚本session
/** * 根据用户id获得指定用户的页面脚本session * @param userid * @param request * @return */ @SuppressWarnings("unchecked") public ScriptSession getScriptSession(String userid, HttpServletRequest request) { ScriptSession scriptSessions = null; Collection<ScriptSession> sessions = new HashSet<ScriptSession>(); sessions.addAll(ServerContextFactory.get().getScriptSessionsByPage("/index.jsp")); for (ScriptSession session : sessions) { String xuserid = (String) session.getAttribute("userid"); if (xuserid != null && xuserid.equals(userid)) { scriptSessions = session; } } return scriptSessions; }
推送消息时,只推送指定ScriptSession的用户
/** * 发送消息 * @param sender 发送者 * @param receiverid 接收者id * @param msg 消息内容 * @param request */ public void send(String sender,String receiverid,String msg,HttpServletRequest request){ ScriptSession session = this.getScriptSession(receiverid, request); Util util = new Util(session); util.setStyle("showMessage", "display", ""); util.setValue("sender", sender); util.setValue("msg", msg); }
2、直接在页面中设置好用户的权限组DIV等标签,SS3EX中页面是动态的,根据用户登陆的标记,设置好标签,如:<security:authorize ifNotGranted="ROLE_ANONYMOUS"><div id="admin"></div>"></security:authorize>,服务端推送消息时采取JavaChat 中的方法,选择相应的标签ID推送消息,
Util.setValue("admin", "");
备注:半推的第一个例子中,服务器是推向指定的ScriptSession用户,这里有个BUG,就是当用户刷新页面时,HttpSession不变,但是ScriptSession每刷新一次就增加一个,虽然最终也能把全部适合的ScriptSession找到,但是我还是觉得不是很好。
评论
5 楼
ping2010
2012-11-12
“备注:半推的第一个例子中,服务器是推向指定的ScriptSession用户,这里有个BUG,就是当用户刷新页面时,HttpSession不变,但是ScriptSession每刷新一次就增加一个,虽然最终也能把全部适合的ScriptSession找到,但是我还是觉得不是很好。 ”实现ScriptSessionListener,用ScriptSessionManager进行管理,可以做到刷新页面的Remove掉以前之前的scriptSessionId
4 楼
skying8603
2011-02-22
Util util = new Util(session); dwr3里没这个方法把??
3 楼
马晨辉
2010-08-07
能不能给个例子看看
2 楼
deepsea0001
2009-07-10
Browser 类中有filter方法,是否可以用来实现半推,这样比较优雅。
1 楼
crabboy
2009-06-09
commet方式比较耗资源吧?还是觉得polling方式好啊
发表评论
-
Document对象内容集合
2010-09-18 12:18 919Document对象内容集合 document 文挡对象 - ... -
tomcat6配置https
2010-03-04 12:37 4173tomcat6配置双向认证 1、 ... -
maven-eclipse-plugin 与aspectj
2010-02-06 17:32 7685问题1:最近一段时间以来,项目中使用maven-eclipse ... -
linux中使用broadcom型号卡上网
2010-01-19 15:31 4173确认下网卡型号: sansha ... -
用nginx-0.8.32和一个tomcat6.0.20搭建ss3ex
2010-01-15 14:14 15321、下载nginx-0.8.32和一个tomcat6.0.20 ... -
用apache_2.2.14和tomcat6.0.20搭建ss3ex
2010-01-13 18:40 17011、安装apache_2.2.14-win32-x86-no_ ... -
nginx+tomcat配置负载均衡和集群
2010-01-12 16:25 17491、下载nginx(nginx/Windows-0.8.32) ... -
ss3ex中的自定义URL格式
2009-11-23 22:21 1936自定义URL格式,本方法只是在模仿REST样的URL格式: 比 ... -
ss3ex与Lingo,ss3中spring security2使用的差别
2009-10-29 09:32 2457spring security2中实现数据库管理认证和授权,版 ... -
WEB框架中异步实现方案
2009-10-22 22:15 1628异步解决方案中除了JMS,AJAX,DWR等外的简单选择,就是 ... -
实现线程内和线程间传值,合理使用ThreadLocal
2009-10-10 08:55 6577以下均在ss3ex环境中 1、理解线程 用户请求一个URL,所 ... -
Struts2中页面上访问后台static类中的方法
2009-09-14 19:05 14541、在struts.xml中保证(或者设置) <cons ... -
读取excel文件
2009-09-09 10:41 1327读取excel文件 -
不用session、request传值的另一种解决方案
2009-08-13 19:40 1619不用session、request传值的另一种解决方案: pu ... -
发布ss3ex的maven版本,取名叫sango吧
2009-07-19 23:19 1152都在用maven,跟上步伐,发布一个maven版本的s ... -
tomcat调试maven2项目
2009-07-16 21:49 4751一、搭建maven项目(目的 ... -
eclipse3.4安装m2eclipse
2009-07-15 10:50 2920工作需要,必须要使用maven2。 eclipse版本:ecl ... -
kindeditor上传图片的修改
2009-06-27 12:19 19518最近做新闻系统,用了kindeditor,其中上传图片 ... -
预先抓取,外连接,和直接查询三者直接的区别
2009-06-15 17:51 1124预先抓取,外连接,和直接查询三者直接的区别: [1]. 预先抓 ... -
值集合映射 annotation
2009-06-15 13:29 879值集合映射 @CollectionOfElements ...
相关推荐
实现一个简单的Web版的聊天功能,Java使用开源框架最新版本的dwr3,包括相应的JSP页面的实现。
即时通讯DWR Reverse Ajax
dwr reverseajax clockms
dwr reverseajax ClockLogging
两个例子reverse ajax的实现 博文链接:https://yaojialing.iteye.com/blog/716094
NULL 博文链接:https://ping2010.iteye.com/blog/1680406
Server Side Reverse Ajax Clock
DWR jar包 ajax必备,非常实用的开源工具
dwr实现ajax功能ajax+dwr.........................
dwr学习总结 dwr学习总结 dwr学习总结
dwr, java ajax 应用框架,可以将Java对象直接export到ie客户端,成为javascript对象,非常方便js和服务器端的交互,如果你还没有用,就是一下。太方便了呀。
dwr反向ajax使用,即时提醒。WEB网页实现右下角时时弹出提醒DIV
DWR for JAVA 具体开发过程详细介绍
AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程
dwr反向Ajax的三种情况dwr反向Ajax的三种情况
Ajax(DWR实现例子) Ajax(DWR实现例子) Ajax(DWR实现例子) Ajax(DWR实现例子) Ajax(DWR实现例子) Ajax(DWR实现例子)
dwr的使用和ajax的使用demo
ajax 中流行框架dwr 本人写的官方的例子。。。不容错过对Ajax的同学。
DWR是一个很优秀的开源框架! 参考书和案例 :包含了具体参考书和实用案例! 效果比较炫!值得学习研究啊!
DWR学习资料 :DWR 3.0 上传文件.txt DWR3.0反向Ajax示例.txt DWR3.0学习笔记.txt DWR3.0学习网址.txt dwr分页.doc DWR分页代码.doc DWR中文文档.doc DWR中文文档.pdf dwr做comet的完整实现.doc Spring整合DWR comet ...