使用 JSF 表单创建一个包含其他对象列表的对象

Use JSF form to create an object with a list of other objects

我将 JSF 2 与 Glassfish 4 一起使用。我想创建一个对象,该对象将对象集合作为其字段之一。搜索时,我只能想办法显示 JSF 表单中的集合字段。在这里我想要相反的东西:允许用户在创建父对象时填充这个集合。下面的简化示例:

父对象:帐户

public class Account {
    private String accountName;
    private List<Order> orderList = new ArrayList<Order>();

    public String save() {
        System.out.println(accountName);
        System.out.println(orderList);
        return "";
    }

    // Constructors, getters and setters below.

}

子对象:订单

public class Order {
    private String orderName;
    private Integer orderCost;

    // Constructors, getters and setters below.

}

JSF 页面正文

表格的想法来自 BalusC 的回答 here

<h:body>
  <h1>Create Account</h1>
  <h:form>
    <h:panelGrid>
      Account Name: 
      <h:inputText value="#{account.accountName}" />

      <ui:repeat value="#{account.orderList}" varStatus="loop">
        Order Name:
        <h:inputText value="#{account.orderList[loop.index]}" />
        Order Cost:
        <h:inputText value="#{account.orderList[loop.index]}" />
      </ui:repeat>

    </h:panelGrid>
    <h:commandButton action="#{account.save}" value="Create" />
  </h:form>
</h:body>

我运行遇到几个问题:

非常感谢任何帮助。很高兴回答我错过的任何问题。谢谢!


在 BalusC 的帮助下,我做了以下更改,现在我有了我想要的行为:

// Prop up the array so the desired number of fields appears in the UI
@PostConstruct
public void prepare() {
    orderList.add(new Order());
    orderList.add(new Order());
    orderList.add(new Order());
}

遍历空 Order 对象列表。没有数据被禁用,因为 Order 对象中的所有字段值为空。此外,由于我在@PostConstruct 中创建了对象,所以用户的更改很容易保存在提交时。

  <ui:repeat value="#{account.orderList}" var="order">
    Order Name:
    <h:inputText value="#{order.orderName}" />
    Order Cost:
    <h:inputText value="#{order.orderCost}" /><br/>
  </ui:repeat>

关于准备固定数量的项目和添加新项目,只需将新项目添加到列表中即可。

orders.add(new Order());

@PostConstruct 中执行此操作以准备页面加载时的项目,并在 "Add" 按钮中执行相同操作。

至于访问属性,你不需要 varStatus/index 技巧,因为你有一个可变对象的集合,而不是一个不可变对象的集合(你的问题在哪里发现是关于)。

<ui:repeat value="#{bean.orders}" var="order">
    <h:inputText value="#{order.name}" />
    <h:inputText value="#{order.cost}" />
</ui:repeat>

如果你真的坚持,你本可以做到的#{bean.orders[loop.index].name},但如前所述,这是不必要的。