DWR的註釋(annotations)使用及反向調用(Reverse Ajax)

先說說註釋語法,省掉dwr.xml。(自從用了java 5 以後,如今越看一堆堆的配置文件越煩,愈來愈喜歡註釋方式來的直接簡單了)   javascript

首先下載最新的穩定版本的dwr.jar文件放到你的工程中。(還有須要其它的嗎?不須要了,dwr就是這麼簡單)
而後在web.xml中添加以下一段html

  1.  <!-- DWRServlet -->  
  2.  <servlet>  
  3.   <servlet-name>dwr-invoker</servlet-name>  
  4.   <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>  
  5.   <init-param>  
  6. <!-- 默認爲false,調試用,能夠訪問http://地址:端口/上下文/dwr 來進行測試 -->  
  7.    <param-name>debug</param-name>  
  8.    <param-value>true</param-value>  
  9.   </init-param>  
  10. <!--這就是傳說中的DWR反轉調用的開關了,默認也是false -->  
  11.   <init-param>  
  12.    <param-name>activeReverseAjaxEnabled</param-name>  
  13.    <param-value>true</param-value>  
  14.   </init-param>  
  15. <!--日誌級別很少說了-->  
  16.   <init-param>  
  17.    <param-name>logLevel</param-name>  
  18.    <param-value>WARN</param-value>  
  19.   </init-param>  
  20. <!--這塊注意了,關鍵來了,把使用DWR註釋的類都要加在這裏,2.0的DWR好像還不支持包掃描,但願之後能提供這個功能,3.0我還沒注意有沒有這個功能,如今還沒出正式版-->  
  21.   <init-param>  
  22.    <param-name>classes</param-name>  
  23.    <param-value>  
  24.                 org.relax.service.SectionManager,   
  25.     org.relax.service..entity.Section   
  26.             </param-value>  
  27.   </init-param>  
  28.  </servlet>  
  29. <!--這塊不用多說了吧,若是看不懂,哪涼快哪呆着去吧-->  
  30.  <servlet-mapping>  
  31.   <servlet-name>dwr-invoker</servlet-name>  
  32.   <url-pattern>/dwr/*</url-pattern>  
  33.  </servlet-mapping>  

在這裏再說明一下有的文章用的是uk.ltd.getahead.dwr.DWRServlet,其實他只是繼承了一下org.directwebremoting.servlet.DwrServlet本身什麼也沒作,因此這兩個類用哪一個都行(這麼作應該是爲了兼容之前的版本,猜的,1.0我沒用過)。
下面看具體的類吧。java

  1. @Service   
  2. @RemoteProxy(creator = SpringCreator.class, name = "sectionManager"creatorParams = @Param(name = "beanName"value = "sectionManager"))   
  3. public class SectionManager extends DefaultEntityManager<Section, Integer> {   
  4.   
  5.  @Autowired   
  6.  OriginCollectDataManager originCollectDataManager;   
  7.   
  8.  @RemoteMethod   
  9.  public Section get(Integer id) {   
  10.   return super.get(id);   
  11.  }   
  12.   
  13.  @RemoteMethod   
  14.  public List<Section> getAll() {   
  15.   return super.getAll();   
  16.  }   
  17.   
  18. }   
  19.   

個人測試環境裏還用到了spring和hibernate,因此裏面還摻雜了一些spring的註釋標記,固然若是你沒用也無所謂。
這裏主要解釋一下DWR的幾個Annotations
@RemoteProxy標在類上的就是使類能夠運程訪問
@RemoteProxy(creator = SpringCreator.class, name = "sectionManager", creatorParams = @Param(name = "beanName", value = "sectionManager")),
上面由於使用了spring因此寫的是springCreator.class, 其它還有BeanCreator, Ejb3Creator, JsfCreator, NewCreator, NullCreator, PageFlowCreator, ScriptedCreator, SingletonCreator, SpringCreator, StrutsCreator。看本身的具體需求。最經常使用的就是newCreator了吧。
@RemoteMethod標在方法上,不用多說可使方法能遠程訪問
@DataTransferObject標在類上,註明須要轉換的VO類了
@RemoteProperty標在類的屬性上,標明哪些能夠訪問(我試了試不標,好像全均可以訪問了)
經常使用的就這麼多了,其它幾個不太經常使用,若是用到的時候再研究吧。
還有什麼要作的嗎?好像就這麼多了。DWR就是簡單。若是標好了能夠試試訪問上下文路徑加上/dwr來訪問試試了。好像好用了哎。以下圖
點進去看看都有什麼方法

看上去方法好像挺多,其實真正能訪問用的只有用@RemoteMethod標註過的。
測試已經好用了下面就是加到頁面了。那不就更簡單了嗎。按着上圖收到JSP文件中。而後像調用普通javascript對象同樣就能夠了。咱不是作普及的,今天主要講註釋的用法。這部分就到這吧。

下面說反向調用了,這個仍是挺複雜的,首先解釋幾個概念。web

dwr的逆向ajax其實主要包括兩種模式:主動模式和被動模式。其中主動模式包括Polling和Comet兩種,被動模式只有Piggyback這一種。ajax

    所謂的Piggyback指的是若是後臺有什麼內容須要推送到前臺(即調用頁面的js方法),是要等到那個頁面進行下一次ajax請求的時候,將須要推送的內容附加在該次請求以後,傳回到頁面。spring

    polling指的是由瀏覽器定時向服務端發送ajax請求,詢問後臺是否有什麼內容須要推送,有的話就會由服務端返回推送內容。這種方式和咱們直接在頁面經過定時器發送ajax請求,而後查詢後臺是否有變化內容的實現是相似的。只不過用了dwr以後這部分工做由框架幫咱們完成了。瀏覽器

    comet模式指的的當服務端創建和瀏覽器的鏈接,將頁面內容發送到瀏覽器以後,對應的鏈接並不關閉,只是暫時掛起。若是後面有什麼新的內容須要推送到客戶端的時候直接經過前面掛起的鏈接再次傳送數據。服務器

    經過上面的解釋咱們能夠看到,這三種模式都有各自的優缺點。從客戶端請求次數的角度來講,固然是piggyback的模式最好。這個裏面徹底沒有額外的網絡請求,只有等到下次請求頁面主動發起了,中間的變化內容才傳遞迴頁面。可是這也致使了這推送內容的延時,由於你徹底沒辦法知道頁面的下一次請求將在何時發起,也許頁面永遠都沒有下一次請求。polling模式的網絡請求最爲頻繁了,由於這時候頁面無論後臺有沒有更新的內容,都須要發送請求詢問。雖然這種模式能夠經過增長請求間隔的時間來減小單位時間內的請求次數,可是這樣一樣會致使頁面響應後臺內容變化的間隔時間增加,這中間就產生了矛盾,具體的請求間隔時間仍是要根據具體項目的需求來配置。好比服務器能承受的請求間隔和頁面內容所須要的刷新頻率。comet方式的響應速度應該是最快的,後臺一旦有內容須要推送能夠經過前面沒有關閉的鏈接立刻推送到前臺。可是服務器所能提供的鏈接數目是必定的,在大量的掛起的鏈接沒有關閉的狀況下,可能形成新的鏈接請求不能接入,從而影響到服務質量。網絡

以上摘自dwr的Reverse Ajax(推技術的實現之一)
概念說清楚了,下面作一吧。
前面已經說完了註釋方式了,如下還用註釋的方式,方便直觀呀。app

  1. @RemoteMethod  
  2. public synchronized  void start() {   
  3.  WebContext wctx = WebContextFactory.get();   
  4.  String currentPage = wctx.getCurrentPage();   
  5.  running=true;   
  6.  for (int i = 0; i < 1000; i++) {   
  7.   if (!running) {   
  8.    break;   
  9.   }   
  10.   ScriptBuffer script = new ScriptBuffer();   
  11.   script.appendScript("receiveMessages(").appendData(i).appendScript(");");//調用頁面的javascript方法把值添到頁面上。   
  12.   // Loop over all the users on the current page   
  13.   Collection pages = wctx.getScriptSessionsByPage(currentPage);//循環出全部的會話頁面並執行   
  14.   for (Iterator it = pages.iterator(); it.hasNext();) {   
  15.    System.err.println(i);   
  16.    ScriptSession otherSession = (ScriptSession) it.next();   
  17.    otherSession.addScript(script);   
  18.   }   
  19.   try {   
  20.    Thread.sleep(3000);   
  21.   } catch (InterruptedException e) {   
  22.    e.printStackTrace();   
  23.   }   
  24.  }   
  25. }   
  26.   
  27. @RemoteMethod  
  28. public  void stop() {   
  29.  running=false;   
  30. }   

這是個簡單的程序進行以後就是用個循環來更新頁面的數字。
下面也貼一下JSP的代碼吧。也算補充下第一部分了。

  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6.   <script type='text/javascript' src='/dymc-web/dwr/interface/sectionManager.js'></script>  
  7.   <script type='text/javascript' src='/dymc-web/dwr/engine.js'></script>  
  8. <script type="text/javascript">  
  9.   
  10. function receiveMessages(msg) {   
  11.  //alert(msg);   
  12.  document.getElementById("content").innerHTML=msg;   
  13. }   
  14. </script>  
  15. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
  16. <title>Insert title here</title>  
  17. </head>  
  18. <body onload="dwr.engine.setActiveReverseAjax(true)">  
  19. <button onclick="sectionManager.start()">start</button>  
  20. <button onclick="sectionManager.stop()">stop</button>  
  21. <div id="content"></div>  
  22. </body>  
  23. </html>  
  24.   

頁面包括兩個鈕一個開始一箇中止。你們來試試吧。這裏不添圖了太浪費空間
運行起來後點start按鈕,看看頁面上是否是本身開始變了。新打開個IE,用另外的機器訪問此面,疑?怎麼都有數字在變換,這就是DWR Reverse Ajax的厲害所在了。再點一下stop,呀,全部打個IE裏數字都不變了吧。
注意:代碼用的是主動的方式,因此注意頁面onload中的<body onload="dwr.engine.setActiveReverseAjax(true)">沒有這句可就很差用了。固然 web.xml中也不能少了

  1. <init-param>  
  2.  <param-name>activeReverseAjaxEnabled</param-name>  
  3.  <param-value>true</param-value>  
  4. </init-param>  

該說的都說了就到這吧。這篇文章不是給初學者看的。因此不是特別的完整。若是你是初學者,就先去看看基礎吧。可能有點不適合你。

相關文章
相關標籤/搜索