`
san586
  • 浏览: 134722 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

dwr3 Reverse Ajax学习小结

阅读更多
按照官网的例子,自己搭建了Clock等实例,回个头来总结下其中遇到的问题:
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方式好啊

相关推荐

    即时通讯DWR Reverse Ajax

    总结,DWR Reverse Ajax是一种强大的工具,通过它,开发者可以构建出具有高效实时性的Web应用,极大地提升了用户的交互体验。然而,需要注意的是,由于保持长期连接会占用服务器资源,因此在高并发场景下,需要合理...

    DWR让Ajax如此简单

    - **Reverse Ajax(反向Ajax)**: DWR实现了反向Ajax,即服务器可以主动推送数据到客户端,而不仅仅是响应客户端的请求。 - **Caching(缓存)**: DWR支持缓存服务器端的响应,提高性能,减少网络流量。 ### 2. ...

    AJAX DWR教程

    - **Reverse AJAX Servlet**: DWR自动配置的Servlet,接收来自JavaScript的请求,并调用相应的Java方法。 - **Auto-Discovery**: DWR可以自动发现Java类中公开的方法,并暴露给JavaScript使用,只需要简单的注解...

    ajax dwr学习笔记和jar文件

    2. **反向Ajax(Reverse Ajax)**:DWR是反向Ajax的一个实现,意味着服务器可以主动向客户端发送数据,而不仅仅是响应客户端的请求。 二、DWR的主要组件 1. **CMT (Cross Page Posting)**:这是DWR的基础,用于在不同...

    dwr3与ssh 开发的webim

    在本项目中,DWR3版本被用来实现Reverse Ajax和服务器推送技术。Reverse Ajax是指服务器主动向客户端推送数据,而不是等待客户端发起请求。DWR3通过建立持久的HTTP连接来实现这一功能,使得服务器能够及时将新消息推...

    反向ajax聊天简单例子

    总结,"反向Ajax聊天简单例子"是一个学习反向Ajax技术的实践项目,通过DWR框架实现了服务器主动推送消息的聊天功能。理解并实践这个例子,有助于开发者掌握Ajax的高级用法,提升Web应用的实时性和互动性。

    基于dwr的java推送消息慕课小项目

    DWR的核心组件包括Engine、ReverseAjax和Util,它们分别负责处理JavaScript到Java的调用、Java到JavaScript的回调以及一些辅助功能。 **Java推送消息** 在传统的HTTP请求-响应模型中,服务器无法主动向客户端发送...

    DWR框架的例子-ajax

    1. **Reverse Ajax**:DWR的核心特性,允许服务器主动向客户端推送数据,而不仅仅是响应客户端的请求。 2. **Batching**:DWR支持批量调用,减少网络通信次数,提高性能。 3. **Caching**:缓存机制可以存储重复的...

    Ajax框架dwr3.0中文

    1. **逆向Ajax(Reverse Ajax)**:DWR的核心特性之一是逆向Ajax,即由服务器向客户端推送数据,而不是传统的用户触发请求。这使得实时更新和交互成为可能。 2. **映射(Mapping)**:DWR通过配置文件或注解将Java...

    dwr笔记 dwr自学资料

    1. **反向Ajax**:DWR实现了一种反向Ajax(Reverse Ajax)技术,使得服务器能够主动向客户端推送数据,而不仅仅是响应客户端的请求。 2. **JavaScript与Java的桥接**:DWR通过动态生成JavaScript库来映射Java对象和...

    dwr学习笔记(一个简单猜数字游戏)

    总结来说,这个"DWR学习笔记"示例涵盖了以下知识点: 1. DWR的基本概念和工作原理,包括Reverse Ajax机制。 2. 如何在服务器端配置DWR,定义可调用的Java服务。 3. 客户端如何使用DWR的JavaScript库与服务器进行通信...

    服务器端ajax框架--------DWR实践总结

    **服务器端Ajax框架——DWR实践总结** DWR(Direct Web Remoting)是一个开源的Java框架,它使得在Web应用程序中实现Ajax(异步JavaScript和XML)功能变得更加简单。DWR允许JavaScript在客户端与服务器端Java对象...

    《ajax框架:dwr与ext》实战

    3. **应用小结**: - 总结DWR的优点和不足。 - 分析DWR与其他Ajax框架的区别。 #### 四、DWR综合实践:用户管理模块实现 1. **系统功能界面**: - 设计用户管理界面,包括用户列表、新增用户、编辑用户等功能。...

    DWR网页聊天例子

    要实现聊天应用的实时性,DWR提供了两种主要机制:Polling 和 Reverse Ajax (也称为 comet 技术)。Polling 是客户端定时向服务器发送请求检查新消息,而Reverse Ajax则是服务器主动推送给客户端新消息。在这个例子...

    ajax+dwr的一个简单例子

    DWR的核心是将Java对象暴露给JavaScript,这个过程称为"Reverse Ajax"或"Cross Site Scripting (XSS)"。当客户端(通常是浏览器中的JavaScript)需要调用服务器上的方法时,DWR会自动处理这些请求,将它们包装成HTTP...

    DWR 技术文章精选

    - **ReverseAjax**:也称为心跳或回调机制,允许服务器向客户端发送数据,实现双向通信。 3. **DWR 配置**: 配置DWR通常包括在Web应用的`web.xml`文件中配置过滤器和Servlet,以及在应用的Java类中声明可暴露给...

    dwr_demo_test

    - **Reverse AJAX**:DWR实现了反向AJAX,即服务器主动推送数据到客户端,而不仅仅是响应客户端请求。 - **Java和JavaScript之间的映射**:DWR自动处理Java对象与JavaScript对象之间的类型转换,使得数据交换更加...

    dwr+从服务端推送消息到网页

    DWR的核心组件包括`DWRServlet`、`ReverseAjax`和`AutoComplete`等。`DWRServlet`作为入口点,处理来自客户端的请求;`ReverseAjax`实现服务端向客户端的推送;`AutoComplete`则用于自动补全功能。 3. **服务端推...

    dwr测试,java调用js

    DWR的主要目标是简化AJAX(Asynchronous JavaScript and XML)开发,使得开发者能够轻松地在浏览器中调用服务器上的Java方法,就像调用本地JavaScript函数一样。这个技术极大地提升了用户体验,因为数据可以在不刷新...

Global site tag (gtag.js) - Google Analytics