我的方法很简单从js 里面取sessionid 传到server里,
发送消息的时候做了一个选择排序 根据session建立时间重新排序了一下,
将最新的scriptsession 返回,
虽然现在可以解决scriptsession 问题,但是估计还是会存在问题,而且感觉方法很笨..
请问谁有更好的办法可以很好的解决这个问题? 谢谢大家了!
ChatManager.java
package test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
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;
/**
* DWR ChatTest
*
* @author 李斌
*
*/
public class ChatManager {
public ScriptSession session;
public static List<User> users = new ArrayList<User>();
public void getTest(){
System.out.println("##test");
}
public String addUser(String username ,HttpServletRequest request){
User u = new User(request.getSession().getId(), username);
users.add(u);
this.setScriptSessionFlag(u.getUserid());
System.out.println("加入用户"+username);
System.out.println("Session Id"+u.getUserid());
return u.getUserid();
}
public String updateUserList(HttpServletRequest request){
//获得DWR上下文
ServletContext sc = request.getSession().getServletContext();
ServerContext sctx = ServerContextFactory.get(sc);
//获得当前浏览 index.jsp 页面的所有脚本session
Collection sessions = sctx.getScriptSessionsByPage("/testchat/index.jsp");
Util util = new Util(sessions);
//处理这些页面中的一些元素
util.removeAllOptions("receiver");
util.addOptions("receiver", users,"userid","username");
return null;
}
public void setScriptSessionFlag(String userid) {
WebContextFactory.get().getScriptSession().setAttribute("userid", userid);
}
ScriptSession s = null;
public void getPageScriptSession(String sessionid){
WebContextFactory.get().getScriptSession().setAttribute("userid", sessionid);
s =(ScriptSession) WebContextFactory.get().getScriptSession();
}
public void sendMsg(String sender,String receiverid,String msg,HttpServletRequest request){
session = this.getScriptSession(receiverid, request);
Util util = new Util(session);
util.setValue("sender", sender);
util.setValue("msg", msg);
}
public ScriptSession getScriptSession(String userid, HttpServletRequest request) {
ScriptSession scriptSessions = null;
//Collection<ScriptSession> sessions = new LinkedHashSet<ScriptSession>();
Collection<ScriptSession> sessions = new HashSet<ScriptSession>();
sessions.addAll(ServerContextFactory.get(request.getSession().getServletContext())
.getScriptSessionsByPage("/testchat/index.jsp"));
List<ScriptSession> result = new ArrayList<ScriptSession>();
for (ScriptSession session : sessions) {
String xuserid = (String) session.getAttribute("userid");
if (xuserid != null && xuserid.equals(userid)) {
result.add(session);
}
}
ComparatorList comparator=new ComparatorList();
java.util.Collections.sort(result,comparator);
/*for(int i = 0 ; i<result.size();i++){
for(int j = i+1;j<result.size();j++){
if(result.get(i).getCreationTime()<result.get(j).getCreationTime()){
java.util.Collections.swap(result, i, j);
ScriptSession tem = result.get(i);
result.set(i, result.get(j));
result.set(j, tem);
}
}
}*/
return result.iterator().next();
}
}
class ComparatorList implements Comparator{
public int compare(Object arg0, Object arg1) {
ScriptSession ss0=(ScriptSession)arg0;
ScriptSession ss1=(ScriptSession)arg1;
if(ss0.getCreationTime()>ss1.getCreationTime()){
return -1;
}
else {
return 1;
}
}
}
test.js
var Chat ={version:"1.0"}
/**
* ChatTest Js
*
* @author 李斌
*
*/
Chat.getUserList = function(){ ChatManager.getTest()}
Chat.getInit = function(){
var userid = document.getElementById('userid').value;
dwr.engine.setActiveReverseAjax(true); // 激活反转 重要
ChatManager.updateUserList();
ChatManager.getPageScriptSession(document.getElementById('userid').value);
}
Chat.addUser = function(){
var username = document.getElementById('username').value;
ChatManager.addUser(username,addUsercallback);
}
Chat.sendMsg = function(){
var message = document.getElementById('message').value;
var receiver = document.getElementById('receiver');
var selectedid = receiver.options[receiver.selectedIndex].value;
selectedname = receiver.options[receiver.selectedIndex].text;
ChatManager.sendMsg(document.getElementById('username').value,selectedid,message);
}
function addUsercallback(data){
ChatManager.updateUserList();
document.getElementById('userid').value = data
}
Chat.getScriptSession = function(){
ChatManager.getPageScriptSession(document.getElementById('userid').value);
}
function getSession(data){
alert(data)
}
window.onload = Chat.getInit();
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<input type="hidden" id="userid" name="userid" value="<%=session.getId()%>">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<script type='text/javascript' src='dwr/interface/ChatManager.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<script type="text/javascript" src="test.js"></script>
</head>
<body>
session id : <%=session.getId()%><br>
<input type="text" id="username"><input onclick="Chat.addUser()" type="button" value="加入聊天">
<br>
<select name="receiver" id="receiver"></select>
<input type="text" id="message"><input onclick="Chat.sendMsg()" type="button" value="发送">
<br><input type="text" id="sender">
<input type="text" id="msg">
<br>
<!-- input type="button" onclick="Chat.getScriptSession()" value="重新连接" -->
</body>
</html>
分享到:
相关推荐
**DWR 2.0 中文手册** ...通过深入学习DWR 2.0,开发者可以构建出交互性强、响应速度快的Web应用,同时降低前后端的通信复杂度,提高开发效率。结合提供的实战指南,你可以更好地理解和运用DWR在实际项目中的各种场景。
《DWR2.0与Spring2.0整合详解》 Direct Web Remoting (DWR) 是一个开源的Java库,它允许在...对于希望创建具有动态交互效果和强大功能的Web应用程序的开发者来说,DWR2.0与Spring2.0的整合是一个值得考虑的选择。
DWR(Direct Web Remoting)是一个开源的Java库,它为Web应用程序提供了强大的Ajax功能。通过DWR,前端JavaScript可以直接调用后端Java方法,从而实现动态、实时的Web交互,提升用户体验。这个主题主要围绕DWR的两个...
**DWR2.0中文文档**是一本由方佳玮编著的专业技术书籍,主要涵盖了Direct Web Remoting(DWR)2.0版本的相关知识。DWR是一个Java库,允许Web应用程序在浏览器和服务器之间进行实时通信,无需使用XMLHttpRequest或...
DWR 2.0 是DWR的一个版本,提供了许多增强的功能和改进,以适应不断发展的Web开发需求。 DTD(Document Type Definition)是XML文档类型定义,它定义了XML文档的结构和语法规则。对于DWR,DTD文件是用于验证DWR配置...
这个压缩包包含了DWR的三个关键组件:DWR3.0.jar,DWR的实例war文件,以及DWR2.0的中文说明文档。以下是关于这些组件的详细知识: 1. **DWR3.0.jar**: DWR3.0.jar是DWR框架的核心库,包含所有必需的类和接口,...
在“dwr2.0最简单例子实用亲测试”中,我们可以预期这是一个关于如何使用DWR 2.0版本的入门教程,包含了实际可运行的示例代码。下面将详细介绍DWR的基本概念和在这个实例中可能涉及的关键知识点: 1. **DWR的核心...
DWR(Direct Web Remoting)是一种用于简化 AJAX 应用程序开发的技术。它允许客户端 JavaScript 直接调用服务器端 Java 方法,从而降低了 AJAX 编程的复杂度。DWR 的最新版本为 3.0,而其前身版本为 2.0。本文将详细...
DWR2.jar提供了核心功能,DWR.xml定制了DWR的行为,DWR2.0.dtd保证了配置文件的正确性,而Web.xml确保了DWRServlet的正确部署和配置。通过熟练掌握这些知识点,开发者可以有效地利用DWR构建动态、交互性强的Web应用...
- 在DWR 2.0中,我们需要在Web应用的`WEB-INF/dwr.xml`配置文件中定义允许访问的Java类和方法。 - 这些配置告诉DWR哪些服务器端对象和方法可以暴露给JavaScript。 - 我们还可以配置安全性设置,如IP过滤,以防止...
这个"**dwr2.0学习例子**"提供了实践DWR 2.0特性的实例,帮助开发者快速理解和应用DWR。 **DWR框架的核心功能:** 1. **动态代理**:DWR允许服务器端的Java对象被自动暴露到客户端的JavaScript中,使得开发者无需...
DWR 2.0M3 是该库的一个版本,其中的"M3"代表了第三个里程碑版本,通常意味着它已经相对成熟,但可能还有一些未解决的问题或待完善的特性。 在DWR 2.0M3的学习笔记中,我们可以深入探讨以下几个关键知识点: 1. **...
一旦发现有新消息,DWR会利用HTTP长时间连接或者Comet技术将数据推送到浏览器。这样,用户无需频繁刷新页面就能实时看到新消息。 具体到这个例子,我们可以假设有两个主要的文件:一个是服务器端的Java类,可能包含...
【标题】"简单购物车(dwr2.0)"是一个基于Web的购物车应用程序,它利用了Direct Web Remoting (DWR) 2.0框架。DWR是一种JavaScript库,允许在浏览器和服务器之间进行实时、异步的通信,使得前端与后端的数据交换变得...
在"**dwrTest.rar_dwr 3.jar_dwr.jar_dwr2.0.jar**"这个压缩包中,包含了DWR框架不同版本的jar文件,以及一个可能的示例项目,便于用户学习和测试DWR的功能。 **DWR 2.0 和 3.0 的主要区别:** 1. **性能提升**:...