`
daichangfu
  • 浏览: 262824 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

初学dwr推技术(总结一下)

    博客分类:
  • ajax
阅读更多
下面是我在网上看过的两个小实例

第一个:
DWR2.0.x的推技术以推发送消息,适用于ChatRoom,股票信息显示等场景,优于现在JS定时轮询服务端的策略,大大节省服务端的资源(数据无变化时不需要应答客户端的定时查询)。

推技术的经典范例是DWR Examples里的ChatRoom。

推消息的接收页

1. 引入dwr及那个负责执行推操作的Java类(NoticeService)的js

<script type="text/javascript" src="dwr/interface/NoticeService.js"></script>
<script type="text/javascript" src="dwr/engine.js"></script>
<script type="text/javascript" src="dwr/util.js"></script>

2.设定任意的接收推信息的js函数
function receiveMessages(message) {
    $('result').innerHTML += "收到消息:" + message + "
";
}

3.在body的onload里设定ReverseAjax=true
<body onload="DWREngine.setActiveReverseAjax(true);">

负责推送消息的Java类
public class NoticeService {
    public void send(String message) {
        WebContext wctx = WebContextFactory.get();
        ScriptBuffer script = new ScriptBuffer();
        script.appendScript("receiveMessages('").appendData(message).appendScript("');");

        ServerContext sctx = ServerContextFactory.get(wctx
                .getServletContext());
        
        Collection<ScriptSession> pages = 
        	sctx.getScriptSessionsByPage("/ajax/dwr-push.html");

        for (ScriptSession session : pages) {
            session.addScript(script);
        }
        
        /*
         Collection<ScriptSession> pages = 
         	sctx.getScriptSessionsByPage("/ajax/dwr-push.html");
        for (ScriptSession session : pages) {
            session.addScript(script);
        }
        	这里是获取所有/ajax/dwr-push.html页面的ScriptSession
        	返回一个ScriptSession类型的Collection集合
        	遍历得到所有ScriptSession的实例对象向所有页面发送内容
        	
        	如果你执行对当前页面发送内容 可以直接写:
        	ScriptSession session = wctx.getScriptSession();
        	session.addScript(script);
         */
        
    }
}

可见,用ScriptBuffer构造一段在客户端执行的JavaScript,然后使用WebContext,ServerContext定位需要发送的session进行发送。注意这里HardCode了URL路径来确定Subscriber,也可以像ChatRoom里面那样,用currenpage发给与NoticeService的调用者发起者在同一页的session。
原文地址:http://www.family168.com/oa/tech/ajax.html


第二个:
当你有QQ消息时,QQ的小图标会晃动,我们甚至还可以设定QQ有消息时,自动弹出来!
这些在C/S模式下很容易实现!如果要在B/S模式如何来实现呢?
我们的肯定会想到在客服端调用ajax在后台不断的查询服务器.看是否有关于自己的消息.如果有则查询返回.这种做法肯定会大量的占用系统的资源!不可取!
现在DWR的反转AJAX功能.允许我们从服务器端来控制客服端.而不需要客户端来请求.服务器可以自动把消息发给指定的客户端!

用户的JAVABEAN User.java
package com.lhq;

/**
 * 用户类
 * 
 * @author 廖瀚卿
 * 
 */
public class User {

	private String userid;

	private String username;

	public String getUserid() {
		return userid;
	}

	public void setUserid(String userid) {
		this.userid = userid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public User(String userid, String username) {
		super();
		this.userid = userid;
		this.username = username;
	}

}


聊天处理类 ChatManager.java
package com.lhq;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.directwebremoting.ScriptSession;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.proxy.dwr.Util;

/**
 * 处理聊天相关
 * 
 * @author 廖瀚卿
 * 
 */
public class ChatManager {

	/** 保存当前在线用户列表 */
	public static List<User> users = new ArrayList<User>();

	/**
	 * 更新在线用户列表
	 * @param username 待添加到列表的用户名
	 * @param flag 是添加用户到列表,还是只获得当前列表
	 * @param request
	 * @return 用户userid
	 */
	public String updateUsersList(String username, boolean flag, HttpServletRequest request) {
		User user = null;
		if (flag) {	
			// 这里取会话(HttpSession)的id为用户id 
			user = new User(request.getSession().getId(), username);
			//保存用户到列表
			users.add(user);	
			//将用户id和页面脚本session绑定
			this.setScriptSessionFlag(user.getUserid());
		}
		//获得DWR上下文
		ServletContext sc = request.getSession().getServletContext();
		ServerContext sctx = ServerContextFactory.get(sc);
		//获得当前浏览 index.jsp 页面的所有脚本session
		Collection sessions = sctx.getScriptSessionsByPage("/chat/index.jsp");
		Util util = new Util(sessions);
		//处理这些页面中的一些元素
		util.removeAllOptions("users");
		util.addOptions("users", users, "username");
		util.removeAllOptions("receiver");
		util.addOptions("receiver", users,"userid","username");
		if(!flag){
			return null;
		}
		return user.getUserid();
	}

	/**
	 * 将用户id和页面脚本session绑定
	 * @param userid
	 */
	public void setScriptSessionFlag(String userid) {
		WebContextFactory.get().getScriptSession().setAttribute("userid", userid);
	}

	/**
	 * 根据用户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(request.getSession().getServletContext())
				.getScriptSessionsByPage("/chat/index.jsp"));
		for (ScriptSession session : sessions) {
			String xuserid = (String) session.getAttribute("userid");
			if (xuserid != null && xuserid.equals(userid)) {
				scriptSessions = session;
			}
		}
		return scriptSessions;
	}
	
	/**
	 * 发送消息
	 * @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);
	}
}

聊天主页面 index.jsp (这个有的用户用$()标记得不到值,在页面表单加上ID同名属性或者用getelementbyid)
<%@ page language="java" pageEncoding="GBK"%>
<html>
	<head>
		<title>chat</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<script type='text/javascript' src='/chat/dwr/interface/ChatManager.js'></script>
  		<script type='text/javascript' src='/chat/dwr/engine.js'></script>
		<script type='text/javascript' src='/chat/dwr/util.js'></script>
		
		<script type="text/javascript" src="/chat/js/chat.js"></script>
	</head>
	<body>
		<input type="hidden" name="userid" id="userid" />
		<br>
		昵称:
		<input type="text" name="username" id="username" />
		<input type="button" value="注册" onclick="register(this);" />
		我要对
		<select name="receiver" id="receiver" disabled=true" >
		</select>
		说:
		<input type="text" name="message" id="message" disabled="true" />
		<input type="button" value="发送" id="send" name="send" disabled="true"
			onclick="send();" />
		在线用户列表:
		<ul id="users">
		</ul>

		<div id="showMessage" style="display: none">
			<span id="sender"></span>对你说:
			<span id="msg"></span>
		</div>
	</body>
</html>



JAVASCRIPT 文件 chat.js
/**
 * 注册帐号
 */
function register(button) {
	if ($('username').value == "" || $('username').value.length <= 0) {
		alert("请输入昵称");
		return;
	}

	/* 下面是对一些按钮的禁用和激活操作 */
	$('username').disabled = true;
	button.disabled = true;
	$('message').disabled = false;
	$('send').disabled = false;
	$('receiver').disabled = false;

	/* 把我输入的用户名注册到服务器,并获得用户id(这里用session id 代替) */
	ChatManager.updateUsersList($('username').value, true, function(data) {
		if (data != null && data.length > 0) {
			$('userid').value = data; // 注册成功,把userid放到当前页面
		}
	});
}

/**
 * 页面初始化
 */
function init() {
	dwr.engine.setActiveReverseAjax(true); // 激活反转 重要
	ChatManager.updateUsersList(null, false); // 当你打开界面的时候,先获得在线用户列表.
}

/**
 * 发送消息
 */
function send() {
	var sender = dwr.util.getValue('username'); // 获得发送者名字
	var receiver = dwr.util.getValue('receiver'); // 获得接受者id
	var msg = dwr.util.getValue('message'); // 获得消息内容
	ChatManager.send(sender, receiver, msg); // 发送消息
}

window.onload = init;//页面加载完毕后执行初始化方法init


配置文件 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>dwr-invoker</servlet-name>
		<servlet-class>
			org.directwebremoting.servlet.DwrServlet
		</servlet-class>
		<init-param>
			<description>调试DWR,发布系统时应将其设为false</description>
			<param-name>debug</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<description>使用服务器推技术(反转AJAX)</description>
			<param-name>activeReverseAjaxEnabled</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>
				initApplicationScopeCreatorsAtStartup
			</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>maxWaitAfterWrite</param-name>
			<param-value>100</param-value>
		</init-param>
		<load-on-startup>4</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dwr-invoker</servlet-name>
		<url-pattern>/dwr/*</url-pattern>
	</servlet-mapping>
</web-app>

DWR配置文件 dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
	<allow>
		<convert converter="bean" match="com.lhq.User"/>
		<create creator="new" javascript="ChatManager">
			 <param name="class" value="com.lhq.ChatManager"/>
		</create>
	</allow>
</dwr>



原文地址:http://yourgame.iteye.com/blog/199079

以上例子所需jar包:commons-logging-1.1.1.jar 和 dwr.jar

关于ScriptSession的一些介绍

可以参考文章 地址:
http://1632004.blog.163.com/blog/static/299914972010350858396/

分享到:
评论

相关推荐

    dwr推技术实现服务器推送数据

    总结来说,DWR推技术是实现服务器主动向客户端推送数据的一种高效方式,尤其适用于需要实时数据更新的应用,如股票实时显示。通过反转Ajax,DWR简化了开发流程,提高了用户体验,是现代Web开发中的一个重要工具。

    dwr推技术官方实例

    标题中的“dwr推技术官方实例”是指DWR提供的关于其推技术的实际操作示例,这些示例可能涵盖了DWR 2.0.4及以上版本的最新功能。由于高质量的实例资源在网络上可能不易找到,所以这份实例集合显得尤为宝贵。 描述中...

    DWR推送技术大全 dwr推送聊天实例

    DWR的主要功能之一是推送技术,这使得服务器可以主动向客户端发送数据,而不仅仅是响应客户端的请求。这种能力在创建实时更新的应用程序,如聊天应用,股票报价或者在线游戏时非常有用。 DWR推送技术的核心在于其...

    dwr 实现推技术 实例

    **DWR(Direct Web Remoting)技术详解及推技术实例** DWR,全称为Direct Web Remoting,是一种在Web应用程序中实现JavaScript与Java之间进行安全、高效通信的技术。它允许服务器端的Java代码直接调用客户端的...

    dwr推技术简单案例

    在这个“dwr推技术简单案例”中,我们将深入理解DWR的核心概念,学习如何设置和使用DWR来实现实时数据推送。 首先,我们需要了解DWR的基本工作原理。DWR通过在浏览器和服务器之间建立一个持久连接,使得服务器可以...

    DWR服务器推技术Demo

    DWR是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。

    dwr 推技术 demo

    本"dwrd 推技术 demo"显然是一个用于展示DWR实时推送功能的示例项目。 1. **DWR框架核心概念**: - **Reverse AJAX**:DWR的核心特性之一就是反向AJAX,即服务器可以主动向客户端发送数据,而不仅仅是响应客户端的...

    DWR服务器推送技术(实时)

    DWR的核心特性是它支持AJAX(Asynchronous JavaScript and XML)以及服务器推送技术,极大地提高了Web应用的用户体验。 **服务器推送技术**: 传统的HTTP协议是基于请求-响应模型的,即客户端发起请求,服务器响应...

    dwr推送技术

    在DWR3版本中,其推送技术是其中的一大亮点,它使得服务器能够主动向客户端发送数据,而不仅仅是响应客户端的请求。 推送技术在Web开发中的应用广泛,如实时聊天、股票更新、在线游戏等场景,能够极大地提升用户...

    dwr推技术反转聊天事例

    在“dwr推技术反转聊天事例”中,我们将探讨DWR如何用于构建一个实时的聊天应用程序,并分析其中的关键知识点。 首先,我们需要理解DWR的核心概念。DWR允许JavaScript在浏览器端直接调用服务器端的Java方法,而无需...

    dwr服务器推技术

    在描述中提到的"DWR服务器推技术整合Struts2",意味着我们将DWR与流行的MVC框架Struts2相结合,以创建一个具有聊天功能的Web应用。Struts2提供了一个强大的架构来处理HTTP请求,并结合DWR,可以创建一个动态的、交互...

    DWR的推技术

    ### DWR的推技术详解 #### 一、DWR推技术概述 DWR(Direct Web Remoting)是一种简化Ajax开发的框架,它允许Java对象直接与JavaScript交互,从而实现更流畅的网页应用体验。在DWR 2.x版本中,引入了推技术,即所谓...

    DWR推送技术

    总结来说,DWR是一种有效的Ajax框架,特别适合在Spring环境下实现服务器到客户端的实时数据推送。通过配置和编程,可以轻松地实现在多种浏览器上的推送功能,解决了WebSocket不兼容性的问题。然而,需要注意的是,长...

    DWR推技术-用于做及时通讯更新的

    然而,DWR通过建立一个持久的连接,使得服务器可以主动地向客户端推送数据,从而提高了用户体验。 DWR的核心功能包括: 1. **远程方法调用(Remote Method Invocation, RMI)**:DWR允许JavaScript直接调用服务器...

    dwr推模式

    标题 "dwr推模式" 涉及到的是Direct Web Remoting (DWR) 技术的一种工作模式,主要用于Web应用程序中的实时数据交互。DWR允许JavaScript与服务器端的Java代码进行交互,提供了异步更新页面的能力,极大地提高了用户...

    dwr推送及js访问java代码

    **DWR(Direct Web Remoting)**是一种Java技术,它允许JavaScript在客户端直接调用服务器端的Java方法,实现浏览器与服务器之间的实时交互。DWR的出现极大地简化了Web应用中的AJAX(Asynchronous JavaScript and ...

    java聊天室 dwr推技术

    在这个聊天室项目中,DWR推技术扮演了关键角色。"推技术"通常指的是服务器向客户端主动推送信息,而不是等待客户端发起请求。在聊天室这种实时性要求较高的场景下,服务器端需要及时将新消息推送到所有在线用户,而...

    使用dwr推技术实现站内聊天室,可对所有人和指定人发送消息

    在本示例中,我们将深入探讨如何利用DWR推技术来构建一个站内聊天室,允许用户向所有人或特定个体发送消息。 1. **DWR推技术**: DWR推技术(Push technology)是DWR的一个重要特性,它允许服务器主动向客户端推送...

    使用dwr+spring实现消息推送

    在IT行业中,消息推送是一项重要的技术,它使得服务器能够实时地向客户端发送数据,而无需客户端不断地轮询请求。在本教程中,我们将探讨如何利用Direct Web Remoting (DWR) 和Spring框架来实现这样的功能。 DWR是...

Global site tag (gtag.js) - Google Analytics