【AJAX】DWR使用總結

來源:互聯網
上載者:User

這兩天學了下DWR,現在總結一下。
DWR是方便使用AJAX串連JS和JAVA的的一個架構,把伺服器端 Java 對象的方法公開給JavaScript 代碼。
如果是用dwr2.0的jar包,還需要同時匯入log4j.jar和commons-loggin.jar,勿忘!!
web.xml和dwr.xml放在WEB-INF下!
-----------------------------
配置web.xml:WEB工程啟動的時候會在這個裡面找到具體所用到的類的路徑,由此進行載入

<servlet>
    <servlet-name> dwr-invoke </servlet-name>
    <servlet-class> uk.ltd.getahead.dwr.DWRServlet </servlet>
    <init-param> //這個是調試用,如果正式發布請該為false,不過聽說2.0就預設為true了
       <param-name> debug </param-value>
       <param-value> true </param-value>
    </init-param>
    <init-param> //這個是DWR2.0必須的,不然會報java.lang.IllegalArgumentException
       <param-name> classes </param-value>
       <param-value> java.lang.Object </param-value>
</servlet>

<servlet-mapping>
    <servlet-name> dwr-invoke </servlet-name>
    <url-pattern> /dwr/* </url-pattern>
</servlet-mapping>

-----------------------------
配置dwr.xml: dwr.xml的作用是讓你告訴DWR哪些class中的哪些方法你需要暴露給前台使用,當DWR啟動時候根據dwr.xml這個檔案把java類中的方法轉成js中可用的類中方法,使前台可以使用。

注:以下是不全按dwr2.0寫的,如果用的是DWR2.0,那java裡暴露類(藍字顯示)不能寫在<create>屬性裡,應刪除後寫在<include method="" />前,<param name="class" value="***java裡暴露的class,必須寫完整路徑***" />。

<dwr>
    <allow>
       <create creator="new" javascript="***js調用的class***"class="***java裡暴露的class,必須寫完整路徑***">
           <include method="***java暴露類裡要公開的方法,如果不寫預設全部公開***" />
       </create>
    </allow>
</dwr>

-----------------------------
在html或js頁面中加入
<script src="<%=basePath %>dwr/interface/java裡暴露的class"></script>  //切記不能<script *** />這樣寫
<script src="<%=basePath %>dwr/engine.js"></script>   //Dwr的指令碼驅動Js,以上兩個必寫
<script src="<%=basePath %>dwr/util.js"></script>   //這是個工具包,可以不調用
<script type="text/javascript">
    function doMethod()
    {
        //調用方法:若公開的類是AAA,公開的AAA裡的方法是bbb([參數]);
        AAA.bbb([參數],callBack);//回呼函數callBack()
    }

    function callBack(data)//data是後台返回的值,名字自取,也可省略,因為JS允許
    {
       處理方法……;//如果callBack()沒有寫明傳回值,可以通過argments[0]拿到
    }
</script>

其實我們調用AAA.bbb([參數],callBack);就是做了以下這一步:
(下面紅字是封裝好的,不在前台,所以即使你沒有建立html或者jsp來調用,也可以通過localhost:8080/工程名/dwr 來看到你暴露的java類進行測試)
    function AAA() { };
    AAA.bbb = function([參數], callback) 
    { 
        DWREngine._execute('/dwr/dwr', 'AAA', 'bbb', [參數], callback); 
    }

通過在dwr.xml暴露的方法得到js裡的方法,當我們調用AAA.bbb時候再通過/dwr/dwr轉到DWRServlet中去用JAVA裡的AAA.bbb方法,然後傳回值到callback中(中間經過dwr.xml的convert)

----------------------------
上面對dwr的工作大致分析了下,現在對於參數類型的不同,對dwr.xml也要進行修正。

DWR自動地在Java和JavaScript表示之間調整單一資料型別,這些類型包括Java原生類型和它們各自的封裝類表示,還有String、Date、數組和集合類型。但如果參數類型非單一資料型別,則要通過轉換。

調用返回JavaBeanjava方法

在dwr.xml的<allow>標籤中加入

<convert converter="bean" match="***一般來說是javabean***">  //int,String,list等不需要顯式的轉換就可以被js拿到
     <param name="include" value="***javabean中的屬性,用','隔開***" />  //這句可以不寫
</convert>

<creator>標籤負責公開用於Web遠端類和類的方法,<convertor>標籤則負責這些方法的參數和傳回型別。convert元素的作用是告訴DWR在伺服器端Java 對象表示和序列化的JavaScript之間如何轉換資料類型。

這樣在js端回呼函數直接拿到的data就是一個javabean,可以直接通過data.xxx拿到bean的屬性xxx。

調用有JavaBean參數java方法

dwr.xml配置同上。

在JS端,把要傳入的參數寫成javabean方式,例:要傳入一個名為student的javabean,參數有name,password,則
var stu = {name:"zhangsan",password:"zspassword"}; //這是json的表示方法
AAA.bbb(stu,callBack);

調用返回ListSet或者Mapjava方法

dwr.xml配置同上。如果Collection裡的資料是單一資料型別,則可不需要寫<convert>

在JS端,以List,裡面資料是bean為例,data是一個List型,只要用for迴圈就可以依次拿到資料。
遍曆方法1:
for(var i=0;i<data.length;i++)  
    /*對於java方法的傳回值為List(Set)的情況,DWR將其轉                                 化為Object數組,傳遞個javascript*/
{
    alert(data[i].name+":"+data[i].password);
}

遍曆方法2:
for(var property in data) //property為序號,從0開始
{
    var bean = data[property];
    alert(bean.name+":"+bean.password);
}

相比返回為javabean多了一個遍曆而已。

如果java方法的傳回值為Map,則如下

for(var property in data) //property為key值
    /*對於 java方法的傳回值為Map的情況,DWR將其轉化為一個Object,
     其中Object的屬性為原Map的key值,屬性值為原Map相應的 value值*/
{
  var bean = data[property];
  alert(bean.username);
  alert(bean.password);
}

如果知道key值,則可直接用:data.key拿到value

調用有ListSet或者Map參數的java方法

在dwr.xml的<dwr>標籤內加入:<signatures>標籤。

<signatures>標籤是用來聲明java方法中List、Set或者Map參數所包含的確切類,以便java代碼作出判斷,是js-->java的。

例參數是javabean的List,則只要在參數為javabean的例子裡構造時候加上[]即可,如下:

var stu = [{name:"zhangsan",password:"zspassword"},{name:"lisi",password:"lspassword"}];
//把List當作數組來處理
AAA.bbb(stu,callBack);

並且在dwr.xml中增加如下的配置段(剛才實驗了下,不加也可以)

<signatures>
 <![CDATA[
  import java.util.List;
  import com.dwr.AAA;     //AAA的包路徑要寫完整
  import com.dwr.TestBean;  //javabean
  AAA.bbb(List<TestBean>); 
 ]]>
</signatures>

例參數是javabean的Map,key是String,value是javabean,如下:
var stu =

{
    "key1":{name:"zhangsan",password:"zspassword"},
    "key2":{name:"lisi",password:"lspassword"}
};

AAA.bbb(stu,callBack);

 

並且在dwr.xml中增加如下的配置段(剛才實驗了下,不加也可以)

<signatures>
 <![CDATA[
  import java.util.List;
  import com.dwr.AAA;     //AAA的包路徑要寫完整
  import com.dwr.TestBean;  //javabean
  AAA.bbb(Map<String,TestBean>); 
 ]]>
</signatures>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.