----------
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>firstDWR</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <!-- The DWR Servlet... --> <servlet> <display-name>DWR Servlet</display-name> <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>crossDomainSessionSecurity</param-name> <param-value>false</param-value> </init-param> <!-- 下面是comet<strong>模式</strong>的<strong>反向</strong>Ajax所需要的参数 --> <init-param> <param-name>activeReverseAjaxEnabled</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> </web-app>
dwr.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd"> <dwr> <allow> <create creator="new" javascript="MathDelegate"> <param name="class" value="app.MathDelegate" /> </create> </allow> </dwr>
java文件
package app; import org.directwebremoting.Browser; import org.directwebremoting.ScriptSessions; public class MathDelegate { private static int num = 1; /** * 推送数字到页面上去 * * @param userid * @param request * @return */ public void dwrHandle() { Browser.withAllSessions(new Runnable() { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // funA为页面上一个js函数,num++为funA的参数 ScriptSessions.addFunctionCall("funA",num++); } }); } /** * 触发推送的方式(触发10次),comet方式,有数据的情况下触发推送 */ public void handle() throws InterruptedException{ int m = 0; while(m++ < 10){ Thread.sleep(3000); dwrHandle(); } } }
index.html
<html> <head> <Meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> <title>firstdwr</title> <script type="text/javascript" src="dwr/engine.js"></script> <!-- 注意:<strong>反向</strong>Ajax中,util.js是必须包含的 --> <script type="text/javascript" src="dwr/util.js"></script> <script type="text/javascript" src="dwr/interface/MathDelegate.js"></script> <script> <!-- 轮询<strong>模式</strong>与comet<strong>模式</strong>的<strong>反向</strong>Ajax所需要的配置 --> dwr.engine.setActiveReverseAjax(true); <!-- //重点关于解决页面每刷新一次会多创建一个新的ScriptSession的解决方法 //由于ScriptSession的创建机制不同于HttpSession,它会在每次页面刷新的时候都会重新创建,而销毁机制却是失去连接 //或者失效之后一定时间才会自动销毁,这样就可能造成服务端可能就保存了很多的无用的ScriptSession,所以不仅仅会影响 //性能问题,更重要的是,可能就不能实现你想要的功能。 //解决方法是在接收消息的页面,也就是你调用dwr.engine.setActiveReverseAjax(true);的页面调用一个dwr的方法。 //dwr.engine.setNotifyServerOnPageUnload(true); //这个方法的功能就是在销毁或刷新页面时销毁当前ScriptSession,这样就保证了服务端获取的ScriptSession集合中没有 //无效的ScriptSession对象。 --> dwr.engine.setNotifyServerOnPageUnload(true); function start(){ MathDelegate.handle(); } function funA(num){ document.getElementById("resultDiv").innerHTML="<h1>"+num+"</h1>"; } </script> </head> <body> <hr/> DWR<strong>演示</strong>:<br><span id="resultDiv"></span> <hr/> <input type="button" value="start" onclick="start();"> </body> </html>原文链接:https://www.f2er.com/ajax/164761.html