这几天做项目,需要一个消息提醒功能,决定用
dwr实现,在
dwr凯发k8网页登录官网和网上找了很多资料,也没实现精准推送,大多数的例子具体步骤写的不清楚,不怎么了解
dwr的人看了也未必能看懂,反正我是没看懂,那时就决定,若自己实现了,一定将具体步骤写下来,希望能给那些和我一样的人一些帮助,若有不明白的,可以给小弟留言。我只写步骤,不写原理,下面开始。
第一、在项目中引入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文件,内容如下
"-//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);
}
onload中的三个函数都是必须的,其中dwr.engine.setactivereverseajax(true);dwr.engine.setnotifyserveronpageunload(true);是dwr中的函数。
messagepush类中实现的方法如下:
public void onpageload(string userid) {
scriptsession scriptsession = webcontextfactory.get().getscriptsession();
scriptsession.setattribute(userid, userid);
dwrscriptsessionmanagerutil dwrscriptsessionmanagerutil = new dwrscriptsessionmanagerutil();
try {
dwrscriptsessionmanagerutil.init();
} catch (servletexception e) {
e.printstacktrace();
}
}
大家注意到,onpageload方法中还有一个名为dwrscriptsessionmanagerutil的类,该类如下实现:
public class dwrscriptsessionmanagerutil extends dwrservlet{
private static final long serialversionuid = -7504612622407420071l;
public void init()
throws servletexception {
container container = servercontextfactory.get().getcontainer();
scriptsessionmanager manager = container
.getbean(scriptsessionmanager.class);
scriptsessionlistener listener = new scriptsessionlistener() {
public void sessioncreated(scriptsessionevent ev) {
httpsession session = webcontextfactory.get().getsession();
string userid =((user) session.getattribute("userinfo")).gethumanid() "";
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消息精准推送的步骤就写完了,其实很多东西都不难,只是我们不知道该怎么用而已。