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

时间:2012-01-10 12:33:07

标签: java jsf primefaces

关于primefaces(java,jsf)的另外一个问题。 我有ManagedBean这样的代码:

@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属性“事件”(我使用“保存”,但在Primefaces用户指南我没有找到这种情况的其他变种)。请帮我解决我的问题。

2 个答案:

答案 0 :(得分:1)

看来你错过了h:form元素。发送到服务器的每个操作(例如ajax)都必须放在form元素内。见http://www.primefaces.org/showcase/ui/ajaxifyKeyEvents.jsf

答案 1 :(得分:0)

使用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>

托管bean中的小变化:

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

Explenation。我创建了标题为“保存”的commandButton,在加载页面时禁用。在页面上编辑一个或多个帐户值后,按钮由代码启用:

<p:ajax event="save" onsuccess="saveAccount.enable();"/>

按下“保存”按钮后,它被禁用 - 我使用属性oncomplete:

oncomplete="saveAccount.disable();"

problems with commandButton attribute disable,所以我简单的jQuery代码,它使按钮在加载页面后被禁用:

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

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