原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研究详细记录下来备忘,也希望能帮助到像我一样的人。只写过程,不写原理(不是不写,而是有些地方我也不太懂),下面开始:

第一、在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下:

dwr-invoker
org.directwebremoting.servlet.DwrServlet
crossDomainSessionSecurity
false
allowScriptTagRemoting
true
classes
java.lang.Object
activeReverseAjaxEnabled
true
initApplicationScopeCreatorsAtStartup
true
maxWaitAfterWrite
3000
debug
true
logLevel
WARN
第二:在web.xml的同级目录下新建dwr.xml文件,内容如下
/p>
"-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
"http://getahead.org/dwr/dwr30.dtd">

这个是dwr的基本配置,MessagePush在页面的javascript中使用,com.huatech.messageremind.service.MessagePush实现了想要调用的方法,MessagePush我觉得就相当于java类中的一个映射,在javascript中使用MessagePush.java类中实现的方法,即可在dwr中调用。

第三,要想使用dwr,还要在你想要推送的页面中引入script,

可以看见,也引入了dwr.xml中配置的javascript,engine.js和util.js是必须引入的。

以上三点都是基本配置,没什么好说的,想使用dwr,就得这么做。

第四,实现消息的精准推送

消息推送简单,但是想实现精准推送就需要做一些别的操作了

1 在任何一个用户登录的时候,都需要将其userId或者其他唯一性标识放入session中,我放的是userId,

这里就以userId为唯一性标识。

2 在载入想推送的页面时,需要onload一个我在MessagePush类中实现的方法,当然了,需要使用dwr调用

js的调用方法如下:

function onPageLoad(){
var userId = '${userinfo.humanid}';
MessagePush.onPageLoad(userId);
}
System.out.println("a ScriptSession is created!");
ev.getSession().setAttribute("userId", userId);
}
public void sessionDestroyed(ScriptSessionEvent ev) {
System.out.println("a ScriptSession is distroyed");
}
};
manager.addScriptSessionListener(listener);
}
}

第四步是最最重要的,为了第四步我研究了两天多,下面开始消息推送。

第五、消息推送

在你想要推送消息的时候,调用如下方法:

public void sendMessageAuto(String userid,String message) {
final String userId = userid ;
final String autoMessage = message;
Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
public boolean match(ScriptSession session) {
if (session.getAttribute("userId") == null)
return false;
else
return (session.getAttribute("userId")).equals(userId);
}
}, new Runnable(){
private ScriptBuffer script = new ScriptBuffer();
public void run() {
script.appendCall("showMessage", autoMessage);
Collection sessions = Browser
.getTargetSessions();
for (ScriptSession scriptSession : sessions) {
scriptSession.addScript(script);
}
}
});
}

userid即为你想推给消息的人,message为你想推送的消息,大家注意到这里script.appendCall("showMessage", autoMessage);

其中showMessage为在想推送的页面中的javascript方法,autoMessage是这个方法的参数,这样那个页面就能得到推送的内容了,至于如何展现,就看你的需要了。

至此,一个dwr消息精准推送的步骤就写完了,其实很多东西都不难,只是我们不知道该怎么用而已。