<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    軟件藝術思考者  
    混沌,彷徨,立志,蓄勢...
    公告
    日歷
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    隨筆分類(86)

    隨筆檔案(85)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     

    作者:Cloves Carneiro; simmone
    原文地址: http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html
    中文地址: http://www.matrix.org.cn/resource/article/43/43926_DWR_AJAX.html
    關鍵詞: DWR AJAX


    概述

    這篇文章闡述了使用開源項目DWR(直接Web遠程控制)和AJAX(異步JavaScript和XML)的概念來提高Web應用的可用性。作者一步步來展示DWR如何使得AJAX的應用既簡單又快捷。(1600字;2005年6月20日)

    AJAX,或者說是異步JavaScript和XML,描述了一種使用混合了HTML(或XHTML)和層疊樣式表作為表達信息,來創建交互式的Web應用的開發技術;文檔對象模型(DOM),JavaScript,動態地顯示和與表達信息進行交互;并且,XMLHttpRequest對象與Web服務器異步地交換和處理數據。

    因特網上許多例子展示了在一個HTML文件內部使用XMLHttpRequest與服務器端進行交互的必要的步驟。當手工地編寫和維護XMLHttpRequest代碼時,開發者必須處理許多潛在的問題,特別是類似于跨瀏覽器的DOM實現的兼容性這樣的問題。這將會導致在編碼和調試Javascript代碼上面花費數不清的時間,這顯然對開發者來說很不友好。

    DWR(直接Web遠程控制)項目是在Apache許可下的一個開源的解決方案,它供給那些想要以一種簡單的方式使用AJAX和XMLHttpRequest的開發者。它具有一套Javascript功能集,它們把從HTML頁面調用應用服務器上的Java對象的方法簡化了。它操控不同類型的參數,并同時保持了HTML代碼的可讀性。

    DWR不是對一個設計的插入,也不強迫對象使用任何種類的繼承結構。它和servlet框架內的應用配合的很好。對缺少DHTML編程經驗的開發者來說,DWR也提供了一個JavaScript庫包含了經常使用的DHTML任務,如組裝表,用item填充select下拉框,改變HTML元素的內容,如<div>和<span>
    DWR網站是詳盡的并且有大量的文檔,這也是這篇文章的基礎。一些例子用來展示DWR如何使用和用它的庫可以完成什么樣的工作。

    這篇文章讓讀者看到了一個使用了DWR的Web應用是如何一步步建立的。我會展示創建這個簡單的示例應用的必要的細節,這個應用是可下載的并且可以在你的環境中布署來看看DWR如何工作。
    注意:找到有關AJAX的信息并不困難;網頁上有幾篇文章和博客的條目涵蓋了這個主題,每一個都試圖指出和評論這個概念的不同的方面。在資源部分,你會找到一些有趣的指向示例和文章的鏈接,來學習AJAX的更多的內容。

    示例應用
    這篇文章使用的示例應用模擬了多倫多的一個公寓出租搜索引擎。用戶可以在搜索前選擇一組搜索標準。為了提高交互性,AJAX中以下兩種情況下使用:
    ·應用通告用戶配合他的選擇會返回多少搜索結果。這個數字是實時更新的-使用AJAX-當用戶選擇的臥室和浴室的數量,或者價格范圍變化時。當符合標準的搜索結果沒有或太多時,用戶就沒有必要點擊搜索按紐。
    ·數據庫查詢并取回結果是由AJAX完成的。當用戶按下顯示結果按鈕時,數據庫執行搜索。這樣,應用看起來更具響應了,而整個頁面不需要重載來顯示結果。

    數據庫
    我們使用的數據庫是HSQL,它是一種占用資源很小的Java SQL數據庫引擎,可以不需要安裝和配置的與Web應用捆綁在一起。一個SQL文件被用來在Web應用的上下文啟動時創建一個內存中的表并添加一些記錄。

    Java類
    應用包含了兩個主要的類叫Apartment和ApartmentDAO。Apartment.java類是一個有著屬性和getter/setter方法的簡單的Java類。ApartmentDAO.java是數據訪問類,用來查詢數據庫并基于用戶的搜索標準來返回信息。ApartmentDAO類的實現的直接了當的;它直接使用了Java數據庫聯接調用來得到公寓的總數和符合用戶請求的可用公寓的列表。

    DWR配置和使用
    設置DWR的使用是簡單的:將DWR的jar文件拷入Web應用的WEB-INF/lib目錄中,在web.xml中增加一個servlet聲明,并創建DWR的配置文件。DWR的分發中需要使用一個單獨的jar文件。你必須將DWR servlet加到應用的WEB-INF/web.xml中布署描述段中去。

    								????<servlet>
    ????????<servlet-name>dwr-invoker</servlet-name>
    ????????<display-name>DWR Servlet</display-name>
    ????????<description>Direct Web Remoter Servlet</description>
    ????????<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
    ????????<init-param>
    ????????????<param-name>debug</param-name>
    ????????????<param-value>true</param-value>
    ????????</init-param>
    ????</servlet>

    ????<servlet-mapping>
    ????????<servlet-name>dwr-invoker</servlet-name>
    ????????<url-pattern>/dwr/*</url-pattern>
    ????</servlet-mapping>


    一個可選的步驟是設置DWR為調試模式—象上面的例子那樣—在servlet描述段中將debug參數設為true。當DWR在調試模式時,你可以從HTMl網頁中看到所有的可訪問的Java對象。包含了可用對象列表的網頁會出現在/WEBAPP/dwr這個url上,它顯示了對象的公共方法。所列方法可以從頁面中調用,允許你,第一次,運行服務器上的對象的方法。下圖顯示了調試頁的樣子:

    image
    調試頁

    現在你必須讓DWR知道通過XMLHttpRequest對象,什么對象將會接收請求。這個任務由叫做dwr.xml的配置文件來完成。在配置文件中,定義了DWR允許你從網頁中調用的對象。從設計上講,DWR允許訪問所有公布類的公共方法,但在我們的例子中,我們只允許訪問幾個方法。下面是我們示例的配置文件:
    								<dwr>
    ????<allow>
    ????????<convert converter="bean" match="dwr.sample.Apartment"/>
    ????????<create creator="new" javascript="ApartmentDAO" class="dwr.sample.ApartmentDAO">
    ????????????<include method="findApartments"/>
    ????????????<include method="countApartments"/>
    ????????</create>
    ????</allow>
    </dwr>


    上面的文件實現了我們例子中的兩個目標。首先,<convert>標記告訴DWR將dwr.sample.Apartment對象的類型轉換為聯合數組,因為,出于安全的原因,DWR默認的不會轉換普通bean。第二,<create>標記讓DWR暴露出dwr.sample.ApartmentDAO類給JavaScript調用;我們在頁面中使用JavaScript文件被javascript屬性定義。我們必須注意<include>標記,它指明了dwr.sample.ApartmentDAO類的哪些方法可用。

    HTML/JSP代碼
    配置完成后,你就可以啟動你的Web應用了,這時DWR會為從你的HTML或Java服務器端頁面(JSP)上調用所需方法作好準備,并不需要你創建JavaScript文件。在search.jsp文件中, 我們必須增加由DWR提供的JavaScript接口,還有DWR引擎,加入以下三行到我們的代碼中:

    								??<script src='dwr/interface/ApartmentDAO.js'></script>
    ??<script src='dwr/engine.js'></script>
    ??<script src='dwr/util.js'></script>


    我們注意到當用戶改變搜索標準時,這是AJAX在示例程序中的首次應用;正如他所看到的,當標準改變時,可用的公寓數量被更新了。我創建了兩個JavaScript函數:當某一個選擇下拉框中的值變化時被調用。ApartmentDAO.countApartments()函數是最重要的部分。最有趣的是第一個參數, loadTotal()函數,它指明了當接收到服務端的返回時DWR將會調用的JavaScript方法。loadTotal于是被調用來在HTML頁面的<div>中顯示結果。下面是在這個交互場景中所使用到的JavaScript函數:

    								function updateTotal() {
    ????$("resultTable").style.display = 'none';
    ????var bedrooms = document.getElementById("bedrooms").value;
    ????var bathrooms = document.getElementById("bathrooms").value;
    ????var price = document.getElementById("price").value;
    ????ApartmentDAO.countApartments(loadTotal, bedrooms, bathrooms, price);
    }

    function loadTotal(data) {
    ????document.getElementById("totalRecords").innerHTML = data;
    }


    很明顯,用戶想看到符合他的搜索條件的公寓列表。那么,當用戶對他的搜索標準感到滿意,并且總數也是有效的話,他會按下顯示結果的按紐,這將會調用updateResults() JavaScript方法:

    								function updateResults() {
    ????
    ????DWRUtil.removeAllRows("apartmentsbody");
    ????var bedrooms = document.getElementById("bedrooms").value;
    ????var bathrooms = document.getElementById("bathrooms").value;
    ????var price = document.getElementById("price").value;
    ????ApartmentDAO.findApartments(fillTable, bedrooms, bathrooms, price);
    ????$("resultTable").style.display = '';
    }

    function fillTable(apartment) {
    ????DWRUtil.addRows("apartmentsbody", apartment, [ getId, getAddress, getBedrooms, getBathrooms, getPrice ]);
    }


    updateResults()方法清空了存放搜索返回結果的表域,從用戶界面上獲取所需參數,并且將這些參數傳給DWR創建的ApartmentDAO對象。然后數據庫查詢將被執行,fillTable()將會被調用,它解析了DWR返回的對象(apartment),然后將其顯示到頁面中(apartmentsbody)。

    安全因素
    為了保持示例的簡要,ApartmentDAO類盡可能的保持簡單,但這樣的一個類通常有一組設置方法來操作數據,如insert(), update()和delete()。DWR暴露了所有公共方法給所有的HTML頁面調用。出于安全的原因,像這樣暴露你的數據訪問層是不明智的。開發者可以創建一個門面來集中所有JavaScript函數與底層業務組件之間的通信,這樣就限制了過多暴露的功能。

    結論
    這篇文章僅僅讓你在你的項目中使用由DWR支持的AJAX開了個頭。DWR讓你集中注意力在如何提高你的應用的交互模型上面,消除了編寫和調試JavaScript代碼的負擔。使用AJAX最有趣的挑戰是定義在哪里和如何提高可用性。DWR負責了操作Web頁面與你的Java對象之間的通信,這樣就幫助你完全集中注意力在如何讓你的應用的用戶界面更加友好,
    我想感謝Mircea Oancea和Marcos Pereira,他們閱讀了這篇文章并給予了非常有價值的返匱。

    資源
    ·javaworld.com:
    javaworld.com
    ·Matrix-Java開發者社區: http://www.matrix.org.cn/
    ·onjava.com: onjava.com
    ·下載示例程序的全部源碼: http://www.javaworld.com/javaworld/jw-06-2005/dwr/jw-0620-dwr.war
    ·DWR: http://www.getahead.ltd.uk/dwr/index.html
    ·HSQL:http://hsqldb.sourceforge.net/
    ·AJAX的定義:http://en.wikipedia.org/wiki/AJAX
    · “AJAX:通向Web應用的新途徑": Jesse James Garrett (Adaptive Path, 2005.2): http://www.adaptivepath.com/publications/essays/archives/000385.php
    · “非常動態的Web界面” Drew McLellan (xml.com, 2005.2): http://www.xml.com/pub/a/2005/02/09/xml-http-request.html
    ·XMLHttpRequest & AJAX 工作范例: http://www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples
    · “可用的XMLHttpRequest實踐” Thomas Baekdal (Baekdal.com, 2005.3): http://www.baekdal.com/articles/Usability/usable-XMLHttpRequest/
    ·"XMLHttpRequest使用導引" Thomas Baekdal (Baekdal.com,??2005.2):http://www.baekdal.com/articles/Usability/XMLHttpRequest-guidelines/
    ·AJAX實質:http://www.ajaxmatters.com/

    (看完后個人感覺:有了DWR就JAVA開發而言,完全可以與AJAX匹敵啦,省了在JS上對XMLHTTP以及對DOM的處理,不可以避免地在后臺對應的IO處理;然后就DWR來說,它增加了對XML中對應的配置--在開源框架中似乎一直不曾停止過。還有對一些DWR自有用法如DWRUtil.addRows得參考其相關文檔---當然這樣的功能我們自己也可以用JS來解決,并且它顯然很實用。)
    DWRUtil學習



    這些功能函數在下面這個網址都有示例,這里只是把他們用中文解釋,方便查找.
    http://getahead.ltd.uk/dwr/browser/util

    DWRUtil.getText(id)

    這個函數只能用于select

    getText(id) is similar to getValue(id), except that it is designed for <select ... lists where you need to get the displayed text rather than the value of the current option.

    這個函數主要的作用是取到當前select的顯示值即<option value>xxx</option>中xxx的內容


    DWRUtil.getValue(id) 用來得到<option value>xxx</option>等元素的value值

    DWRUtil.getValue(id) is the read version of setValue(). This gets the values out of the HTML elements without you needing to worry about how a selection list differs from a div.



    這個函數能用于多個元素input type =textarea,text,Form button,formbutton,password(明文),
    Fancy button等元素,主要可以屏蔽原來對select元素getValue操作帶來的不便


    DWRUtil.getValues()


    getValues() is similar to getValue() except that the input is a Javascript object that contains name/value pairs. The names are assumed to be the IDs of HTML elements, and the values are altered to reflect the contents of those IDs. This method does not return the object in question, it alters the value that you pass to it.
    此函數主要是一次完成多個元素的getValue()操作,并將value的結果以js對象的形式封裝起來返回,參數是一個js對象,其中包含了希望取到value的element id
    e.g
    { div:null, textarea:null, select:null, text:null, password:null, formbutton:null, button:null}
    詳細參考http://getahead.ltd.uk/dwr/browser/util/getvalues查看效果
    DWRUtil.onReturn
    When inputs are part of a form then the return key causes the form to be submitted. When you are using Ajax, this is generally not what you want. Usually it would be far better if some JavaScript was triggered.Unfortunately different browsers handle events in quite a different manner. So DWRUtil.onReturn patches over the differences.
    在一個form表單中敲回車鍵將導致表單被遞交,這往往不是我們希望看到的.但是很多瀏覽器對這個事件的處理是不統一的,這個函數就是為了消除這個不統一的

    DWRUtil.onReturn(event, submitFunction)


    DWRUtil.selectRange
    Selecting a range of text in an input box
    You need to select text in an input box for any "Google suggest" type functions, however the selection model changes a lot between different browsers. The DWRUtil function to help here is: DWRUtil.selectRange(ele, start, end).
    在一個input元素中選擇一個范圍的字符串,可以查看
    http://getahead.ltd.uk/dwr/browser/util/selectrange操作

    DWRUtil.setValue(id, value)

    DWRUtil.setValue(id, value) finds the element with the id specified in the first parameter and alters its contents to be the value in the second parameter.
    This method works for almost all HTML elements including selects (where the option with a matching value and not text is selected), input elements (including textareas) divs and spans.
    主要是為了設值,屏蔽了select元素設值的問題,對select也可以方便的setvalue

    DWRUtil.setValues()
    Similar to setValue except that the input is a Javascript object that contains name/value pairs. The names are assumed to be the IDs of HTML elements, and the values, what we should set the contents of the elements.
    與getValues對應,傳入js對象,將對象中的value傳給相應的element

    DWRUtil.toDescriptiveString(id,degree)
    DWRUtil.toDescriptiveString is a better version of the toString() than the default. This function has a third parameter that declares the initial indent. This function should not be used from the outside world as it may well change in the future.
    此函數主要用來調試,傳入元素的id,調試的degree將顯示DOM信息
    此函數有第三個參數,用于聲明初始化,包含第三個參數的調用不應該為使用,因為這個函數將來會改變
    DWRUtil.useLoadingMessage
    You must call this method after the page has loaded (i.e. not before the onload() event has fired) because it creates a hidden div to contain the loading message.
    你必須在頁面加載完成后(body onload事件)調用這個函數,因為它會創建一個div,來包含一些消息.類似gmail的message模式的東西.為了達到在頁面加載完成后來操作,
    http://getahead.ltd.uk/dwr/browser/util/useloadingmessage
    提供了一些方法.例如
    <script>function init() { DWRUtil.useLoadingMessage();}if (window.addEventListener) { window.addEventListener("load", init, false);}else if (window.attachEvent) { window.attachEvent("onload", init);}else { window.onload = init;}</script>
    該參考頁面給出了2個類似的文字圖片實現.
    DWRUtil.addOptions() 用返回的集合來填充select元素
    多種實現,詳細參考http://getahead.ltd.uk/dwr/browser/lists

    DWRUtil.addRows() 返回的集合來填充table元素,或者tbody更為合適?
    ?
    posted on 2006-09-19 16:38 智者無疆 閱讀(926) 評論(2)  編輯  收藏 所屬分類: Client teachnolgy research
    評論:
    • # re: dwr實例  zhanglijun Posted @ 2008-03-11 11:16
      1.jsp文件里:<script type='text/javascript' src='<c:url value="/dwr/interface/dwrUser.js"/>'></script>
      <script type='text/javascript' src='/dwr/interface/dwrCorps.js'/></script>
      <script type='text/javascript' src='<c:url value="/dwr/engine.js"/>'></script>
      <script type='text/javascript' src='<c:url value="/dwr/util.js"/>'></script>
      function findCorpsOnPage(pageNum){
      var pageSize =10;
      if(pageNum==0)pageNum=1;
      //alert("begin");

      dwrUser.getCorsOnPage2(pageSize,pageNum,callShowCorps2);
      }

      function callShowCorps2(data){
      var dd = document.getElementById('dd');
      document.getElementById("dd").innerHTML= pcont;
      var ddContent = dd.innerHTML;

      if(data!=null){
      var cons_name;
      var cons_id;
      for(var i=0;i<data.results.length;i++){
      var div="<div class=test style='width:200px;float:left; '>"+
      "<a href=\"javascript:checkIt(id1,'corpName')\">corpName</a></div>";
      cons_name = data.results[i].name;
      cons_id =data.results[i].id;
      div = div.replace(/corpName/g,cons_name);
      div = div.replace(/id1/,cons_id);
      ddContent += div;
      }
      ddContent+="<br/><br/><p/><hr/>"
      for (i=1;i<=data.totalPageCount;i++){

      var p= "<a href=\"javascript:findCorpsOnPage("+i+")\" >"+i+"</a> ";
      if(data.pageNum==i)
      p = "<a href=\"javascript:findCorpsOnPage("+i+")\" ><font color=red >"+i+"<font></a> ";


      ddContent+=p;


      }
      dd.innerHTML =ddContent;
      }else{

      alert("沒有企業");
      }
      }



      2.與web.xml并行的dwr.xml
      <dwr>
      <allow>
      <convert converter="bean" match="cn.com.swjay.data.model.Corporation"></convert>
      <convert converter="bean" match="cn.com.swjay.data.model.impl.CorporationImpl"/>
      <convert converter="bean" match="cn.com.swjay.monitoring.service.model.CorporationService"/>
      <convert converter="bean" match="cn.com.swjay.monitoring.service.model.impl.CorporationServiceImpl.java"/>
      <convert converter="bean" match="cn.com.opendata.platform.common.page.Page"/>

      <create creator="new" javascript="dwrUser" scope="application">
      <param name="class" value="cn.com.swjay.monitoring.dwr.DwrController"/>
      </create>
      <create creator="new" javascript="dwrCorps">
      <param name="class" value="cn.com.swjay.guidelineconfig.dwr.Corperations" />
      </create>
      </allow>
      </dwr>
        回復  更多評論   

    • # re: dwr實例  zhanglijun Posted @ 2008-03-11 11:17
      @zhanglijun
      localhost:8080/項目名/dwr/
      這樣可以進行dwr類的測試  回復  更多評論   

     
    Copyright © 智者無疆 Powered by: 博客園 模板提供:滬江博客


       觀音菩薩贊

    主站蜘蛛池模板: 久久久无码精品亚洲日韩按摩| 亚洲精品无播放器在线播放| 最近免费2019中文字幕大全| 亚洲中文字幕久久精品无码A| 亚洲精品国产V片在线观看| 免费观看一区二区三区| 日韩亚洲产在线观看| 亚洲视频在线精品| 免费在线看v网址| 一级做a爰片久久毛片免费陪| 亚洲精品视频在线免费| 无码国产亚洲日韩国精品视频一区二区三区 | 日本免费一区二区三区| 亚洲一日韩欧美中文字幕在线| 亚洲天堂在线视频| 成人免费AA片在线观看| a毛片在线免费观看| 亚洲精品欧美综合四区| 久久精品国产亚洲AV麻豆~| 国产成人免费福利网站| www视频在线观看免费| 成人免费无码H在线观看不卡| 77777午夜亚洲| 亚洲图片在线观看| 亚洲毛片网址在线观看中文字幕| 可以免费看的卡一卡二| a级在线免费观看| 亚洲AV性色在线观看| 亚洲高清中文字幕| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 亚洲视频免费一区| 国外亚洲成AV人片在线观看| 成年女人毛片免费播放视频m| 久久久99精品免费观看| 一本久久免费视频| 精品国产成人亚洲午夜福利| 亚洲电影中文字幕| 亚洲码国产精品高潮在线| 免费国产a国产片高清| 成人人免费夜夜视频观看| 亚洲w码欧洲s码免费|