webwork 2.2 中如何给Collection赋值

原本javaeye有这么一篇帖子“在WebWork2 Action中如何自动设置Array、List、Map”,是moxie大哥写的。
http://forum.iteye.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:

ExpandedBlockStart.gif ContractedBlock.gif public   class  testAction  extends  ActionSupport  dot.gif
InBlock.gif        
private Collection smoeAttrs = null;//(使用webwork自动负值,应有对应getter和setter) 
InBlock.gif
        private IDeptJgzTjkEcoAttDAO ecoAttDAO = null;//(改DAO使用Spring注入,应有相应setter) 
InBlock.gif

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

None.gif

对应一个pojo:

None.gif package  org.tin.test; 
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public   class  SomeAttr  implements  Serializable  dot.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/** *//** The composite primary key value. */ 
InBlock.gif        
private java.lang.Long id; 
InBlock.gif
InBlock.gif        
private java.lang.Float fild1; 
InBlock.gif        
private java.lang.String fild2; 
InBlock.gif        
private java.util.Date fild3; 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//* 
InBlock.gif                dot.gif
InBlock.gif                对应的getter和setter 
ExpandedSubBlockEnd.gif        
*/
 
ExpandedBlockEnd.gif}

None.gif

可以看到,上面的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:

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

如何输出?很简单,在列表页中: 

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


即可以,因为iteratror这个tag支持iteratroStatus这个东西,用它可以获取index、isOdd等信息,很方便。

配合

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

则很容易的实现对Collection的CRUD。正好用到了ONGL的集中基本访问方式:#、%{}、${}

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值