使用 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>
我运行遇到几个问题:
- 我不可能显示一定数量的订单。 (例如:每个新帐户最多 5 个)。只有当 List 已经有一些对象时,才会显示输入字段。这是有道理的,但我想向用户展示他们可以填写的 X 个空行。
- 我无法同时向用户公开 orderName 和 orderCost 字段。
- 稍后我想添加一个 commandButton,在 UI 中添加另一行 inputText 字段,以便用户可以根据需要向帐户添加任意数量的订单。
非常感谢任何帮助。很高兴回答我错过的任何问题。谢谢!
在 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}
,但如前所述,这是不必要的。
我将 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>
我运行遇到几个问题:
- 我不可能显示一定数量的订单。 (例如:每个新帐户最多 5 个)。只有当 List 已经有一些对象时,才会显示输入字段。这是有道理的,但我想向用户展示他们可以填写的 X 个空行。
- 我无法同时向用户公开 orderName 和 orderCost 字段。
- 稍后我想添加一个 commandButton,在 UI 中添加另一行 inputText 字段,以便用户可以根据需要向帐户添加任意数量的订单。
非常感谢任何帮助。很高兴回答我错过的任何问题。谢谢!
在 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}
,但如前所述,这是不必要的。