原文http://blog.csdn.net/fhd001/article/details/7099209
DWR高级主题之反向Ajax(DWR3的comat模式演示1)
----------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模式的反向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>
- <!-- 注意:反向Ajax中,util.js是必须包含的 -->
- <script type="text/javascript" src="dwr/util.js"></script>
- <script type="text/javascript" src="dwr/interface/MathDelegate.js"></script>
- <script>
- <!-- 轮询模式与comet模式的反向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演示:<br><span id="resultDiv"></span>
- <hr/>
- <input type="button" value="start" onclick="start();">
- </body>
- </html>
- 原文http://blog.csdn.net/fhd001/article/details/7099209