一、web.xml
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<!-- DWR默认采用piggyback方式 -->
<!-- 使用polling和comet的方式 -->
<init-param>
<param-name>pollAndCometEnabled</param-name>
<param-value>true</param-value>
</init-param>
<!-- comet方式 -->
<!--
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
-->
<!-- polling方式:在comet方式的基础之上,再配置以下参数 -->
<!--
<init-param>
<param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name>
<param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value>
</init-param>
-->
<!-- 毫秒数。页面默认的请求间隔时间是5秒 -->
<!--
<init-param>
<param-name>disconnectedTime</param-name>
<param-value>60000</param-value>
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
这里有三种模式
1.piggyback。被动模式,不会增加连接的开销,一个连接请求后,把积累的信息发出去,然后被动的等待下一次连接。缺点,下一次连接的时间并不确定,可能根本就没有了,造成数据丢失或者不及时展现。
2.comet。 主动模式,客户端不停向服务器建立连接,如果有数据则可以马上带回。缺点是大部分的连接并没有数据带回,比较浪费。
3.polling。主动模式,与comet差不多,可以手工控制定时请求的时间间隔。
三种模式在web.xml里的配置决定。
二、dwr.xml
新建dwr.xml文件,路径和web.xml路径一致。
<dwr>
<create creator="new" javascript="DWRHelper">
<param name="class" value="com.cjm.web.dwr.DWRHelper"/>
<include method="addMessage"/>
<include method="test"/>
</create>
<convert converter="bean" match="com.cjm.web.dwr.Message">
<param name="include" value="id,text"/>
</convert>
</dwr>
1.create creator表示实例的创建方式常见有new,spring,以上用new来做例子。内容比较简单。
2.convert 传递的参数转换。
三.java代码
1.Message的源码
public class Message {
private long id = System.currentTimeMillis();
private String text;
public Message(){
}
public Message(String newText){
text = newText;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
2.DWRHelper类源码
public class DWRHelper {
private static LinkedList<Message> messages = new LinkedList<Message>();
private static ReentrantLock lock = new ReentrantLock(); //JDK5锁
public void addMessage(String text){
try{
lock.lock();
if(text!=null && text.trim().length()>0){
messages.addFirst(new Message(text));
if(messages.size()>10){
messages.removeLast();
}
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
lock.unlock();
}
//获得DWR上下文
WebContext webContext = WebContextFactory.get();
//获取当前页面URL,比如/ext3/test_tag.jsp
String currentPage = webContext.getCurrentPage();
//当前脚本sessin
ScriptSession scriptSession = webContext.getScriptSession();
//设置页面控件的值
Util util = new Util(scriptSession);
util.setValue("text", ""); //这里是清空页面输入框的值
//设置脚本sessin的属性值
scriptSession.setAttribute("uid", "cjm");
//获取脚本session的属性值
for(Iterator it=scriptSession.getAttributeNames();it.hasNext();){
String attrName = (String)it.next();
System.out.println(attrName + "=" + scriptSession.getAttribute(attrName));
}
//获取所有浏览当前页面的脚本session
Collection<ScriptSession> sessions = webContext.getScriptSessionsByPage(currentPage);
Util utilAll = new Util(sessions);
//执行客户端脚本
//这里就在拼写 js 语句
ScriptBuffer script = new ScriptBuffer();
script.appendScript("clientFunction(")
.appendData(scriptSession.getAttribute("uid"))
.appendScript(");");
for(ScriptSession session: sessions){
session.addScript(script);
}
//更新这些脚本session的一些元素
utilAll.removeAllOptions("messages");
utilAll.addOptions("messages", messages, "id", "text");
}
}
四、前段页面
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type='text/javascript' src='/ext3/dwr/engine.js'></script>
<script type='text/javascript' src='/ext3/dwr/util.js'></script>
<script type='text/javascript' src='/ext3/dwr/interface/DWRHelper.js'></script>
</head>
<!-- 通过 dwr.engine.setActiveReverseAjax(true); 启动该页面的Reverse Ajax功能 -->
<body οnlοad="dwr.engine.setActiveReverseAjax(true);sendMessage();">
<p>输入信息: <input id="text" οnkeypress="dwr.util.onReturn(event, sendMessage)" />
<input type="button" value="Send" οnclick="sendMessage()" /></p>
<script type="text/javascript">
function sendMessage() {
DWRHelper.addMessage(dwr.util.getValue("text"));
}
</script>
<hr/>
<select id="messages"></select>
</body>
</html>
五、小结
1.dwr.xml是关键,定义了java向js暴露的方法,和传递的参数。
2.<script type='text/javascript' src='/ext3/dwr/engine.js'></script>
<script type='text/javascript' src='/ext3/dwr/util.js'></script>
<script type='text/javascript' src='/ext3/dwr/interface/DWRHelper.js'></script>
都是动态生成的js,其中DWRHelper.js就是dwr.xml中转换过来的
3.页面用DWRHelper.addMessage向后台发送数据,后台用session.addScript(script)调用前段js的方法。