DWR 2.0+ 支援 Java 5 註解,免除 dwr.xml。需在 web.xml 配置 DwrServlet:
<servlet>
<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>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classes</param-name>
<param-value>
org.relax.service.SectionManager,
org.relax.service.entity.Section
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
注意:DWR 2.0 不支援包掃描,必須在 classes 參數中逐一列出類全名。
| 註解 | 用途 | 範例 |
|---|---|---|
@RemoteProxy | 類級,暴露為遠程服務,指定創建器 | @RemoteProxy(creator=SpringCreator.class, name="sectionManager", creatorParams=@Param(name="beanName", value="sectionManager")) |
@RemoteMethod | 方法級,允許遠程調用 | @RemoteMethod public Section get(Integer id) |
@DataTransferObject | 類級,標記為傳輸物件 (VO/DTO) | @DataTransferObject public class Section { ... } |
@RemoteProperty | 屬性級,控制屬性可見性(預設全可見) | @RemoteProperty private String name; |
常用創建器:NewCreator(預設)、SpringCreator、StrutsCreator、EJB3Creator 等。
瀏覽器定時發送 AJAX 請求詢問伺服器是否有更新。請求頻率與即時性權衡,伺服器負載較高。
伺服器保持 HTTP 連接不關閉(掛起),有數據即時推送。響應最快,但佔用連接資源,高併發下可能耗盡連接池。
下次客戶端主動請求時,伺服器將待推送數據附帶返回。零額外請求,但延遲不可控,甚至可能永遠不推送。
@RemoteMethod
public synchronized void start() {
WebContext wctx = WebContextFactory.get();
String page = wctx.getCurrentPage();
running = true;
for (int i = 0; i < 1000 && running; i++) {
ScriptBuffer script = new ScriptBuffer();
script.appendScript("receiveMessages(").appendData(i).appendScript(");");
Collection<ScriptSession> sessions = wctx.getScriptSessionsByPage(page);
for (ScriptSession sess : sessions) sess.addScript(script);
Thread.sleep(3000);
}
}
@RemoteMethod
public void stop() { running = false; }
<body onload="dwr.engine.setActiveReverseAjax(true)">
<button onclick="sectionManager.start()">Start</button>
<button onclick="sectionManager.stop()">Stop</button>
<div id="content"></div>
<script>
function receiveMessages(msg) {
document.getElementById("content").innerHTML = msg;
}
</script>
</body>
關鍵點:body onload 必須啟用 dwr.engine.setActiveReverseAjax(true),且 web.xml 已開啟 activeReverseAjaxEnabled。