Java Primefaces:使用ajax将inplace标记保存到db

Java Primefaces:使用ajax将inplace标记保存到db,java,jsf,primefaces,Java,Jsf,Primefaces,我还有一个关于primefaces(java、jsf)的问题。 我用这样的代码管理Bean: @ManagedBean @SessionScoped public class AccountManagedBean { private Long id = (long) 1; private Account account = new Account(); private AccountJpaController accountController = new Account

我还有一个关于primefaces(java、jsf)的问题。 我用这样的代码管理Bean:

@ManagedBean
@SessionScoped
public class AccountManagedBean {
    private Long id = (long) 1;
    private Account account = new Account();
    private AccountJpaController accountController = new AccountJpaController();

    public void AccountManagedBean() {
        extractAccount();
    }

    public void saveAccount() {
       accountController.update(account);
       // extract info for page
       extractAccount();
    }

    public void extractAccount() {
       account = accountController.get(id);
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    } 
}
和xhtml文件-视图部分:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:c="http://java.sun.com/jsp/jstl/core">

<h:body>
        <p:panel id="account">
                        <h:panelGrid columns="2" columnClasses="column" cellpadding="5">  
                            <h:outputText value="Balance: " />
                            <p:inplace editor="true">  
                                <p:ajax event="save" listener="#{accountManagedBean.saveAccount}" update="account" />
                                <p:inputText value="#{accountManagedBean.account.balance}" required="true"/>  
                            </p:inplace>

                            <h:outputText value="Credit limit: " />
                            <p:inplace editor="true" >
                                <p:ajax event="save" listener="#{accountManagedBean.saveAccount}" update="account" />
                                <p:inputText value="#{accountManagedBean.account.creditLimit}" required="true"/>  
                            </p:inplace>

                            <h:outputText value="Comment: " />
                            <p:inplace editor="true">
                                <p:ajax event="save" listener="#{accountManagedBean.saveAccount}" update="account" />
                                <p:inputText value="#{accountManagedBean.account.comment}"/>  
                            </p:inplace>  
                        </h:panelGrid>
        </p:panel>  
</h:body>


问题在于保存已编辑的信息。我在方法saveAccount上设置了断点,并尝试更改页面上的值。更改页面上的字段值后,程序在断点处暂停,我可以看到正在保存到DB的对象-有旧值(从DB中提取)。而且页面上的旧值也太多(这是合理的,因为“旧”帐户已更新)。我使用primefaces 3.0.RC2。问题可能出在ajax属性“event”(我使用“save”,但在Primefaces用户指南中,我并没有找到这种情况下的其他变体)。请帮我解决我的问题。

似乎您错过了
h:form
元素。发送到服务器(例如ajax)的每个操作都必须放在
表单
元素中。请参见使用commandButton解决我的问题

<h:form>
                        <p:panel id="account">
                            <h:panelGrid columns="2" columnClasses="column" cellpadding="5">  
                                <h:outputText value="Balance: " />
                                <p:inplace editor="true">
                                    <p:ajax event="save" onsuccess="saveAccount.enable();"/>
                                    <p:inputText value="#{accountManagedBean.account.balance}" required="true"/>  
                                </p:inplace>

                                <h:outputText value="Credit limit: " />
                                <p:inplace editor="true" >
                                    <p:ajax event="save" onsuccess="saveAccount.enable();"/>
                                    <p:inputText value="#{accountManagedBean.account.creditLimit}" required="true"/>  
                                </p:inplace>

                                <h:outputText value="Comment: " />
                                <p:inplace editor="true">
                                    <p:ajax event="save" onsuccess="saveAccount.enable();"/>
                                    <p:inputText value="#{accountManagedBean.account.comment}"/>  
                                </p:inplace>

                                <p:commandButton title="Save account changes" value="Save" widgetVar="saveAccount" action="#{accountManagedBean.saveAccount}" oncomplete="saveAccount.disable();" />
                            </h:panelGrid>
                        </p:panel>

                        <script type="text/javascript">$(document).ready(function() {saveAccount.disable();});</script>

                    </h:form>
解释。我创建了标题为“Save”的commandButton,当页面加载时,它是禁用的。编辑页面上的一个或多个帐户值后,按钮将通过代码启用:

<p:ajax event="save" onsuccess="saveAccount.enable();"/>
有,所以我使用简单的jQuery代码,在加载页面后禁用按钮:

<script type="text/javascript">$(document).ready(function() {saveAccount.disable();});</script>
$(document.ready)(函数(){saveAccount.disable();});

但将内联值保存到DB的问题仍然存在。

我无法修改account字段并将对象保存到DB,因为在编辑account object中的字段(在第页)后,没有任何更改。我认为这是对代码片段的粗心简化。OP明确提到值已保存。如果没有
,这是不可能的。谢谢-虽然这可能不是原始问题的答案,但对我的情况有帮助。如果没有
,则无法保存inplace标记中的值。您是否设法解决了此问题?我正在运行PrimeFaces4和JSF2.2,但当您单击默认的保存按钮时,我无法保存此组件。出于某种原因,从未调用backingbean方法,这真的很奇怪,因为cancel方法一直被调用。有什么想法吗?
oncomplete="saveAccount.disable();"
<script type="text/javascript">$(document).ready(function() {saveAccount.disable();});</script>