绑定属性的属性 - JSF2 - <h:datatable> </h:datatable>

时间:2014-01-04 16:41:41

标签: java jsf data-binding datatable

(请查看下面的编辑内容)

作为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;
}

那么,现在的主要问题只是为什么我的价值观没有被更新?

0 个答案:

没有答案