Tin's Blog

          You are coming a long way, baby~Thinking, feeling, memory...

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 221 評(píng)論 :: 0 Trackbacks

          原本javaeye有這么一篇帖子“在WebWork2 Action中如何自動(dòng)設(shè)置Array、List、Map”,是moxie大哥寫(xiě)的。
          http://forum.javaeye.com/viewtopic.php?t=8770

          但是已經(jīng)是2004年11月的文章了,在webwork 2.2 b4中,XWorkList和XWorkMap已經(jīng)是deprecated狀態(tài)了,當(dāng)時(shí)我就一頭霧水,也沒(méi)找到什么好的線索。
          去java.net下載了XWork的最新代碼,看到了其中的注釋?zhuān)f(shuō)這個(gè)工作已經(jīng)可以自動(dòng)完成了。
          又幾經(jīng)周折,才算搞明白先在如何讓List、Map等工作起來(lái),給予2.2 b4和b5工作正常:

          下面簡(jiǎn)單介紹一下:
          1、如果要將值映射到pojo的collection,則需要使用conversion功能。
          如我又一個(gè)Action,叫testAction:

          public class testAction extends ActionSupport 
                  
          private Collection smoeAttrs = null;//(使用webwork自動(dòng)負(fù)值,應(yīng)有對(duì)應(yīng)getter和setter) 
                  private IDeptJgzTjkEcoAttDAO ecoAttDAO = null;//(改DAO使用Spring注入,應(yīng)有相應(yīng)setter) 

                      
          public String execute() throws Exception 
                          
          if (log.isDebugEnabled()) 
                                  log.debug(
          "performing execute() method!"); 
                          }
           
                          
                          
          //持久化collection里面的pojo 
                          for (Iterator iterator = smoeAttrs.iterator(); iterator.hasNext();) 
                                      SomeAttr someAttr 
          = (SomeAttr) iterator.next(); 
                                      ecoAttDAO.saveOrUpdate(someAttr, someAttr.getId()); 
                          }
           
                          
                                 
          return Action.SUCCESS; 
                      }
           
          }

          對(duì)應(yīng)一個(gè)pojo:

          package org.tin.test; 

          public class SomeAttr implements Serializable 

                  
          /** The composite primary key value. */ 
                  
          private java.lang.Long id; 

                  
          private java.lang.Float fild1; 
                  
          private java.lang.String fild2; 
                  
          private java.util.Date fild3; 

                  
          /* 
                          
                          對(duì)應(yīng)的getter和setter 
                  
          */
           
          }

          可以看到,上面的Action聲明的時(shí)候沒(méi)有任何涉及到XWorkList的地方(moxie介紹的那種風(fēng)格),也就是說(shuō)現(xiàn)在webwork并不知道Collection里面放的pojo的類(lèi)型。這就是Webwork目前的高明之處,這樣的代碼非常干凈。但是如果要自動(dòng)設(shè)定Collection的值,訪問(wèn)到這些Pojo,則一定要知道Pojo的類(lèi)型,Webwork如何做呢?
          通過(guò)-conversion配置。
          需要在對(duì)應(yīng)該才那個(gè)testAction.java的相同目錄寫(xiě)一個(gè)testAction-conversion.properties文件(格式就是Action名字+“-conversion.properties”)。
          文件里面注明:
          Element_someAttrs = org.tin.test.SomeAttr (以前版本曾經(jīng)用過(guò)Collection、Map分開(kāi),但是現(xiàn)在不管什么類(lèi)型,都用Element)
          格式就是“Element_”+Action中Collection的名字+“=”+你的pojo的完整類(lèi)名

          如此配置后,自動(dòng)設(shè)置值的時(shí)候就可以知道你的pojo的類(lèi)型了,很干凈。

          下面一小段由于我接觸Webwork不久,所以是個(gè)很初級(jí)的經(jīng)驗(yàn),如果需要?jiǎng)t自取:
          回憶moxie帖子中的重要的部分,在post到相應(yīng)action的頁(yè)面的form中,input要遵循這樣的命名:
          對(duì)應(yīng)剛才所說(shuō)的那個(gè)pojo:

          <form> 
                  
          <input  name="someAttrs[0].fild1" value="45555.6" id="xxx11" /> 
                  
          <input  name="someAttrs[0].fild2" value="test" id="xxx12" /> 
                  
          <input  name="someAttrs[0].fild3" value="2006-01-05" id="xxx13" /> 
                  
          <input  name="someAttrs[1].fild1" value="45555.6" id="xxx21" /> 
                  
          <input  name="someAttrs[1].fild2" value="test" id="xxx22" /> 
                  
          <input  name="someAttrs[1].fild3" value="2006-01-05" id="xxx23" /> 
                  
          <input  name="someAttrs[2].fild1" value="45555.6" id="xxx31" /> 
                  
          <input  name="someAttrs[2].fild2" value="test" id="xxx32" /> 
                  
          <input  name="someAttrs[2].fild3" value="2006-01-05" id="xxx33" /> 
          </form>

          如何輸出?很簡(jiǎn)單,在列表頁(yè)中: 

          <ww:iterator value="someAttrs" status="someAttrsIter"> 
          <tr> 
                  
          <td> 
                          
          <ww:hidden name="someAttrs[%{#someAttrsIter.index}].id" value="%{id}"/> 
                          
          <ww:textfield name="someAttrs[%{#someAttrsIter.index}].fild1" value="%{fild1}"/></td> 
                  
          <td><ww:textfield name="someAttrs[%{#someAttrsIter.index}].fild2 value="%{fild2}"/></td> 
                  
          <td><ww:textfield name="someAttrs[%{#someAttrsIter.index}].fild3" value="%{fild3}"/></td> 
          </tr> 
          </ww:iterator>


          即可以,因?yàn)閕teratror這個(gè)tag支持iteratroStatus這個(gè)東西,用它可以獲取index、isOdd等信息,很方便。

          配合

          <action name="saveAction" class="testAction"> 
                  
          <result name="success" type="redirect">/loadByInf.action?id=${someAttrOwner.id}</result> 
          </action>

          則很容易的實(shí)現(xiàn)對(duì)Collection的CRUD。正好用到了ONGL的集中基本訪問(wèn)方式:#、%{}、${}

          以上內(nèi)容,錯(cuò)漏難免。因?yàn)榻裉旖K于可以偷閑,趕緊結(jié)繩記之。歡迎大家討論更簡(jiǎn)便的方法。

           

          posted on 2006-02-16 21:19 Tin 閱讀(3115) 評(píng)論(9)  編輯  收藏 所屬分類(lèi): Webwork相關(guān)

          評(píng)論

          # re: webwork 2.2 中如何給Collection賦值 2006-02-16 23:44 李李
          給你補(bǔ)充一點(diǎn),-conversion.properties設(shè)定不局限于webwork action,支持任意pojo,意味著可以支持無(wú)限層次的Collection自動(dòng)賦值,如:
          root.one[0].two[0].three[0]
          root.one[0].two[0].three[1]
          ...
          root.one[n].two[n].three[n]
            回復(fù)  更多評(píng)論
            

          # re: webwork 2.2 中如何給Collection賦值 2006-02-17 08:38 Tin
          @李李
          謝謝。對(duì)pojo的conversion.properties應(yīng)該存放在哪個(gè)目錄對(duì)應(yīng)呢?
          如果pojo和action都支持conversion真得很方便。  回復(fù)  更多評(píng)論
            

          # re: webwork 2.2 中如何給Collection賦值 2006-02-17 10:44 李李
          pojo的package下。
          classname-conversion.properties  回復(fù)  更多評(píng)論
            

          # re: webwork 2.2 中如何給Collection賦值 2006-08-07 12:04 lxl
          @李李
          pojo的package下。
          classname-conversion.properties
          ————————————————
          那么里面的內(nèi)容如何寫(xiě)呢,我要訪問(wèn)action.first.items里面的bean,可是不知道該怎么寫(xiě)配置文件  回復(fù)  更多評(píng)論
            

          # re: webwork 2.2 中如何給Collection賦值 2006-09-09 16:48 coolfish
          你這個(gè)例子用的攔截器是哪個(gè)?defaultStack?我的怎么必須用到workflow那個(gè)攔截器才行啊?
            回復(fù)  更多評(píng)論
            

          # re: webwork 2.2 中如何給Collection賦值 2006-09-09 16:52 coolfish
          還有我試了試: user---->多個(gè)Address

          然后頁(yè)面里寫(xiě) user.address[0].street

          properties: 寫(xiě)Element_user.address = org.fish.ww2.model.Address

          這樣也沒(méi)取到值?  回復(fù)  更多評(píng)論
            

          # re: webwork 2.2 中如何給Collection賦值 2006-09-10 22:30 Tin
          這個(gè)和攔截器沒(méi)有關(guān)系,是XWork的內(nèi)置功能。你可以看看Type Conversion的文檔。如果不行你先看看你所使用的Webwork的版本,Element_xxx這個(gè)語(yǔ)法好像是從2.2.1開(kāi)始支持的。  回復(fù)  更多評(píng)論
            

          # re: webwork 2.2 中如何給Collection賦值 2006-09-11 08:52 coolfish007
          我用的是2.2.2這個(gè)版本,如果不用Elemnt_時(shí)webwork會(huì)在log里警告老的用法過(guò)時(shí).現(xiàn)在頁(yè)面的對(duì)象可以填充到collection中了,但就是從collection中第二個(gè)對(duì)象開(kāi)始一些field的值為null(而頁(yè)面是寫(xiě)了值的)比如頁(yè)面上:

          <input name="fruites[0].nameD" value="apple" id="c1">Apple
          <input name="fruites[0].produceArea" value="CN" id="c12">Apple
          <input name="friutes[1].nameD" value="orangle" id="c2">Orangle
          <input name="fruites[1].produceArea" value="USA" id="c22">Apple
          <input name="friutes[2].nameD" value="banana" id="c3">Orangle
          <input name="fruites[2].produceArea" value="UK" id="c32">Apple


          Action中引用的private List fruites;
          List里除了第一個(gè)對(duì)象的name正確賦值之外,剩下兩個(gè)都是null,而produceArea賦值正確. 真是好奇怪

          還有,關(guān)于攔截器,如果我在xwork.xml只引用"param"時(shí),list中什么都沒(méi)有.  回復(fù)  更多評(píng)論
            

          # re: webwork 2.2 中如何給Collection賦值 2006-09-11 09:48 coolfish007
          現(xiàn)在可以了,我把頁(yè)面上的<input ...>換成<ww:textfield label="%{getText('Apple')}" name="fruites[0].nameD" value="apple"/>這種就可以了,所有值都正確填充了.  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 临桂县| 宣武区| 杂多县| 永泰县| 林口县| 兴化市| 安新县| 丰都县| 绥滨县| 镇江市| 富平县| 深泽县| 阿拉善右旗| 牡丹江市| 金门县| 盐亭县| 沐川县| 治县。| 大埔区| 嘉义县| 达州市| 屏南县| 潞城市| 天峻县| 茶陵县| 红桥区| 子洲县| 余姚市| 林口县| 遂溪县| 安国市| 东安县| 天祝| 松阳县| 丘北县| 涞水县| 土默特左旗| 巴青县| 贵德县| 澳门| 朝阳区|