2010.04.09(4)———dwr 点对点
这个还是有点问题的 ,就是聊天记录的问题 聊天的内容被覆盖了
web.xml
User类
Chat.java
dwr.xml
jsp
这个还是有点问题的 ,就是聊天记录的问题 聊天的内容被覆盖了
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>