webwork 2.2 中如何给Collection赋值

原本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等工作起来:

下面简单介绍一下:
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的集中基本访问方式:#、%{}、${}

以上内容,错漏难免。因为今天终于可以偷闲,赶紧结绳记之。欢迎大家讨论更简便的方法。

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.