Tin's Blog

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 221 評論 :: 0 Trackbacks

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

          但是已經是2004年11月的文章了,在webwork 2.2 b4中,XWorkList和XWorkMap已經是deprecated狀態了,當時我就一頭霧水,也沒找到什么好的線索。
          去java.net下載了XWork的最新代碼,看到了其中的注釋,說這個工作已經可以自動完成了。
          又幾經周折,才算搞明白先在如何讓List、Map等工作起來,給予2.2 b4和b5工作正常:

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

          public class testAction extends ActionSupport 
                  
          private Collection smoeAttrs = null;//(使用webwork自動負值,應有對應getter和setter) 
                  private IDeptJgzTjkEcoAttDAO ecoAttDAO = null;//(改DAO使用Spring注入,應有相應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; 
                      }
           
          }

          對應一個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; 

                  
          /* 
                          
                          對應的getter和setter 
                  
          */
           
          }

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

          如此配置后,自動設置值的時候就可以知道你的pojo的類型了,很干凈。

          下面一小段由于我接觸Webwork不久,所以是個很初級的經驗,如果需要則自取:
          回憶moxie帖子中的重要的部分,在post到相應action的頁面的form中,input要遵循這樣的命名:
          對應剛才所說的那個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>

          如何輸出?很簡單,在列表頁中: 

          <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>


          即可以,因為iteratror這個tag支持iteratroStatus這個東西,用它可以獲取index、isOdd等信息,很方便。

          配合

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

          則很容易的實現對Collection的CRUD。正好用到了ONGL的集中基本訪問方式:#、%{}、${}

          以上內容,錯漏難免。因為今天終于可以偷閑,趕緊結繩記之。歡迎大家討論更簡便的方法。

           

          posted on 2006-02-16 21:19 Tin 閱讀(3103) 評論(9)  編輯  收藏 所屬分類: Webwork相關

          評論

          # re: webwork 2.2 中如何給Collection賦值 2006-02-16 23:44 李李
          給你補充一點,-conversion.properties設定不局限于webwork action,支持任意pojo,意味著可以支持無限層次的Collection自動賦值,如:
          root.one[0].two[0].three[0]
          root.one[0].two[0].three[1]
          ...
          root.one[n].two[n].three[n]
            回復  更多評論
            

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

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

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

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

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

          然后頁面里寫 user.address[0].street

          properties: 寫Element_user.address = org.fish.ww2.model.Address

          這樣也沒取到值?  回復  更多評論
            

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

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

          <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里除了第一個對象的name正確賦值之外,剩下兩個都是null,而produceArea賦值正確. 真是好奇怪

          還有,關于攔截器,如果我在xwork.xml只引用"param"時,list中什么都沒有.  回復  更多評論
            

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

          主站蜘蛛池模板: 江阴市| 海林市| 麻栗坡县| 梓潼县| 太谷县| 沭阳县| 集安市| 桐乡市| 乡宁县| 杂多县| 白沙| 普格县| 临安市| 大埔区| 太康县| 常熟市| 荥经县| 赤峰市| 资溪县| 昂仁县| 合肥市| 临澧县| 陕西省| 京山县| 彭山县| 砚山县| 保亭| 襄垣县| 沙河市| 沭阳县| 禹城市| 廉江市| 神农架林区| 托克逊县| 沙河市| 达日县| 枝江市| 天气| 和平县| 漠河县| 都匀市|