我正在寻找一个好的设计模式/策略,用于如何使用Struts 2框架在HTML页面上编辑相同类型的多个对象。 Struts非常适合编辑单个对象,比如Address。如果您为address1,city,state等提供访问器方法,struts将调用这些方法,标准的struts UI标记将相应地填充表单字段。
在同一页面上编辑多个相同类型的对象时如何执行此操作。我有一个基于网络的比赛,比赛的分开是每个比赛的一组评定量表对象。每个评定量表都有一个值和一个标签。如果我将输入字段命名为value_0,value_1 ...和label_0,label_1 ...那么我要么编写一堆访问器方法(UGLY)或使用原始参数来获取我需要的值。使用struts验证方法将错误消息发送回正确的表单字段很困难,但并非不可能。
如果我将所有字段命名为“Value”和“label”,struts就足以调用一个设置输入值List的方法,但我无法将验证错误发送回正确的输出字段。< / p>
我需要一些不需要大量访问器方法的东西,允许轻松访问输入以进行验证,将验证消息返回到正确的表单字段。
答案 0 :(得分:2)
此处的策略是使用Map<Integer, Address>
。
我们假设以下示例Address
类。
public class Address {
private String line1;
private String line2;
private String city;
private String state;
private String zipCode;
// getters and setters here
}
public class ExampleAction extends ActionSupport {
/**
* A map of ID -> Address.
*/
private Map<Integer, Address> addresses = Maps.newLinkedHashMap();
// ... action method(s) and validate here
public Map<Integer, Address> getAddresses() {
return addresses;
}
}
在JSP层中,您可以迭代地图(每次迭代都是Map.Entry)并输出每个字段(line1,line2,city等)。字段名称应为:
addresses[0].line1
addresses[0].line2
addresses[0].city
addresses[0].state
addresses[0].zipCode
...
addresses[5].line1
addresses[5].line2
addresses[5].city
addresses[5].state
addresses[5].zipCode
要执行验证,只需迭代地图并相应地检查每个字段。编辑地址时,可以使用数据库中地址的主键。要添加新地址,您只需从零开始递增。索引可以是任何数字,只要它在地图中是唯一的。
答案 1 :(得分:0)
我通常将我需要在表单中使用的所有内容映射到相关的类,例如Person,Address,Misc。然后,我将创建一个包装类,并使用委托访问器方法来提供单个接口来访问各个对象。我经常使用JPA entites,所以这些类已经为我设置了,我只需要包装器和CRUD函数的一些实用方法。例如:
public class ContactWrapper implements Serializable{
private Person person;
private Address address;
private Misc misc;
// Getters / Setters for primary objects - person, address, misc
...
// Delegate accessors
public String getName(){
return person.getName();
}
public String setName(String name){
return person.setName(name);
}
...
}
现在你有一个可以在你的动作类和jsp中使用的对象,它可以是你选择的引用。
在你的动作类中:
public class ContactAction extends ActionSupport{
private ContactWrapper contact;
....
}
在你的JSP中:
<s:textfield name="contact.name" />
Struts自动处理所有对象实例化,即使在其他对象中包含的对象中也是如此。