While opening 2 web pages (http://localhost/chat/test.jsp), I'm sending a message through the first page, but the second cannot receive it immediately.
Only when I send a message through the second one I can receive the message the first page has sended. What can I do about this?
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+totalM开发者_StackOverflow社区essage);
};
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);
}
}
A good way to have the server notify a page when something happens is to use polling. See reverse ajax on how to do this and other potential solutions like leaving the http connection open.
精彩评论