当前位置:编程学习 > JAVA >>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

我现在在做一个网站的站内信功能,通过网上各种资料用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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,