草鞋

          Blog grass shoes
          posts - 1, comments - 4, trackbacks - 0, articles - 27
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          DWR.xml配置文件說明書

          Posted on 2007-09-06 11:30 草 鞋 閱讀(839) 評(píng)論(0)  編輯  收藏
           

          DWR.xml配置文件說明書

          1、建立dwr.xml 配置文件

          任何一個(gè)dwr.xml的文件都需要包含DWR DOCTYPE的聲明行,格式如下:

          <!DOCTYPE dwr PUBLIC

              "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"

              "http://www.getahead.ltd.uk/dwr/dwr10.dtd">

          整個(gè)配置文件的大體結(jié)構(gòu)如下:

          <dwr>

           <init>

              <creator id="..." class="..."/>

              <converter id="..." class="..."/>

           </init>

           <allow>

              <create creator="..." javascript="..." scope="...">

                <param name="..." value="..."/>

              </create>

              <convert convertor="..." match="..."/>

           </allow>

           <signatures>

              ...

           </signatures>

          </dwr>

          有幾個(gè)術(shù)語有必要理解,參數(shù)叫做converted,遠(yuǎn)程Bean叫做created.如果遠(yuǎn)程Bean A有個(gè)方法A.blah(B),那么你需要為A建立一個(gè)created,B建立一個(gè)converted.

          配置文件init部分聲明那些用于建立遠(yuǎn)程bean和在方法調(diào)用中轉(zhuǎn)換bean的類.這部分是可選擇性配置的,多數(shù)情況下可以不必使用它,如果你想定義一個(gè)新的creator或者converter那么就必須在部分中聲明,but do double check on the ones that are currently available first.

          init部分的作用是告訴DWR一些類實(shí)例和關(guān)于這些類怎樣運(yùn)行的信息.實(shí)際上并不會(huì)使用.這有點(diǎn)向java中的import語句,多數(shù)類在使用之前需要引入,但引入了類并不意味著這些在使用,每個(gè)creatorconverter需要有個(gè)id屬性來允許以后進(jìn)行引用.

          配置文件的allow部分定義哪些類可以建立和轉(zhuǎn)換,每個(gè)被準(zhǔn)許的類都可以有一個(gè)'create'或者'convert'配置行.下面列出的類的轉(zhuǎn)換在默認(rèn)情況下不需要進(jìn)一步的設(shè)置.

           1、所有基本類型,boolean,int,double等等

           2、基本類型的對(duì)象形式實(shí)現(xiàn)的類,Boolean,Integer等等

           3java.lang.String

           4java.util.date 和三個(gè)SQL形式的派生類

           5、以上所有類型的數(shù)組形式

           6、以上所有類型的集合,List,Set,Map(有些局限性)

          However nothing is added to the list of classes that can be created (i.e. put up for remoting) without you declaring it.

          2、The Converters

          DWR已經(jīng)默認(rèn)定義和初始化了常用的Converter,他們分別如下:

          <converter id="null"

              class="uk.ltd.getahead.dwr.convert.NullConverter"/>

          <converter id="primitive"

              class="uk.ltd.getahead.dwr.convert.PrimitiveConverter"/>

          <converter id="bignumber"

              class="uk.ltd.getahead.dwr.convert.BigNumberConverter"/>

          <converter id="string"

              class="uk.ltd.getahead.dwr.convert.StringConverter"/>

          <converter id="date"

              class="uk.ltd.getahead.dwr.convert.DateConverter"/>

          <converter id="array"

              class="uk.ltd.getahead.dwr.convert.ArrayConverter"/>

          <converter id="map"

              class="uk.ltd.getahead.dwr.convert.MapConverter"/>

          <converter id="collection"

              class="uk.ltd.getahead.dwr.convert.CollectionConverter"/>

          <converter id="bean"

              class="uk.ltd.getahead.dwr.convert.BeanConverter"/>

          <converter id="hibernate"

              class="uk.ltd.getahead.dwr.convert.HibernateBeanConverter"/>

          <converter id="dom"

              class="uk.ltd.getahead.dwr.convert.DOMConverter"/>

          <converter id="dom4j"

              class="uk.ltd.getahead.dwr.convert.DOM4JConverter"/>

          <converter id="jdom"

              class="uk.ltd.getahead.dwr.convert.JDOMConverter"/>

          <converter id="xom"

              class="uk.ltd.getahead.dwr.convert.XOMConverter"/>

          <converter id="servlet" class="uk.ltd.getahead.dwr.convert.ServletConverter"/>

          這里僅僅是定義了Converter并且簡單的放在<convert….>元素之內(nèi),任何的<convert….>元素內(nèi)容都有兩個(gè)必須定義的屬性.一個(gè)是對(duì)converter定義的引用和converter能夠轉(zhuǎn)換的類.

          例如最簡單的converternull converter,它作用是把nullvoid值轉(zhuǎn)換成javascriptnullundefined.它是所有converter中最簡單的,就象調(diào)用java的靜態(tài)方法一樣,所以并不需要?jiǎng)?chuàng)建對(duì)象.

          默認(rèn)的時(shí)候DWRjava void值轉(zhuǎn)換成javascriptnull值就是這樣設(shè)置<convert converter="null" match="void"/>.有時(shí)java.lang.Void也需要進(jìn)行這樣的轉(zhuǎn)換,所以設(shè)置也是相似的<convert converter="null" match="java.lang.Void"/>.java中傳遞null值到javascript是沒有任何危險(xiǎn)性的,所以DWR將這個(gè)作為默認(rèn)的converter,所以你自己不用再把這個(gè)converter添加到配置文件的<allow>部分中去.

          基本類型的converter轉(zhuǎn)換int,boolean,double.當(dāng)然還包括對(duì)應(yīng)的對(duì)象形式Integerv,Boolean等等.DWR中在allow預(yù)定義了16個(gè)配置項(xiàng)目分別用于所有基本類型的轉(zhuǎn)換.就象這樣<convert converter="primitive" match="java.lang.Long"/><convert converter="primitive" match="long"/>.

          String類型和Date同樣預(yù)先定義了Converter,這些converter都沒有辦法進(jìn)行改變的,所有的String,Date和數(shù)值類型都統(tǒng)一采用默認(rèn)的converter.

          2.1 Array Converters

          Array的配置項(xiàng)目沒有上面介紹的那么直觀,默認(rèn)情況下DWR裝載所有的基本類型和可裝載的對(duì)象,這些包括String,Date等先前介紹的類型.java高級(jí)程序員可能會(huì)理解為什么match的這行有點(diǎn)奇怪.

          <convert converter="array" match="[Z"/>

          <convert converter="array" match="[B"/>

          <convert converter="array" match="[S"/>

          <convert converter="array" match="[I"/>

          <convert converter="array" match="[J"/>

          <convert converter="array" match="[F"/>

          <convert converter="array" match="[D"/>

          <convert converter="array" match="[C"/>

          <convert converter="array" match="[L*"/>

          *符號(hào)在上面沒有提到,其實(shí)這是個(gè)可以表示任何字符的通配符號(hào).這些數(shù)組可裝載的的類型和其他可裝載的類型是一樣的.

          2.2Bean Converters

          一種不能采用默認(rèn)方式定義的converter就是Bean Converter,這個(gè)是將POJO對(duì)象轉(zhuǎn)換成javascript相關(guān)的數(shù)組,反向也一樣.基于安全因素的考慮這種類型的converter不能采用默認(rèn)的方式實(shí)現(xiàn).

          假設(shè)有個(gè)bean并且通過<create ...>語句設(shè)置成遠(yuǎn)程可用,有種類型的參數(shù)他本身是一個(gè)帶有setterjava bean,setter會(huì)產(chǎn)生嚴(yán)重的隱患.攻擊者可能促使這隱患的發(fā)生.通過下面的語句就可以設(shè)置但個(gè)類的bean converter

          <convert converter="bean" match="your.full.package.BeanName"/>

          要想允許轉(zhuǎn)換指定包或子包下所有類的轉(zhuǎn)換可以按照下面的設(shè)置

          <convert converter="bean" match="your.full.package.*"/>

          很明顯,可以采用下面的方式來轉(zhuǎn)換所有的java bean

          <convert converter="bean" match="*"/>

          2.3 Restricting Property Conversion(指定屬性轉(zhuǎn)換)

          將象用excludeincluce來通知DWR隔離creator的方法一樣,converter也有一個(gè)類似的配置方法.因?yàn)橹付▽傩赞D(zhuǎn)換只有針對(duì)bean才有效(基本類型的轉(zhuǎn)換沒有必要指定屬性),這個(gè)功能只能應(yīng)用與特定的converterBeanConverter和從次類派生的所有類.相關(guān)配置語法如下

          <convert converter="bean" match="com.example.Fred"/>

           <param name="exclude" value="property1, property2"/>

          </convert>

          這樣就可以限定DWR不能調(diào)用Fred對(duì)象的getProperty1()getProperty2()方法,通常這被成為拒絕訪問方式,當(dāng)然你也可以采用下面的方式配置可以訪問的方法(授權(quán)訪問方式)

          <convert converter="bean" match="com.example.Fred"/>

           <param name="include" value="property1, property2"/>

          </convert>

          較好的安全控制大部分都是采用授權(quán)訪問方式.

          2.4 Collection Converters

          DWR最后兩個(gè)默認(rèn)的converterMapsCollections

          <convert converter="collection" match="java.util.Collection"/>

          <convert converter="map" match="java.util.Map"/>

          通常converter是采用遞歸方法轉(zhuǎn)換集合中的所有對(duì)象.

          這里有兩個(gè)地方需要注意:

          僅僅通過反射方法沒有辦法知道集合元素中的類型,所以上面的兩個(gè)converter能將任何集合轉(zhuǎn)換成相對(duì)javascript而言有意義的對(duì)象.然而沒有辦法將不同的集合類類型分別采用不同的轉(zhuǎn)換方法.因?yàn)闆]有辦法完全自動(dòng)進(jìn)行轉(zhuǎn)換,我們可以應(yīng)用dwr.xml文件的special signatures syntax配置部分設(shè)置類型的轉(zhuǎn)換處理過程.

          2.5 DOM Objects

          DWR 自動(dòng)將DOMDOM4JJDOMXOM轉(zhuǎn)換成DOM,前面這幾種類型都僅僅返回Document,Element,Node.DWR會(huì)自動(dòng)將這些轉(zhuǎn)換成瀏覽器DOM對(duì)象.通常在啟動(dòng)JDOM Converter時(shí)會(huì)有一個(gè)提示信息,除非你想采用JDOMconverter否則可以忽略.

          INFO: Missing classdef for converter 'jdom'. Failed to load uk.ltd.getahead.dwr.convert.JDOMConverter. Cause: org/jdom/Document

          因?yàn)?/span>DWR沒有辦法知道你是否采用jdom converter,所以提示信息是info級(jí)別.如果你想采用jdom converter,你必須很清楚地知道jdom converter是否可以被加載.這就是DWR保留上面的提示信息的原因.

          3 The Creators

          DWR共有三種Creator,最簡單的”new”是調(diào)用bean的默認(rèn)構(gòu)造函數(shù)創(chuàng)建實(shí)例.”scripted”允許采用其他腳本語言創(chuàng)建實(shí)例.BeanShell.在遠(yuǎn)程bean的默認(rèn)構(gòu)造函數(shù)不能進(jìn)行進(jìn)一步配置的情況下這種類型的creator比較有用.”Spring”類型允許你通過spring創(chuàng)建實(shí)例.

          下面是關(guān)于creator的參考資料和配置參數(shù)說明.

          Creator

          Parameter

          User

          new

          class

          類的全名稱(包括包路徑)

          scripted

          language

          BSF框架支持的腳本語言名稱(BSFapache項(xiàng)目)

          scripted

          script

          返回遠(yuǎn)程對(duì)象的腳本,腳本可以指定一些屬性,多數(shù)情況下一般只設(shè)置param節(jié)點(diǎn)配置.屬性很少設(shè)置.

          spring

          Location*

          任何以location開頭的參數(shù),每個(gè)參數(shù)都是指定一個(gè)spring的配置文件,在參數(shù)沒有設(shè)置的情況下DWR會(huì)去讀取spring的全局的配置文件.

          spring

          beanName

          從配置文件中讀取的bean的名稱

          “scope參數(shù)允許你配置creator的生命周期,共有以下幾個(gè)選項(xiàng):application,session,request,page.這些參數(shù)對(duì)于用過jspservlet的開發(fā)人員并不陌生.

          3.1 Uing static methods

          如果你想遠(yuǎn)程調(diào)用一個(gè)creator的靜態(tài)方法,并且creatornew類型.因?yàn)檎{(diào)用遠(yuǎn)程bean的方法前DWR不會(huì)檢測將要執(zhí)行的方法是不是靜態(tài)方法,如果是靜態(tài)方法那么creator就不用創(chuàng)建.這種機(jī)制可以適用任何類型的creator,new類型的creator是最簡單配置的.

          3.2 Security

          Creator可以配置類的成員函數(shù)的訪問權(quán)限.creator有授權(quán)訪問(指明可以被訪問的方法)和拒絕訪問(指明不允許訪問的方法)兩種配置方式.

          如果要設(shè)置除了setWibble方法之外的所有方法都不可訪問可以采用下面的設(shè)置.

          <create creator="new" javascript="Fred">

           <param name="class" value="com.example.Fred"/>

           <exclude method="setWibble"/>

          </create>

          如果采用j2ee訪問角色控制的模式

          <create creator="new" javascript="Fred">

           <param name="class" value="com.example.Fred"/>

           <auth method="setWibble" role="admin"/>

          </create>

          3.3 The 'spring' Creator

          3.4 The 'new' Creator

          DWR已經(jīng)默認(rèn)定義了new creator.

          <creator id="new" class="uk.ltd.getahead.dwr.create.NewCreator"/>DWR已經(jīng)將這配置到了內(nèi)置的dwr.xml文件中,并不需要進(jìn)行額外的配置.

          Creator通過調(diào)用類的默認(rèn)的構(gòu)造方法創(chuàng)建實(shí)例.應(yīng)用new creator有以下幾個(gè)優(yōu)點(diǎn):

          Ø 安全性   

          生命周期比較短的creator可以得到更好的安全性,通過不同的應(yīng)用情況設(shè)置適合的生命周期.

          Ø 低內(nèi)存開銷

          在訪問量比較大的情況下,可以不用擔(dān)心發(fā)生內(nèi)存泄露的情況.

          配置一個(gè)creator的創(chuàng)建和遠(yuǎn)程方法調(diào)用設(shè)置:

          <allow>

           <create creator="new" javascript="Blah">

              <param name="class" value="java.util.Date"/>

           </create>

           ...

          </allow>

          上面的配置信息表示將java.util.date提供給客戶端調(diào)用,并且引用名稱是Blash.當(dāng)你在客戶端調(diào)用Blash.toString(reply)時(shí),后臺(tái)將采用java.util.date的默認(rèn)構(gòu)造方法創(chuàng)建一個(gè)實(shí)例.然后調(diào)用實(shí)例的tostring方法.客戶端的javascript將返回給reply對(duì)象(此時(shí)replyjava.util.date的字符串形式)

          3.5 The 'scripted' Creator

          DWR 已經(jīng)默認(rèn)配置了scripted creator配置,

          <creator id="script" class="uk.ltd.getahead.dwr.create.ScriptedCreator"/>這種類型的creator采用BSF執(zhí)行腳本語言并返回bean.例如

          <allow>

           ...

           <create creator="script" javascript="EmailValidator">

              <param name="language" value="beanshell"/>

              <param name="script">

                import org.apache.commons.validator.EmailValidator;

                return EmailValidator.getInstance();

              </param>

           </create>

           ...

          </allow>

          4 Signatures in dwr.xml

          Signatures部分用于配置Collections中裝載對(duì)象元素的類型.舉個(gè)例子來說:下面的java代碼沒有辦法對(duì)List集合中的對(duì)象進(jìn)行轉(zhuǎn)換.

          public class Check

          {

           public void setLotteryResults(List nos)

           {

                ...

           }

          }

          Singatures配置允許我們對(duì)DWR要操作的對(duì)象類型進(jìn)行配置.對(duì)于了解JDK5泛型編程的開發(fā)人員來說下面的格式是很容易理解的.

          <signatures>

           <![CDATA[

           import java.util.List;

           import com.example.Check;

           Check.setLotteryResults(List<Integer> nos);

           ]]>

          </signatures>

          DWR有個(gè)專門用于解析上面配置語句的解析器,雖然上面的是JDK5中才有的特性,因?yàn)橛薪馕銎鞯脑蜻@也可以應(yīng)用與JDK5之前的版本.

          解析規(guī)則是不可見的,但有兩種例外情況.

          一種情況是因?yàn)?/span>DWR1.0的解析器中有個(gè)Bug,在有些場合會(huì)無法處理返回值的類型.所以應(yīng)該要避免這種情況的發(fā)生.

          一種情況是因?yàn)榻馕銎魇且粋€(gè)語法寬松的解析器,他不象編譯器一樣對(duì)語法有非常嚴(yán)格的要求,所有有時(shí)可能一些重要的語句沒有配置而無法事先發(fā)現(xiàn).

          <signatures>

           <![CDATA[

           import java.util.List;

           Check.setLotteryResults(List<Integer>);

           ]]>

          </signatures>

          DWR的將來版本可能會(huì)采用符合java官方規(guī)范的解析器,這樣可以避免許多出錯(cuò)的情況.

          Signature部分只用于泛型參數(shù)到基本類型參數(shù)的轉(zhuǎn)換,對(duì)于其他的類型DWR采用反射機(jī)制或運(yùn)行時(shí)類型來確定.在沒有泛型參數(shù)的情況下可以不配置Signature.

          public void method(String p);

          public void method(String[] p);

          下面的就需要配置,因?yàn)榉瓷錂C(jī)制無法完成次類功能.

          public void method(List<Date> p);

          public void method(Map<String, WibbleBean> p);

          下面可以不用配置,DWR可以自動(dòng)完成轉(zhuǎn)換.

          public void method(List<String> p);

          public void method(Map<String, String> p);

          下面可以不用設(shè)置,DWR可以采用運(yùn)行時(shí)轉(zhuǎn)換.

          public List<Date> method(String p);

          有一個(gè)值得注意的地方是在javascript中所有對(duì)象的keys都是一個(gè)字符串,你也可以把其他對(duì)象作為keys.他們?cè)谑褂弥岸紩?huì)轉(zhuǎn)換成字符串形式.DWR1.x將采用這個(gè)特性來轉(zhuǎn)換成String.以后對(duì)象的轉(zhuǎn)換將會(huì)在服務(wù)器端完成.

          5 Scripting Introduction

          DWR生成的javascript代碼和java代碼很相似并通過dwr.xml配置輸出.相比普通java異步調(diào)用之下,通過ajax生成遠(yuǎn)程接口和java 代碼的最大挑戰(zhàn)是AJAX異步功能.

          DWR通過引入一個(gè)回調(diào)函數(shù),當(dāng)數(shù)據(jù)從服務(wù)返回?cái)?shù)據(jù)是調(diào)用這個(gè)函數(shù)。有兩種推薦的方法使用回調(diào)函數(shù)。一在參數(shù)列表加入回調(diào)功能。二增加調(diào)用元數(shù)據(jù)對(duì)象調(diào)用。

          也可以將回調(diào)的功能放在參數(shù)列表的前頭,但是不建議使用這樣的用法,因?yàn)樵谔幚碜詣?dòng)HTTP對(duì)象時(shí)候會(huì)出現(xiàn)問題。這些方法一般會(huì)保持向后兼容。

          5.1 Simple Callback Functions

          假設(shè)有個(gè)下面的java方法。

          public class Remote

          {

              public String getData(int index) { ... }

          }

          javascript中就可以以下面的方式引用。

          <script type="text/javascript"

              src="[WEBAPP]/dwr/interface/Remote.js"> </script>

          <script type="text/javascript"

              src="[WEBAPP]/dwr/engine.js"> </script>

          ...

          function handleGetData(str)

          {

           alert(str);

          }

          Remote.getData(42, handleGetData);

          “42”只是一個(gè)傳給getdata方法的參數(shù)。當(dāng)然你可以采用下面的寫法。

          Remote.getData(42, function(str) { alert(str); });

          5.2 Call Meta-Data Objects

          另一種使用回調(diào)功能的方法是指定一個(gè)回調(diào)功能選項(xiàng)或其他可選項(xiàng)。上面的例子就變成下面的形式。

          Remote.getData(42, {

           callback:function(str) { alert(str); }

          });

          這個(gè)方法具有以下幾個(gè)優(yōu)點(diǎn):可以依照你的編碼習(xí)慣來編寫程序,更重要的是允許你增加額外的調(diào)用選項(xiàng)。

          5.3 Timeouts and Handling Errors

          除了使用回調(diào)功能你還可以指定超時(shí)時(shí)限和錯(cuò)誤處理方法。例如:

          Remote.getData(42, {

           callback:function(str) { alert(str); },

           timout:5000,

           errorHandler:function(message) { alert("Oops: " + message); }

          });

          5.4 Finding the callback method

          下面有幾個(gè)實(shí)例來說明回調(diào)功能各個(gè)參數(shù)選項(xiàng)的配置,因?yàn)?/span>javascript是不支持函數(shù)重載的。

          Remote.method({ timeout:3 }, { errorHandler:somefunc });

          上面的兩個(gè)參數(shù)一個(gè)是bean的參數(shù)一個(gè)是回調(diào)元數(shù)據(jù)對(duì)象。但是沒有方法去區(qū)別這兩種參數(shù)選項(xiàng)。在拋開特定的瀏覽器環(huán)境,我們假設(shè)null==undefined,所以具有以下規(guī)則:

          一、如果一個(gè)函數(shù)的每個(gè)調(diào)用都是回調(diào)函數(shù),那么他就沒有調(diào)用元數(shù)據(jù)對(duì)象,所有的參數(shù)都是普通java參數(shù)。

          二、如果一個(gè)最后一個(gè)參數(shù)具有一個(gè)回調(diào)功能,那么這個(gè)參數(shù)就是調(diào)用元數(shù)據(jù)對(duì)象。其余的就是普通java參數(shù)。

          三、如果第一個(gè)參數(shù)為null,我們就認(rèn)為沒有回調(diào)功能。其余的就是普通java參數(shù)。此外還要檢查最后一個(gè)參數(shù)是否為null,如果是則會(huì)給予提示信息。

          四、如果最后一個(gè)參數(shù)為null,則沒有回調(diào)功能。

          五、還有一個(gè)不是很好的約定格式,要表示錯(cuò)誤信息。

          6 Engin.js文件

          這個(gè)文件是DWR的引擎文件,他承擔(dān)著把后臺(tái)自動(dòng)生成的javascript接口與前臺(tái)調(diào)用之間的銜接責(zé)任。所以任何使用DWR的地方都需要這個(gè)文件。

          每個(gè)使用DWR的頁面都必須引入這個(gè)文件:

          <script type='text/javascript'

              src='/[YOUR-WEB-APP]/dwr/engine.js'>

          </script>

          6.1 Call Batching

          應(yīng)用批量功能可以一次性調(diào)用多個(gè)遠(yuǎn)程bean方法,因?yàn)樗菍⒍鄠€(gè)調(diào)用做為一次請(qǐng)求,這就減少了與服務(wù)器的交互。可以減少許多的開銷。

          一個(gè)批量方法調(diào)用以DWREngine.beginBatch()開始WREngine.endBatch()結(jié)束。當(dāng)DWREngine.endBatch()被調(diào)用時(shí)就說明開始調(diào)用批量方法,DWR就將這些方法打包在一起作為一次請(qǐng)求發(fā)送給服務(wù)器。

          DWR會(huì)確保所有的方法都回被調(diào)用,所以使用批量功能是要注意是否提交了批量調(diào)用,如果沒有提交批量調(diào)用那么這些需要調(diào)用的方法將永遠(yuǎn)排在調(diào)用隊(duì)列中直到提交批量調(diào)用。

          注意:批量調(diào)用方法會(huì)有一些缺點(diǎn),比如他不能在那些已經(jīng)幫定在一起的方法調(diào)用順序不能保證同步。

          例如所有的調(diào)用元數(shù)據(jù)對(duì)象的接管函數(shù),超時(shí)設(shè)定,錯(cuò)誤處理等的調(diào)用都是在批量的級(jí)別上,而不是在調(diào)用的級(jí)別上。如果一個(gè)批量調(diào)用含有兩個(gè)不同超時(shí)時(shí)間設(shè)定的方法,那么除了最后一個(gè)之外的所有其他方法的超時(shí)設(shè)定都被忽略。

          6.2 Call Ordering

          因?yàn)?/span>AJAX是個(gè)普通的異步遠(yuǎn)程方法調(diào)用模式,所以遠(yuǎn)程調(diào)用的返回結(jié)果的順序可能和你發(fā)送請(qǐng)求的順序不一致。DWREngine.setOrdered(boolean)方法允許你設(shè)置遠(yuǎn)程調(diào)用返回結(jié)果的順序和你發(fā)送調(diào)用請(qǐng)求的順序保持一致。DWR是通過一個(gè)遠(yuǎn)程方法調(diào)用已經(jīng)結(jié)束后在發(fā)送下一個(gè)調(diào)用請(qǐng)求來實(shí)現(xiàn)這個(gè)功能的。

          一般情況我們并不需要返回結(jié)果順序和發(fā)送請(qǐng)求順序保持一致。DWR默認(rèn)是不保持一致的。

          提示:因?yàn)楸3稚厦娴捻樞驎?huì)對(duì)應(yīng)用程序的性能和響應(yīng)時(shí)間,如果其中的一個(gè)消息發(fā)生丟失那么瀏覽器可能會(huì)有意想不到以外情況發(fā)生。在使用這個(gè)功能的時(shí)候必須認(rèn)真考慮是否真的有必要使用。通常比較好的方法是使用異步模式調(diào)用。

          6.3 Handling Errors and Warnings

          對(duì)于一些服務(wù)器端發(fā)生的錯(cuò)誤或警告情況DWR都回調(diào)用默認(rèn)的錯(cuò)誤和警告方法并且傳遞一個(gè)相關(guān)信息,通常這些發(fā)生的錯(cuò)誤和異常對(duì)于用戶來說是不可見的。

          下面這個(gè)方法主要用于以消息框的方式或者在狀態(tài)欄里顯示一個(gè)錯(cuò)誤或警告的消息。

          要改變錯(cuò)誤的處理方法可以使用這個(gè)方法:DWREngine.setErrorHandler(function),

          改變警告的處理方法可以使用這個(gè)方法:DWREngine.setWarningHandler(function).

          6.4 Remoting Hooks

          參考 DWREngine.setPreHook(function) and DWREngine.setPostHook(function).

          如果你想在執(zhí)行遠(yuǎn)程方法調(diào)用之前或之后進(jìn)行一些處理的話,你可以使用上面的兩個(gè)方法。上面參數(shù)中設(shè)置的目標(biāo)方法必須是沒有參數(shù)的。如果你想限制特定的組件在一次方法調(diào)用沒有結(jié)束之前不允許再次調(diào)用,那么使用上面的方法將很有用。

          Post 執(zhí)行Hooks通常是設(shè)置pre-hooks,一般用來撤消先前的操作。關(guān)于Hooks的例子可以參照;DWRUtil.useLoadingMessage() 函數(shù)。

          6.5 Remoting Options(遠(yuǎn)程調(diào)用設(shè)置)

          關(guān)于DWR處理遠(yuǎn)程調(diào)用有若干個(gè)設(shè)置選項(xiàng),MethodVerbs對(duì)于用戶來說是透明的,但對(duì)于不同的瀏覽器可能會(huì)有影響。通常DWR會(huì)選擇正確的方法處理,如果想饒過某些瀏覽器產(chǎn)生的影響這些參數(shù)設(shè)置將非常有用。

          DWREngine.setMethod(newmethod)

          設(shè)置Method的實(shí)際執(zhí)行方法,但被設(shè)置的方法不能確保被調(diào)用。只是DWR首先會(huì)嘗試調(diào)用這個(gè)方法。newmethod 必須是DWREngine.XMLHttpRequest 或著 DWREngine.IFrame.

          DWREngine.setVerb(verb)

          允許設(shè)置iframe XMLHttpRequest提交數(shù)據(jù)時(shí)的方式,必須是POST或者GET,如果瀏覽器不支持POST形式,DWR會(huì)自動(dòng)切換到GET方式。


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 洛扎县| 朝阳市| 鲁甸县| 松溪县| 石泉县| 乌拉特中旗| 望城县| 镶黄旗| 桂平市| 宁强县| 阿城市| 高阳县| 鹤峰县| 博野县| 满城县| 桃园县| 彭阳县| 栾城县| 梁河县| 龙南县| 乐清市| 高邑县| 宜章县| 万安县| 广河县| 青田县| 晋江市| 米脂县| 沧州市| 和田县| 上高县| 景洪市| 搜索| 宁安市| 河池市| 巴南区| 遵义县| 泽库县| 车险| 大厂| 凤冈县|