Struts 2 - 同一页面上多个对象的模式/策略

时间:2011-07-25 18:12:44

标签: html struts2

我正在寻找一个好的设计模式/策略,用于如何使用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>

我需要一些不需要大量访问器方法的东西,允许轻松访问输入以进行验证,将验证消息返回到正确的表单字段。

2 个答案:

答案 0 :(得分:2)

此处的策略是使用Map<Integer, Address>

示例Bean类

我们假设以下示例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自动处理所有对象实例化,即使在其他对象中包含的对象中也是如此。