首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

DWR 註解配置與 Reverse Ajax 實戰詳解

     編輯:Java 相關知識

DWR 註解基本配置

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 等。

Reverse Ajax 三種模式

1. Polling(輪詢)

瀏覽器定時發送 AJAX 請求詢問伺服器是否有更新。請求頻率與即時性權衡,伺服器負載較高。

2. Comet(長連接)

伺服器保持 HTTP 連接不關閉(掛起),有數據即時推送。響應最快,但佔用連接資源,高併發下可能耗盡連接池。

3. Piggyback(附帶)

下次客戶端主動請求時,伺服器將待推送數據附帶返回。零額外請求,但延遲不可控,甚至可能永遠不推送。

Reverse Ajax 實作範例

服務端

@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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved