(请查看下面的编辑内容)
作为this SO question代码的延续,我现在尝试使用实体类的持久性来保存<h:dataTable>
的修改值。
我有一个dataTable,如下所示:
<h:form>
<h:dataTable id="userTable" value="#{admin.customerList}"
var="c"
binding="#{admin.customerTable}"<!-- Not sure if this is necessary -->
styleClass="gnomeTable"
headerClass="gnomeTableHeader"
rowClasses="gnomeTableOddRow,gnomeTableEvenRow"
bgcolor="#F1F1F1" border="10" cellspacing="2"
rules="all" >
<f:facet name="header">
<h:outputText value="All registered customers" />
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="User ID" />
</f:facet>
<h:outputText value="#{c.id}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Username"/>
</f:facet>
<h:outputText value="#{c.username}" rendered="#{not c.editable}"></h:outputText>
<h:inputText value="#{c.username}" rendered="#{c.editable}"></h:inputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Email"/>
</f:facet>
<h:outputText value="#{c.email}" rendered="#{not c.editable}"></h:outputText>
<h:inputText value="#{c.email}" rendered="#{c.editable}"></h:inputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Banned?"/>
</f:facet>
<h:selectBooleanCheckbox value="#{c.banned}" rendered="#{not c.editable}" disabled="true"></h:selectBooleanCheckbox>
<h:selectBooleanCheckbox value="#{c.banned}" rendered="#{c.editable}" disabled="false"></h:selectBooleanCheckbox>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Admin?"/>
</f:facet>
<h:selectBooleanCheckbox value="#{c.admin}" rendered="#{not c.editable}" disabled="true"></h:selectBooleanCheckbox>
<h:selectBooleanCheckbox value="#{c.admin}" rendered="#{c.editable}" disabled="false"></h:selectBooleanCheckbox>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Edit"/>
</f:facet>
<h:commandLink value="Edit" action="#{admin.editAction(c)}" rendered="#{not c.editable}" />
<h:commandButton value="Save" action="#{admin.saveAction(c)}" rendered="#{c.editable}" />
</h:column>
</h:dataTable>
</h:form>
表格已成功填充,当我单击最后一列中的编辑按钮时,我可以修改列的值。如果我然后点击最后一列Save
的{{1}}按钮,则调用参数#{admin.saveAction(c)}
,我相信我刚刚修改了该客户。
虽然没有进行任何更改,但仍会调用该方法。
c
看起来像这样:
saveAction(Customer c)
和public String saveAction() {
for (Customer customer : customerList) {
System.out.println("Trying to update customer with ID: " + customer.getId());
customerFacade.updateCustomer(customer);
}
return null;
}
看起来像这样:
updateCustomer(Customer c)
要么我还没有理解变量public void updateCustomer(Customer c) {
em.merge(c);
}
如何对应于客户列表c
中的Customer
对象,或者我没有成功将其绑定到它的属性。简而言之,当我修改任何字段时,customerList
对象不会发生任何更改。
是否有办法在Customer
中绑定每个Customer对象c
的属性,以便在更改连接到当前对象的数据表中的字段时更新值?< / p>
我是否必须使用监听器来监视字段是否被修改,然后调用对象属性的setter?
修改
总结一下我所做的代码的变化。
主要问题似乎是当我修改数据表中的字段值时,customerList
对象(实体类)没有被修改。
customer
方法现在看起来如下
saveAction
bean类:
public String saveAction() {
for (Customer customer : customerList) {
System.out.println("Trying to update customer with ID: " + customer.getId());
customerFacade.updateCustomer(customer);
}
return null;
}
那么,现在的主要问题只是为什么我的价值观没有被更新?