我的产品正在使用JSF和Primefaces 2.2。我需要的是处理另一个数据表中的子数据表。代码如下。
<h:form>
<p:dataTable id="myInvoiceTable"
value="#{globalBean.invoices}" var="invoice">
<p:column>
<f:facet name="header">
<h:outputText value="Bill ID" />
</f:facet>
<h:outputText value="#{invoice.billId}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Item" />
</f:facet>
<h:outputText value="#{invoice.item}" />
</p:column>
<p:rowExpansion>
<h:selectOneMenu id="reasons" value="#{invoiceAction.reason}">
<f:selectItem itemLabel="Reason 1" itemValue="Reason 1"></f:selectItem>
<f:selectItem itemLabel="Reason 2" itemValue="Reason 2"></f:selectItem>
</h:selectOneMenu>
<p:inputText id="activity_amount" value="#{invoiceAction.activity_amount}"/>
<p:commandButton value="PROCESS" action="invoice_process" update="actions_table">
</p:commandButton>
<p:dataTable id="actions_table" value="#{invoice.actions}" var="invAction">
<p:column>
<h:outputText value="#{invAction.reason}" />
</p:column>
<p:column>
<h:outputText value="#{invAction.activity_amount}" />
</p:column>
</p:dataTable>
</p:rowExpansion>
</p:dataTable>
这是我的豆。
public class Invoice {
private int billId;
private String item;
private List<InvoiceAction> actions;
// Getter & setter here
}
public class InvoiceAction {
private String reason;
private double activity_amount;
private int billId;
// Getter & setter here;
}
但是当生成HTML时,它不会按需处理。只有数据表最后一行中的选择菜单才能接收用户选择的数据,其他则不能。因为所有行中的所有选择菜单都使用相同的对象(#{invoiceAction}),并且bean只获取页面中最后一个组件的值。我知道根本原因,但我不知道如何解决它。如何让他们在指定的行中提交?
答案 0 :(得分:1)
首先,我认为您的Invoice
和InvoiceAction
类看起来就像普通的Java对象一样。我觉得它们不应该是Managed Bean。
此外,您的#{invoiceAction}
未正确绑定到List<InvoiceAction> actions
中的某个操作,这是正确的。由于您使用的是嵌套<p:dataTable>
,我认为您可以利用<p:cellEditor>
。它会是这样的:
<p:rowExpansion>
<p:dataTable id="actions_table" value="#{invoice.actions}" var="invAction">
<p:column>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{invAction.reason}" />
</f:facet>
<f:facet name="input">
<h:selectOneMenu id="reasons" value="#{invoiceAction.reason}">
<f:selectItem itemLabel="Reason 1" itemValue="Reason 1" />
<f:selectItem itemLabel="Reason 2" itemValue="Reason 2" />
</h:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{invAction.activity_amount}" />
</f:facet>
<f:facet name="input">
<p:inputText id="activity_amount" value="#{invoiceAction.activity_amount}" />
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
<p:commandButton value="PROCESS" action="invoice_process" update="actions_table" />
</p:rowExpansion>