posts - 0,  comments - 17,  trackbacks - 0
          這兩天學了下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>

          posted on 2008-03-04 22:29 xyz 閱讀(453) 評論(0)  編輯  收藏 所屬分類: 網絡文摘

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          留言簿

          隨筆檔案(1)

          文章分類(44)

          文章檔案(46)

          收藏夾(1)

          Adobe

          AOP

          API

          appServer

          BI

          c

          • c-free
          • codeblocks
          • codelite
          • CodeLite IDE 是一個強大的開源,跨平臺的 C/C++整合開發環境. 支持包括 Windows、Linux 和 Mac 系統下運行
          • codelite官網
          • dev-c++
          • Dev-C++是一個C&C++開發工具,它是一款自由軟件,遵守GPL協議。
          • GCC
          • GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本只能處理 C語言。GCC 很快地擴展,變得可處理 C++。之后也變得可處理 Fortran、Pascal、Objective-C、Java, 以及 Ada 與其他語言。

          Cache

          CMS

          DB

          eclipse

          FreeMarker

          hibernate

          html5

          ibatis

          java

          jquery

          js

          json

          Linux

          Log

          mail server

          mobile

          mysql

          oauth

          openID

          other

          PHP

          portal

          report

          Scheduler

          schema

          Security

          SOA

          spring

          struts

          UI原型設計

          w3c

          Wap

          webservice

          xml

          供應鏈管理

          博客鏈接

          好網站

          工作流

          開源網

          招聘

          插件下載

          操作系統

          構建可伸縮的系統

          構建工具

          測試

          • IETest
          • IE官網
          • OpenSTA
          • Siege
          • Siege是一個壓力測試和評測工具,設計用于WEB開發這評估應用在壓力下的承受能力

          游戲

          源碼托管

          經營

          資源

          金融/財務

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 普兰县| 新绛县| 安龙县| 永宁县| 庄河市| 泽库县| 蛟河市| 翁源县| 岳普湖县| 绥中县| 象州县| 易门县| 庄浪县| 阿巴嘎旗| 涟水县| 江源县| 牙克石市| 张北县| 萨迦县| 犍为县| 瑞安市| 时尚| 武山县| 揭阳市| 南宁市| 新绛县| 荔波县| 平湖市| 桐梓县| 敖汉旗| 高州市| 盐池县| 阜新市| 安宁市| 寻甸| 越西县| 景泰县| 沙雅县| 齐齐哈尔市| 新野县| 东安县|