为什么DWR是异步的?我能做什么?

时间:2011-05-31 05:20:25

标签: java ajax dwr

在打开2个网页时(http://localhost/chat/test.jsp),我正在通过第一页发送消息,但第二页无法立即收到。

只有当我通过第二个消息发送消息时,我才会收到第一页发送的消息。我该怎么办?

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/interface/Chat.js'></script>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/engine.js'></script>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/util.js'></script>
<script type='text/javascript' src='js/chat.js'></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>chat</title>
</head>
<body onload="init()">
    <textarea readonly="readonly" rows="20" cols="30"  id="content">
    </textarea>
    <input type="text" id="input"  />
    <button onclick="send()">send</button>
</body>
</html>

chat.js

dwr.engine.setAsync=false;
init=function(){
    dwr.engine.setActiveReverseAjax =true;
};
isEmpty=function(string){
    return string==""||string.match(/[^\s]/)==null;
};
send=function(){
    var input=dwr.util.getValue("input");
    if(!isEmpty(input)){
        Chat.send(input);
    }
};
update=function(messageInformation){
    var last=dwr.util.getValue("content");
    if(!isEmpty(last)){
        last+="\n";
    }
    var totalMessage=messageInformation.ip+":"+messageInformation.message+"\n"+"  "+messageInformation.date;
    dwr.util.setValue("content",last+totalMessage);
};

Chat.java

package mychat;

import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;

import org.directwebremoting.*;
import org.directwebremoting.annotations.RemoteMethod;
import org.directwebremoting.annotations.RemoteProxy;
import org.directwebremoting.annotations.ScriptScope;

@RemoteProxy(scope=ScriptScope.APPLICATION)
public class Chat  {

    public Chat() {
        super();
        // TODO Auto-generated constructor stub
//      Util.execute(this);
    }

    @RemoteMethod
//  public  void send(final String sendMessage) {   //i have tried 2 methods,but failed.
//      String ip=WebContextFactory.get().getHttpServletRequest().getLocalAddr();
//      final MessageInformation mi=new MessageInformation(ip,sendMessage,new SimpleDateFormat("h:mm a").format(new Date()).toString());
//      Browser.withCurrentPage((new Runnable() {
//          public void run() {
//              System.out.println(mi);
//              ScriptSessions.addFunctionCall("update", mi);
//          }
//      }));
//  }
    public  void send(final String sendMessage) {
        String ip=WebContextFactory.get().getHttpServletRequest().getLocalAddr();
        final MessageInformation mi=new MessageInformation(ip,sendMessage,new SimpleDateFormat("h:mm a").format(new Date()).toString());
            Browser.withCurrentPage(new Runnable() {
            public void run() {
            ScriptBuffer script = createMyScriptBuffer(mi);
            Collection<ScriptSession> sessions = Browser.getTargetSessions();
            for (ScriptSession scriptSession : sessions) {
                System.out.println(script);
                scriptSession.addScript(script);
            }
            }
        });
    }
    private ScriptBuffer createMyScriptBuffer(MessageInformation messageInformation) {
        // TODO Auto-generated method stub

    String str="var last=dwr.util.getValue(\"content\");"+
    "if(!isEmpty(last)){"+
    "   last+=\"\n\";"+
    "}"+
    "var totalMessage="+messageInformation.ip+":"+messageInformation.message+"\n"+"  "+messageInformation.date+";"+
    "dwr.util.setValue(\"content\",last+totalMessage);";
    return new ScriptBuffer().appendCall("update", messageInformation);

    }
}

1 个答案:

答案 0 :(得分:0)

让服务器在发生事件时通知页面的好方法是使用轮询。请参阅reverse ajax了解如何执行此操作以及其他可能的解决方案,例如打开http连接。