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); }