posts - 30, comments - 5, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          對于DWR的簡單總結(jié)

          Posted on 2010-05-04 11:39 無所謂 閱讀(188) 評論(0)  編輯  收藏 所屬分類: DWR

          這兩天學(xué)了下DWR,現(xiàn)在總結(jié)一下。
          DWR是方便使用AJAX連接JS和JAVA的的一個(gè)框架,把服務(wù)器端 Java 對象的方法公開給 JavaScript 代碼。
          如果是用dwr2.0的jar包,還需要同時(shí)導(dǎo)入log4j.jar和commons-loggin.jar,勿忘!!

          web.xml和dwr.xml放在WEB-INF下!
          -----------------------------
          配置web.xml:WEB工程啟動(dòng)的時(shí)候會(huì)在這個(gè)里面找到具體所用到的類的路徑,由此進(jìn)行加載

           

          <servlet>
              
          <servlet-name> dwr-invoke </servlet-name>
              
          <servlet-class> uk.ltd.getahead.dwr.DWRServlet </servlet>
              
          <init-param> //這個(gè)是調(diào)試用,如果正式發(fā)布請?jiān)摓閒alse,不過聽說2.0就默認(rèn)為true了
                 
          <param-name> debug </param-value>
                 
          <param-value> true </param-value>
              
          </init-param>
              
          <init-param> //這個(gè)是DWR2.0必須的,不然會(huì)報(bào)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中的哪些方法你需要暴露給前臺使用,當(dāng)DWR啟動(dòng)時(shí)候根據(jù)dwr.xml這個(gè)文件把java類中的方法轉(zhuǎn)成js中可用的類中方法,使前臺可以使用。

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


           

          <dwr>
              
          <allow>
                 
          <create creator="new" javascript="***js調(diào)用的class***" class="***java里暴露的class,必須寫完整路徑***">
                     
          <include method="***java暴露類里要公開的方法,如果不寫默認(rèn)全部公開***" />
                 
          </create>
              
          </allow>
          </dwr>

           

          -----------------------------
          在html或js頁面中加入

          <script src="<%=basePath %>dwr/interface/java里暴露的class"></script>  //切記不能<script *** />這樣寫
          <script src="<%=basePath %>dwr/engine.js"></script>   //Dwr的腳本驅(qū)動(dòng)Js,以上兩個(gè)必寫
          <script src="<%=basePath %>dwr/util.js"></script>   //這是個(gè)工具包,可以不調(diào)用
          <script type="text/javascript">
              
          function doMethod()
              {
                  
          //調(diào)用方法:若公開的類是AAA,公開的AAA里的方法是bbb([參數(shù)]);
                  AAA.bbb([參數(shù)],callBack);//回調(diào)函數(shù)callBack()
              }

              
          function callBack(data)//data是后臺返回的值,名字自取,也可省略,因?yàn)镴S允許
              {
                 處理方法……;
          //如果callBack()沒有寫明返回值,可以通過argments[0]拿到
              }
          </script>

           


          其實(shí)我們調(diào)用AAA.bbb([參數(shù)],callBack);就是做了以下這一步:
          (下面紅字是包裝好的,不在前臺,所以即使你沒有創(chuàng)建html或者jsp來調(diào)用,也可以通過localhost:8080/工程名/dwr 來看到你暴露的java類進(jìn)行測試)
           

             function AAA() { };
              AAA.bbb 
          = function([參數(shù)], callback) 
              { 
                  DWREngine._execute('
          /dwr/dwr', 'AAA', 'bbb', [參數(shù)], callback); 
              }

           

          通過在dwr.xml暴露的方法得到j(luò)s里的方法,當(dāng)我們調(diào)用AAA.bbb時(shí)候再通過/dwr/dwr轉(zhuǎn)到DWRServlet中去用JAVA里的AAA.bbb方法,然后返回值到callback中(中間經(jīng)過dwr.xml的convert)


          ----------------------------
          上面對dwr的工作大致分析了下,現(xiàn)在對于參數(shù)類型的不同,對dwr.xml也要進(jìn)行修正。

          DWR自動(dòng)地在Java和JavaScript表示之間調(diào)整簡單數(shù)據(jù)類型,這些類型包括Java原生類型和它們各自的封裝類表示,還有String、Date、數(shù)組和集合類型。但如果參數(shù)類型非簡單數(shù)據(jù)類型,則要通過轉(zhuǎn)換。

          調(diào)用返回JavaBean的java方法


          在dwr.xml的<allow>標(biāo)簽中加入

           

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

           

          <creator>標(biāo)簽負(fù)責(zé)公開用于Web遠(yuǎn)程的類和類的方法,<convertor>標(biāo)簽則負(fù)責(zé)這些方法的參數(shù)和返回類型。convert元素的作用是告訴DWR在服務(wù)器端Java 對象表示和序列化的JavaScript之間如何轉(zhuǎn)換數(shù)據(jù)類型。

          這樣在js端回調(diào)函數(shù)直接拿到的data就是一個(gè)javabean,可以直接通過data.xxx拿到bean的屬性xxx。

           

          調(diào)用有JavaBean參數(shù)的java方法


          dwr.xml配置同上。

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

           

          調(diào)用返回List、Set或者M(jìn)ap的java方法


          dwr.xml配置同上。如果Collection里的數(shù)據(jù)是簡單數(shù)據(jù)類型,則可不需要寫<convert>

          在JS端,以List,里面數(shù)據(jù)是bean為例,data是一個(gè)List型,只要用for循環(huán)就可以依次拿到數(shù)據(jù)。
          遍歷方法1:

          for(var i=0;i<data.length;i++)  
              
          /*對于java方法的返回值為List(Set)的情況,DWR將其轉(zhuǎn)                                 化為Object數(shù)組,傳遞個(gè)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多了一個(gè)遍歷而已。

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

           

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

           

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

           

          調(diào)用有List、Set或者M(jìn)ap參數(shù)的java方法


          在dwr.xml的<dwr>標(biāo)簽內(nèi)加入:<signatures>標(biāo)簽。

          <signatures>標(biāo)簽是用來聲明java方法中List、Set或者M(jìn)ap參數(shù)所包含的確切類,以便java代碼作出判斷,是js-->java的。


          例參數(shù)是javabean的List,則只要在參數(shù)為javabean的例子里構(gòu)造時(shí)候加上[]即可,如下:

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

          并且在dwr.xml中增加如下的配置段(剛才試驗(yàn)了下,不加也可以)

           

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

           

          例參數(shù)是javabean的Map,key是String,value是javabean,如下:

           

          var stu =

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

          AAA.bbb(stu,callBack); 


          并且在dwr.xml中增加如下的配置段(剛才試驗(yàn)了下,不加也可以)

           

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

           

           

           


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 石柱| 崇义县| 黄骅市| 蕉岭县| 娄底市| 连江县| 蓬溪县| 土默特右旗| 神池县| 西充县| 华阴市| 肃宁县| 磐石市| 长乐市| 广宁县| 龙川县| 邵武市| 上蔡县| 深圳市| 湘阴县| 新干县| 宁强县| 天柱县| 信宜市| 昌都县| 瑞丽市| 社旗县| 绍兴县| 科尔| 六枝特区| 东港市| 大渡口区| 于都县| 柳州市| 山西省| 马山县| 格尔木市| 通河县| 班玛县| 和林格尔县| 阳信县|