2009-04-27 78 views
0

没有使用DynaForm和它的亲属。什么是在struts中进行多行更新的好方法(使用struts live)?

我想用一个POJO数据传输对象,例如,联系人:

public class Person { 
    private Long id; 
    private String firstName; 
    private String lastName; 
    // ... getters/setters for the fields 
} 

支柱中的真人形式,我们将有:

public class PersonUpdateForm extends SLActionForm { 
    String organization; 
    Person[] persons; // all the people will be changed to this organization; they're names and so forth can be updated at the same time (stupid, but a client might desire this) 

    // getters/setters + index setters/getters for persons 

} 

会是什么相应的HTML:文本标签看起来像在JSP中允许这样做?如果我切换到List persons字段并使用延迟加载列表(在commons-collections中),那么这将如何改变呢?

似乎是在struts-1.2要做到这一点没有什么好办法(0.9?)

所有帮助是极大的赞赏!如果你需要更多的上下文让我知道,我可以提供一些。

+0

好的,我相信我已经想通了! 诀窍是每次使用BeanUtils的填充方法调用getPersons()方法时,索引getter都会创建一个元素。 代码已完成,但我得到了一个积极的结果。 现在是3点半,我一直在这一段时间陷入困境。似乎没有人知道答案,这让我想用鳟鱼把它们砸在脑袋里。至于我自己的无知......我只责怪他们! – les2 2009-04-27 07:31:47

回答

1

好的,我相信我已经想通了!诀窍是每次使用BeanUtils的填充方法调用getPersons()方法时,索引getter都会创建一个元素。代码尚未完成,但我得到了一个积极的结果。现在是3点半,我一直在困扰这一点。似乎没有人知道答案,这让我想用鳟鱼把它们砸在脑袋里。至于我自己的无知......我只责怪他们!

public List<Person> getPersons() { 
    persons.add(new Person()); // BeanUtils needs to know the list is large enough 
    return persons; 
} 

当然也可以添加您的索引获取器和设置器。

我记得我是怎么做到的。您必须将上述人员列表预先初始化为您希望传输的最大大小。这是因为List首先被转换为数组,然后在数组的每个元素上设置属性,最后使用setPersons(...)设置List。因此,使用延迟加载List实现或类似的方法(如上面显示的那样)将不适用于struts live。这里有您需要更详细地做什么:

private List<Person> persons = new ArrayList<Person>(MAX_PEOPLE); 
public MyConstructor() { for(int i = 0; i < MAX_PEOPLE; i++) persons.add(new Person()); } 

public List<Person> getPeopleSubmitted() { 
    List<Person> copy = new ArrayList<Person>(); 
    for(Person p : persons) { 
     if(p.getId() != null) copy.add(p); 
     // id will be set for the submitted elements; 
     // the others will have a null id 
    } 
    return copy; // only the submitted persons returned - not the blank templates 
} 

这基本上是你必须做的事!但真正的问题是 - 谁在继续使用struts?!

相关问题