日期:2014-05-17  浏览次数:20743 次

dwr的ScriptSession问题,在线等!
初学dwr ,做了个聊天的例子,用的dwr反转,但是现在出问题了!!
不知问题所在,贴码:
/** 保存当前在线用户列表 */
public static List<UserMessageVo> users = new ArrayList<UserMessageVo>();
public String updateUsersList(String systemid, boolean flag, HttpServletRequest request) {

UserMessageVo user = new UserMessageVo();  
user.setSystemid(systemid);
users.add(user);

//将用户id和页面脚本session绑定
this.setScriptSessionFlag(systemid);
System.out.println("::::::::sriprt:::::"+WebContextFactory.get().getScriptSession().getAttribute("userid"));

//获得DWR上下文
ServletContext sc = request.getSession().getServletContext();
System.out.println(sc);
ServerContext sctx = ServerContextFactory.get(sc);
System.out.println(sctx);
//获得当前浏览页面的所有脚本session
Collection sessions = sctx.getScriptSessionsByPage("/people/message/send.jsp");
System.out.println("页面脚本的session数量"+sessions.size());
//处理这些页面中的一些元素
//Util util = new Util(pages);



return systemid;
}
   


/**
* 将用户id和页面脚本session绑定
* @param userid
*/
public void setScriptSessionFlag(String userid) {

System.out.println("登陆者的id"+userid);

WebContextFactory.get().getScriptSession().setAttribute("userid", userid);

}

/**
* 根据用户id获得指定用户的页面脚本session
* @param userid
* @param request
* ScriptSession不同,第一次访问,会创建一个ScriptSession,但是,如果你刷新,就会创建一个新的ScriptSession
* @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("/people/message/send.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 senderUsername,String receiverId,String messageContent,String sendTime,HttpServletRequest request)
{

System.out.println("::::::::::"+senderUsername);
System.out.println("::::::::::"+receiverId);
System.out.println("::::::::::"+messageContent);
System.out.println("::::::::"+sendTime);
try
{
ScriptSession session = this.getScriptSession(receiverId, request);
Util util = new Util(session);
util.setValue("sender", "kaka");
/*util.setStyle("backMessage", "display", "");
util.setValue("sender", "kaka");
util.setValue("msg", messageContent);*/
}
catch(Exception e)
{
e.printStackTrace();
}



}


我现在测试session 总是空的,在发送页面没有值,是什么原因呢,求高人指点


------解决方案--------------------
不懂,up
------解决方案--------------------
1、一个页面会产生一个新的scriptSession。所以当你刷新当前页面就会产生一个新的scriptSession。而这个scriptSession是唯一通信的通道。
2、如果同一页面有多个scriptsession 那么其session肯定获取不到。
3、放到map中判断,确保一个页面有个session存在。
------解决方案--------------------
楼上的可以参考,但是我感觉楼主因该修改下思路,dwr仅仅用来异步显示和刷新名单信息就可以了,不要在