<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
我现在在做一个网站的站内信功能,通过网上各种资料用dwr的推送可以做到及时提醒这个功能,所以就自己写了下代码..dwr配置
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>
initApplicationScopeCreatorsAtStartup
</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>100</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<dwr>
<allow>
<create creator="spring" javascript="DWRHelper">
<param name="beanName" value="userService"/>
<include method="newMessage"/>
</create>
</allow>
</dwr>
查询数据库是否有未读消息:
/**
* 站内信,新消息
*/
public String newMessage(){
TbUser tbUser = (TbUser) ActionContext.getContext().getSession().get("tbUser");
if(tbUser==null)return "";
// 查询新消息
Integer newsNum =this.getTotalNumByHql(" from TbLetter l where l.toIsDelete=1 and l.letterIsRead=0 and l.tbUserByFkToId.userId="
+ tbUser.getUserId());
//DWRHelper.addMessage(newsNum);
System.out.println("newsNum::::::"+newsNum);
return newsNum+"";
}
jsp:
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type='text/javascript' src='<%=basePath %>dwr/engine.js'> </script>
<script type='text/javascript' src='<%=basePath %>dwr/util.js'> </script>
<script type='text/javascript' src='<%=basePath %>dwr/inte易做图ce/DWRHelper.js'></script>
<script type="text/javascript">
window.onload=function(){
load();
dwr.engine.setActiveReverseAjax(true);
}
function load(){
DWRHelper.newMessage(receiveMessages);
}
function receiveMessages(num){
if(num>0){
alert("你有"+num+"条消息");
}
}
</script>
我测试了,当每次加载这个页面时,是可以将新消息给查出来的,但是如果没有刷新页面,dwr就根本不执行查询操作。
ff下看到的dwr请求路径URL:
http://localhost:8080/text/dwr/call/plainpoll/ReverseAjax.dwr
要等大概1分钟响应了这玩意儿:
//#DWR-START#
dwr.engine._remoteHandleCallback('4','0',0);
//#DWR-END#
如果配置有问题,那么每次刷新应该查询不出结果?或者是别的什么原因...
小弟愚钝忘易做图指点一二 --------------------编程问答-------------------- DWRHelper.newMessage(receiveMessages);
receiveMessages这个是不是回调函数?
if(num>0){
alert("你有"+num+"条消息");
}
num为整形,你 public String newMessage() 返回的是字符串。
不知道是不是这个原因?。。dwr我也才刚开始学,个人看法。 --------------------编程问答-------------------- 你页面不刷新靠什么来访问后台啊,dwr我不清楚。。
不过可以自己用纯代码来实现 --------------------编程问答-------------------- 页面不刷新,可以这样调用吧setInterval("load()",5000); --------------------编程问答-------------------- 没有看到推送到页面的代码哦 --------------------编程问答-------------------- 我也遇到这个问题,/dwr/call/plainpoll/ReverseAjax.dwr很卡。不知道你最后咋解决的? --------------------编程问答-------------------- 楼主啊。。。何为推技术啊?
你这个程序在设计上就有着很大的问题。。。
你好好看看自己的代码,首先触发后台查询的方法,不应该由页面的onload来发起,其次,你查询过一次之后呢?就再也没有触发过了吧?再者,你在后台的java类里面有推的动作吗?
我建议这样写:
onload方法触发java类的一个方法,该方法中启动一条线程,定时查询数据库。在查询数据库之后,如果有更新的结果,再将结果推送到页面上。
当然,这只是一对一的关系,用户多了,就不行。
最好是服务启动的时候,就启动一条线程来定时查询数据库,如有更新的话,将结果推送到所有打开了当前页面的浏览器上。那么,这个时候,你就需要记录都有谁打开了该页面,而且某个浏览器离开了该页面,就需要立即注销。
补充:Java , Java EE