DWR高级主题之反向Ajax(DWR3的轮询模式演示1)
----------
dwr.xml
java文件
index.html
----------
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>
<!-- 下面是轮询模式的反向Ajax所需要的参数 -->
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name>
<param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value>
</init-param>
<!-- 设置轮询的频率为6秒 -->
<init-param>
<param-name>disconnectedTime</param-name>
<param-value>6000</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++);
}
});
}
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" οnclick="start();">
</body>
</html>