Java Primefaces:使用ajax将inplace标记保存到db
我还有一个关于primefaces(java、jsf)的问题。 我用这样的代码管理Bean: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
@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>