| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4606 人关注过本帖
标题:反向Ajax扫盲贴(3)PiggyBack
只看楼主 加入收藏
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
OK这是配置文件就算搞定了 下面我说一下DWR调用原理 借用网上现成的 我觉得他这个说的相当全面
1 编写业务代码,该代码是和dwr无关的。(这个咱们做了TestDwr类和方法 )
2.确认业务代码中哪些类、哪些方法是要由javascript直接访问的。(这个也做了 TestDwr中的getMyName方法要被访问)
3.编写dwr组件,对步骤2的方法进行封装。 (配置文件已经设置了)
4.配置dwr组件到dwr.xml文件中,如果有必要,配置convert,进行java和javascript类型互转。
这步还没开始 如何进行转换呢 也很简单 看下边
首先,引入javascript脚本
5.通过反射机制,dwr将步骤4的类转换成javascript代码,提供给前台页面调用。
6.编写网页,调用步骤5的javascript中的相关方法(间接调用服务器端的相关类的方法),执行业务逻辑,将执行结果利用回调函数返回。
  <script src='dwr/interface/ CASCO.js'></script>
 
  <script src='dwr/engine.js'></script>
 
  <script src='dwr/util.js'></script>
 
  其中TestClass.js是dwr根据配置文件自动生成的,engine.js和util.js是dwr自带的脚本文件。
 
  其次,编写调用java方法的javascript函数
 
  Function callTestMethod2(){
 
  CASCO.getMyName(callBackFortestMethod2);
 
  }
 
  Function callBackFortestMethod2(data){
 
  //其中data接收方法的返回值
 
  //可以在这里对返回值进行处理和显示等等
 
  alert("the return value is " + data);
 
  }


出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-06-02 08:49
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
DWR的配置和原理算是给大家说完了 下边我说一下推送 毕竟这是大家最关心的话题

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-06-02 08:49
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
DWR推送是相当NB的 是可以在配置文件进行设置的
下边我给大家截取一段
<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>logLevel</param-name>
   <param-value>ERROR</param-value>
  </init-param>
  <init-param>
   <param-name>crossDomainSessionSecurity</param-name>
   <param-value>false</param-value>
  </init-param>
  <init-param>
   <param-name>allowScriptTagRemoting</param-name>
   <param-value>true</param-value>
  </init-param>
  <!--
   <init-param> <param-name>crossDomainSessionSecurity</param-name>
   <param-value>false</param-value> </init-param> <init-param>
   <param-name>allowScriptTagRemoting</param-name>
   <param-value>true</param-value> </init-param>
  -->
  <init-param>
   <param-name>classes</param-name>
   <param-value>java.lang.Object</param-value>
  </init-param>
  <!-- 开启反转Ajax 即所谓推技术 -->
  <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>1000</param-value>
  </init-param>
  <!-- 对dwr scriptSession 自定义管理 -->
  <init-param>
   <param-name>org.directwebremoting.extend.ScriptSessionManager</param-name>
   <param-value>com.xx.xx.util.DwrScriptSessionManagerUtil</param-value>
  </init-param>
 </servlet>
 <servlet-mapping>
  <servlet-name>dwr-invoker</servlet-name>
  <url-pattern>/dwr/*</url-pattern>
 </servlet-mapping>

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-06-02 08:52
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
程序代码:
 <!-- 开启反转Ajax 即所谓推技术 -->
  <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>1000</param-value>
  </init-param>
  <!-- 对dwr scriptSession 自定义管理 -->
  <init-param>
   <param-name>org.directwebremoting.extend.ScriptSessionManager</param-name>
   <param-value>com.xx.xx.util.DwrScriptSessionManagerUtil</param-value>
  </init-param>
这段就是重要的代码 只要配置就可以了

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-06-02 08:53
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
另外推送当中的 涉及到 scriptsession优化问题 不再本帖讨论范围内 有兴趣的可以自己百度

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-06-02 08:54
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
js中开启dwr推功能
 
在window.onload中使用dwr.engine.setActiveReverseAjax(true);

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-06-02 08:54
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
DWR很少是做全推送的 基本都是有针对性的半推 所以需要自己写一个过滤器
一个过滤器来过滤要推送的scriptsession
给大家一个代码片段
程序代码:
Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
   
    public boolean match(ScriptSession session) {
     Long loginUserId = (Long) session.getAttribute(Constant.LG_USER_ID);
     if(loginUserId!=null && targetIdList.contains(loginUserId))
     {
      targetIdList.remove(loginUserId);//如果找到了,说明将被推送,所以不用再处理,剩下的都是要被处理的
      return true;
     }
     return false;
    }
    }, new Runnable() {
   
     private ScriptBuffer script = new ScriptBuffer();
     public void run()
     {
      script.appendCall("这里写你页面的js函数", 这个参数是传给js函数的);
      Collection<ScriptSession> sessions = Browser.getTargetSessions();
               for (ScriptSession scriptSession : sessions)
               {
                   scriptSession.addScript(script);
               }
     //ScriptSessions.addFunctionCall("ExtTalk.updateMegGroup", data);//之所以不用这个方法,是因为这个

//方法有bug的存在,会对所有不论过不过滤的scriptsession进行推送,相当于全推送,没有起到过滤的作用
    }
   });

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-06-02 08:56
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
这个有一点点麻烦 我自己都没法跟大家详细的说明白 另外DWR还可以和SSH框架结合使用 希望本帖能给大家一点起始 完

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-06-02 08:56
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
差点忘记了重要的
肯定会问 什么是Piggyback Piggyback到底是什么

简单明了的解释让你明白
 Piggyback 就是如果后台有什么内容需要推送到前台(即调用页面的js方法)
是要等到那个页面进行下一次ajax请求的时候
将需要推送的内容附加在该次请求之后,传回到页面 可以完美的替代我以前用的Jquery等的ajax方式

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-06-02 10:47
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
刚接触SSH的时候就听说过DWR这个框架了,做WEB项目的时候,经常想在前端动态获取服务器数据,但是觉得ajax有点麻烦,知道DWR可以简化但当时并没有深入了解

思考赐予新生,时间在于定义
2015-06-10 11:23
快速回复:反向Ajax扫盲贴(3)PiggyBack
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016133 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved