dwr前臺調後臺,後臺調前臺實例

1.pom.xmljavascript

<dependency>
   <groupId>org.directwebremoting</groupId>
   <artifactId>dwr</artifactId>
   <version>3.0.2-RELEASE</version>
</dependency>

 

2.web.xmlhtml

<servlet>
   <servlet-name>dwr-invoker</servlet-name>
   <servlet-class>
      org.directwebremoting.servlet.DwrServlet
   </servlet-class>
   <init-param>
      <param-name>pollAndCometEnabled</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>debug</param-name>
      <param-value>true</param-value>
   </init-param>
</servlet>
<servlet-mapping>
   <servlet-name>dwr-invoker</servlet-name>
   <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

備註:java

pollAndCometEnabled是指dwr 的reverse ajax是使用polling 和comet的方式,在這個例子中能夠明顯地從頁面上看出來是用的polling+cometweb

附:關於reverse-ajax的實現有3種方式
polling   就是隔一段時間向服務器發送一request來檢查服務端是否有數據更新
comet   就是一個長http請求,在請求期間服務端能夠向客戶端push數據,可是這種作法要求server和brower長期創建一個通訊通道,並且效率很低ajax

piggyback 就是服務端的更新數據都在排隊等待,等到下一次有請求過來,那麼這些等待更新數據就伴隨此次請求一塊兒發送到brower瀏覽器

3.新建dwr.xml服務器

<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
    "http://getahead.org/dwr/dwr30.dtd">
<dwr>
  <allow>
    <!-- 顯示異常 -->
    <convert converter="bean" match="java.lang.StackTraceElement" />
    <convert converter="exception" match="java.lang.Exception" />

    <create creator="new" javascript="ProtocolDwrUtils" scope="application" > // create是隻一個java的js映射,能夠在js使用的方法
      <param name="class" value="com.weichai.modules.task.dwrUtil.ProtocolDwrUtils"/> //須要暴露的類
      <include method="sendProtocolToPage"/>  //類中方法
      <include method="onPageLoad"/>//類中方法
    </create>
  </allow>
</dwr>

 

4.新建類ProtocolDwrUtils.javasession

package com.weichai.modules.task.dwrUtil;
import org.directwebremoting.*;

import java.util.Collection;
/**
 * Created by ltx on 2017/10/17.
 */
public class ProtocolDwrUtils {

    public void sendProtocolToPage(final String params, final String userId)
    {
        Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
            public boolean match(ScriptSession session) {  //過濾器,制定userid推送
                if (session.getAttribute(userId) != null) {
                    session.removeAttribute(userId);
                    return  true;
                } else {
                   return false;
                }
            }
        }, new Runnable() {
            private ScriptBuffer script = new ScriptBuffer();
            public void run() {
                script.appendCall("helloWord", params);  //前臺js方法和參數
                Collection<ScriptSession> sessions = Browser.getTargetSessions();//獲取全部與服務器相連的瀏覽器的session
                for (ScriptSession scriptSession : sessions) {
                     scriptSession.addScript(script); //推送
                }
            }
        });
    }

    //將前臺穿過來的userID存到session中去,後邊用做精確推送使用
    public void onPageLoad(final String userId){
        //獲取當前的ScriptSession
        ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
        scriptSession.setAttribute( userId, "1");
        System.out.println("onPageLoad----"+userId);
    }
}

5.新建dwrTest.jspapp

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<html >
<head>
   <meta name="decorator" content="default"/>
   <script type='text/javascript' src='<%=request.getContextPath()%>/dwr/engine.js'></script>
   <script type='text/javascript' src='<%=request.getContextPath()%>/dwr/util.js'></script>
   <script type='text/javascript' src='<%=request.getContextPath()%>/dwr/interface/ProtocolDwrUtils.js'> </script>
</head>

<body  onload="initDwr()">
   <script type="text/javascript">
      //生成隨機字符串
      function randomString(len) {
         len = len || 32;
         var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';    /****默認去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
         var maxPos = $chars.length;
         var pwd = '';
         for (i = 0; i < len; i++) {
            pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
         }
         return pwd;
      }
      function initDwr(){
         dwr.engine.setActiveReverseAjax(true);  //必須配置
         dwr.engine.setNotifyServerOnPageUnload( true);//必須配置
         var code =randomString(6); //調用隨機數生成方法,生成惟一的標識
         ProtocolDwrUtils.onPageLoad(code);   //精確推送,經過惟一的code
         alert("初始化Dwr。。。 。。。 。。。,隨機編碼爲:"+code);
      }
      function helloWord() {
         alert("HelloWord !")
      }
   
   </script>
   
   <script type="application/javascript">
      initDwr()
   </script>

   歡迎使用DWR作測試

</body>
</html>

6.手寫controller測試dom

//測試,調用jsp頁面,在jsp頁面中經過js方法調用後臺java方法
@RequestMapping(value = "test")
public String test( Model model) {
   return "modules/task/dwrtest/dwrTest";
}

//測試,調DWR,根據userId向不一樣的人推送消息
@RequestMapping(value = "dwr")
public void dwr(String userId) {
   ProtocolDwrUtils utils = new ProtocolDwrUtils();
   utils.sendProtocolToPage("",userId);
}
相關文章
相關標籤/搜索