web.xml
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>com.wxl.app.service.MyDwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<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>
<init-param>
<param-name>disconnectedTime</param-name>
<param-value>1000</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
配置轮询参数,activeReverseAjaxEnabled设置反转,PollingServerLoadMonitor是使用轮询,disconnectedTime是轮询的时间周期
dwr.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<allow>
<convert converter="bean" match="com.wxl.app.service.Person" />
<create creator="new" javascript="service">
<param name="class" value="com.wxl.app.service.HelloWorldService" />
</create>
<create creator="new" javascript="personService">
<param name="class" value="com.wxl.app.service.PersonService" />
</create>
<create creator="new" javascript="messageService">
<param name="class" value="com.wxl.app.service.MessageService" />
</create>
</allow>
</dwr>
java
package com.wxl.app.service;
import org.directwebremoting.Browser;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSessions;
public class MessageService {
public void sendMessage(String message) {
final ScriptBuffer script = new ScriptBuffer();
script.appendCall("show", message);
Browser.withCurrentPage(new Runnable() {
public void run() {
ScriptSessions.addScript(script);
}
});
}
}
Browser.withCurrentPage()方法会把当前页面的所有ScriptSession绑定到当前线程。在run方法中的ScriptSessions是之前绑定到线程的sessions。
jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'reverse.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type='text/javascript' src='/dwr/dwr/engine.js'></script>
<script type='text/javascript'
src='/dwr/dwr/interface/messageService.js'></script>
<script type='text/javascript' src='js/jquery-1.4.2.min.js'></script>
<script type="text/javascript">
dwr.engine.setActiveReverseAjax(true);
//这个方法用来启动该页面的ReverseAjax功能
dwr.engine.setActiveReverseAjax(true);
//设置在页面关闭时,通知服务端销毁会话
dwr.engine.setNotifyServerOnPageUnload(true);
//这个函数是提供给后台推送的时候 调用的
function show(content) {
$("#content").text(content);
}
function sendMessage() {
var msg = $("#msg").val();
messageService.sendMessage(msg);
}
</script>
</head>
<body>
This is my JSP page.
<input type="text" id="msg" />
<input type="button" id="btn" value="按钮" οnclick="sendMessage();" />
<br />
<textarea id="content" rows="10" cols="20"></textarea>
<br>
</body>
</html>
注意要调用
dwr.engine.setActiveReverseAjax(true);
以及
dwr.engine.setNotifyServerOnPageUnload(true);
关于dwr 反转的几个重要类:
WebContextFactory get()方法返回WebContext
WebContext的几个重要方法
ServerContextFactory get()方法返回ServerContext
ServerContext的几个方法
getContainer()方法返回Container
Container的几个方法
Browser的几个方法
ScriptSessions的几个方法
Util的几个方法