为什么在方法调用之前没有更新此bean值?

时间:2015-02-24 18:37:52

标签: jsf

对于作业,我必须显示从数据库中提取的书籍的数据表,并且该表必须在命令中可编辑,以便可以更新数据库中的书籍条目。我的代码是基于我们教授的一个例子,就是这样的:

            <h:dataTable value="#{bookList.inventory}" var="book" 
                               rowClasses="oddrow, evenrow" headerClass="header">
        <h:column>
            <f:facet name="header">ISBN</f:facet>
            <h:inputText rendered="#{book.editable}" value="#{book.isbn}" />
            <h:outputText rendered="#{not book.editable}" 
                          value="#{book.isbn}" />
        </h:column>
        <h:column>
            <f:facet name="header">Title</f:facet>
            <h:inputText rendered="#{book.editable}" value="#{book.title}" />
            <h:outputText rendered="#{not book.editable}" 
                          value="#{book.title}" />
        </h:column>
        <h:column>
            <f:facet name="header">Author</f:facet>
            <h:inputText rendered="#{book.editable}" value="#{book.author}" />
            <h:outputText rendered="#{not book.editable}" 
                          value="#{book.author}" />
        </h:column>
        <h:column>
            <f:facet name="header">Price</f:facet>
            <h:inputText rendered="#{book.editable}" value="#{book.price}" />
            <h:outputText rendered="#{not book.editable}" 
                          value="#{book.price}" />
        </h:column>
        <h:column>
            <h:commandLink 
                action="#{bookList.removeFromInventory(book)}"
                value="Remove From Inventory">
                <f:ajax render="@form" />
            </h:commandLink>
        </h:column>
        <h:column>
            <h:commandLink rendered="#{not book.editable}" 
                           action="#{book.setEditable(not book.editable)}" value="Edit">
                <f:ajax render="@form" />
            </h:commandLink>
            <h:commandLink rendered="#{book.editable}" 
                           action="#{book.setEditable(not book.editable)}" value="Submit">
                <f:actionListener binding="#{bookList.updateEntry(book)}" />
                <f:ajax render="@form" />
            </h:commandLink>
        </h:column>
    </h:dataTable>

然后updateEntry看起来像这样:

public void updateEntry(Book b) throws SQLException {
    if(!b.getEditable()) return;
    if(inventory == null) return;
    if(ds == null) throw new SQLException("Can't connect to database");

    try(Connection conn = ds.getConnection()){
        PreparedStatement update = conn.prepareStatement("update books set "
                + "title='" + b.getTitle() + "', Author='" + b.getAuthor()
                + "', price=" + b.getPrice() + " where isbn=" +b.getIsbn());
        update.execute();

    }
}

表单已成功编辑,当我单击提交时,将正确调用updateEntry方法。但是,它没有正确更新数据库,因为我在调用updateEntry方法之前没有更新变量簿,因为我在调试中找到了它。无论我在输入中输入什么,它都会向updateEntry发送相同的值。如何在调用方法之前确保更新书中的值?

1 个答案:

答案 0 :(得分:1)

在对JSF调用setter方法的时间做了更多研究后找到了解决方案。因为我没有使用ajax属性“execute”,所以它在处理请求之前没有调用setter,因为默认情况下使用只会导致它所包含的元素在渲染目标之前被处理。

解决方案是将我的ajax标签更改为:

    <f:ajax execute="@form" render="@form" />

我希望这能够帮助其他人尝试学习JSF!