`

2010.04.09(4)———dwr 点对点

阅读更多
2010.04.09(4)———dwr 点对点

这个还是有点问题的 ,就是聊天记录的问题 聊天的内容被覆盖了


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 以设置下格式固定,可复制使用 -->  
    <display-name>ajaxDWR</display-name>  
    <servlet>  
        <servlet-name>dwr-invoker</servlet-name> 
        <servlet-class>  
            org.directwebremoting.servlet.DwrServlet   
        </servlet-class>  
        <init-param>  
            <description>实现调试,在debug请设置为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>






User类

package dddd;

public class User {
	private String name;
	private String id;
	
	
	public User(String name, String id) {
		super();
		this.name = name;
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	
}


Chat.java





package dddd;

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

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;

public class Chat {
	/** 
	 * 保存当前在线用户列表 
	 */
	private static List<User> users = new ArrayList<User>();
	
	/**
	 * 更新在线用户列表
	 * @param username 待添加到列表的用户名
	 * @param flag 是添加用户到列表,还是只获得当前列表
	 * @param request
	 * @return 用户id
	 */
	public String updateUserList(String name,boolean flag,HttpServletRequest request){
		User user = null;
		if(flag){
			// 这里取会话(HttpSession)的id为用户id
			user = new User(name,request.getSession().getId());
			//保存用户到列表
			users.add(user);
			//将用户id和页面脚本session绑定
			this.setScriptSessionAndUserId(user.getId());
		}
		//获得DWR上下文
		ServletContext sc = request.getSession().getServletContext();
		ServerContext DWRsc = ServerContextFactory.get(sc);
		//获得当前浏览 index.jsp 页面的所有脚本session
		Collection sessions = DWRsc.getScriptSessionsByPage("/chat2/index.jsp");
		Util util = new Util(sessions);
		util.removeAllOptions("userList");
		//值和显示的内容都是object的name属性
		util.addOptions("userList", users,"name");
		
		util.removeAllOptions("selects");
		//"selects"中的每一个选项select对应users的每一个对象 object,object的id属性时select的值,object的name属性时select显示的内容
		util.addOptions("selects", users, "id", "name");
		if(!flag){
			return null;
		}
		return user.getId();
	}
	
	/**
	 * 将用户id和页面脚本session绑定
	 * @param id
	 */
	private void setScriptSessionAndUserId(String id){
		WebContextFactory.get().getScriptSession().setAttribute("userId", id);
	}
	
	/**
	 * 根据用户id获得指定用户的页面脚本session
	 * @param userid
	 * @param request
	 * @return
	 */
	private Collection<ScriptSession> getScriptSession(String userId,String myId,HttpServletRequest request){
		Collection<ScriptSession> list = new HashSet<ScriptSession>();
		Collection<ScriptSession> scriptSessions = new HashSet<ScriptSession>();
		scriptSessions.addAll(ServerContextFactory.get(request.getSession().getServletContext())
				.getScriptSessionsByPage("/chat2/index.jsp"));
		for(ScriptSession o : scriptSessions){
			String id = (String)o.getAttribute("userId");
			if(id!=null&&id.equals(userId)||id!=null&&id.equals(myId)){
				list.add(o);
			}
		}
		return list;
	}
	
	/**
	 * 发送消息
	 * @param sender 发送者
	 * @param receiverid 接收者id
	 * @param message 消息内容
	 * @param request
	 */
	public void send(String sender,String myId,String receiverId,String message,String oldMessage,HttpServletRequest request){
		Collection<ScriptSession> sessions = this.getScriptSession(receiverId, myId,request);
		Util util = new Util(sessions);
		
		//util.setStyle("showMessage", "display", "mm");
//		ScriptBuffer script = new ScriptBuffer();
//		script.appendScript("dwr.util.byId('showMessage').style.display=''");
//		session.addScript(script);
		if(oldMessage!=null||oldMessage.equals("")){
			util.setValue("msg", oldMessage+"\n"+sender+"说:\n"+"  "+message);
		}else{
			util.setValue("msg", sender+"说:/n"+"  "+message);
		}
		util.setValue("message","");
	}
}



dwr.xml




<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">  
<dwr>  
    <!-- 对后台类的配置格式确定 -->  
    <allow> 
    	<!-- Chat类要用到User这个类 就可以这样写-->
    	<convert converter="bean" match="dddd.User"/>         
        <create creator="new" javascript="Chat">  
            <param name="class" value="dddd.Chat" />  
        </create>  
    </allow>  
</dwr>  



jsp




<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>  
	<title>点对点</title>  
  
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="this is my page">  
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">  
    <script type='text/javascript' src='dwr/util.js'></script>  
    <script type='text/javascript' src='dwr/engine.js'></script>  
    <script type='text/javascript' src='dwr/interface/Chat.js'></script>
    <script type="text/javascript">
    /**
     * 注册帐号
     */
    function register(button) {
    	if ($('username').value == "" || $('username').value.length <= 0) {
    		alert("请输入昵称");
    		return;
    	}

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

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

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

    /**
     * 发送消息
     */
    function send() {
    	var sender = dwr.util.getValue('username'); // 获得发送者名字
    	var receiver = dwr.util.getValue('selects'); // 获得接受者id
    	var msg = dwr.util.getValue('message'); // 获得消息内容
    	var oldMsg = dwr.util.getValue("msg");
    	//$("showMessage").style.display="";
    	var myId = dwr.util.getValue("userid");
    	Chat.send(sender, myId,receiver, msg,oldMsg); // 发送消息
    }

    window.onload = init;//页面加载完毕后执行初始化方法init
    </script>  
  		
</head>
  
  <body>
		<input type="hidden" name="userid" id="userid" />
		<br>
		昵称:
		<input type="text" name="username" id="username"/>
		<input type="button" value="注册" id="button" onclick="register(this);" />
		<br />
		<br />
		我要对
		<select name="selects" id="selects" disabled="true" >
		</select>
		说:
		<input type="text" name="message" id="message" disabled="true" />
		<input type="button" value="发送" id="send" name="send" disabled="true"
			onclick="send();" />
		<br />
		<br />
		在线用户列表:
		<ul id="userList">
		</ul>

		<textarea rows="20" cols="60" readonly="readonly" id="msg" name="msg"></textarea>
	</body>
</html>











分享到:
评论

相关推荐

    dwr包.rar dwr.jar engine.js util.js dwr-noncla.jar readme.txt

    dwr包.rar dwr.jar engine.js util.js dwr-noncla.jar readme.txt JAR File: dwr.jar (1.08Mb) To DWR enable your web-app WAR File: dwr.war (4.62Mb) Demos/Examples of what DWR can do Sources: dwr-...

    DWR3.0.jar、DWR.war和DWR2.0中文说明文档

    通过分析这个war文件,开发者可以学习如何配置DWR的XML配置文件(dwr.xml),以及如何创建可从JavaScript调用的Java方法。 3. **DWR2.0中文说明文档**: 这份文档对于理解DWR的工作原理和使用方法至关重要,特别是...

    dwrDemo.war.zip_dwr_dwr.w

    "dwrDemo.war.zip" 是一个包含DWR2.0测试应用的WAR(Web应用程序归档)文件,"dwr_dwr.w"可能是DWR配置或服务相关的文件。 首先,我们来了解一下DWR的核心概念: 1. **DWR引擎(DWR Engine)**:这是DWR的核心组件...

    DWR2.jar + DWR.xml + DWR2.0.dtd + Web.xml

    **DWR.xml** 是DWR的配置文件,用于定制DWR的行为和设置。在这个文件中,你可以定义哪些Java类和方法可以被浏览器访问,设置安全性限制,以及配置转换器和过滤器等。例如,通过`&lt;allow&gt;`标签,你可以指定允许...

    Ajax学习——DWR的参考书和实用案例学习总结

    - **dwr.war**:这是一个DWR的部署文件,通常用于在Web服务器上快速部署DWR服务。开发者可以通过解压war文件查看源码,学习DWR的内部实现。 ### 实用案例 学习DWR时,实践是最好的老师。通过实际案例,可以理解DWR...

    JavaScript调用java方法——dwr步骤.docx

    &lt;servlet-class&gt;uk.ltd.getahead.dwr.DWRServlet &lt;param-name&gt;debug &lt;param-value&gt;true &lt;servlet-name&gt;dwr-invoker &lt;url-pattern&gt;/dwr/* ``` - 这段配置指定了DWR servlet的名称、类以及调试模式,...

    JavaEE源代码 dwr.jar 2.0

    JavaEE源代码 dwr.jar 2.0JavaEE源代码 dwr.jar 2.0JavaEE源代码 dwr.jar 2.0JavaEE源代码 dwr.jar 2.0JavaEE源代码 dwr.jar 2.0JavaEE源代码 dwr.jar 2.0JavaEE源代码 dwr.jar 2.0JavaEE源代码 dwr.jar 2.0JavaEE源...

    dwr-3.0.jar

    最新dwr3.0的包,有需要的朋友就下载吧

    dwr源码包,dwr.jar包下载

    1、 导入dwr.jar包 2、 在web.xml中配置dwr,如下: &lt;!-- 配置DWR --&gt; &lt;servlet-name&gt;dwr-invoker org.directwebremoting.servlet.DwrServlet &lt;init-param&gt; &lt;param-name&gt;debug&lt;/param-name&gt; ...

    dwr2.0.5.jar&dwr2.0.6.jar&dwr3.rc1.jar

    部署DWR JAR文件通常涉及到将它们添加到Web应用的类路径中,配置DWR的`dwr.xml`配置文件,以及在客户端HTML页面中引入相应的JavaScript库。对于Spring框架的集成,还需要配置Spring的bean定义。 总的来说,DWR的...

    dwr20.dtd约束文件

    dwr20.dtd约束文件。 &lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd" &gt;

    dwr-1.13.jar及dwr.xml

    dwr-1.1.3.jar及dwr.xml. dwr-1.1.3与dwr-2.0的dwr.xml略有区别: dwr-1.1.3 &lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" ...

    J2EE——Ajax——dwr——配置文件

    首先,DWR的核心是`dwr.xml`配置文件,它定义了哪些Java对象和方法可以被JavaScript调用。这个文件通常位于`WEB-INF`目录下,其中包含了对远程服务的定义,包括允许的类、方法和参数类型。例如: ```xml &lt;!-- ...

    dwrTest.rar_dwr 3 jar_dwr jar_dwr2.0 jar

    在"**dwrTest.rar_dwr 3.jar_dwr.jar_dwr2.0.jar**"这个压缩包中,包含了DWR框架不同版本的jar文件,以及一个可能的示例项目,便于用户学习和测试DWR的功能。 **DWR 2.0 和 3.0 的主要区别:** 1. **性能提升**:...

    DWR,web.xml,dwr.xml,converted,created

    取得dwr的dwr.jar包和其他dwr所需的其他jar包 web.xml dwr.xml 任何一个dwr.xml的文件都需要包含DWR DOCTYPE的声明行,。。 有几个术语有必要理解,参数叫做converted,远程Bean叫做created.如果远程Bean A有个方法A....

    dwr.jar engine.js util.js,Dwr相关

    标题中的"dwr.jar"是DWR的主要库文件,包含了所有必要的Java类和接口,用于在服务器端实现DWR的功能。这个JAR文件通常会被部署到应用服务器的类路径中,以便服务端代码可以访问和使用DWR的API。 "engine.js"是DWR的...

    dwr20.dtd

    dwr20.dtd

    dwr.rar_dwr jar_dwr j_dwr jar_dwr.j_dwr.jar2

    这个"**dwr.rar**"压缩包包含了DWR的核心组件,即**dwr.jar**文件,它是DWR运行所必需的。DWR的主要目的是简化AJAX(异步JavaScript和XML)开发,通过提供一种方式,使得前端JavaScript可以直接调用后端Java方法,...

    DWR学习资料

    DWR学习资料 :DWR 3.0 上传文件.txt DWR3.0反向Ajax示例.txt DWR3.0...多人聊天室.doc 反向Ajax技术实例.txt 基于DWR反向AJAX的Web监控系统.doc 深入学习DWR3.0.txt 实战dwr.doc 使用Jetty和DWR创建伸缩性Comet程序.txt

    dwr所需的jar包及配置

    为了使用这些文件,你需要将它们部署到你的Web应用服务器中,通常将jar包放入WEB-INF/lib目录,而web.xml和dwr.xml则放入WEB-INF下。然后,在你的HTML或JavaScript代码中引入engine.js和util.js,通过它们提供的API...

Global site tag (gtag.js) - Google Analytics