我一直在按照创建主从表和对话框中的@BalusC示例进行操作,如何重复使用相同的对话框进行创建和编辑 以及了解PrimeFaces进程/更新和JSF f:ajax执行/渲染属性,尝试获取一个小表单来编辑一些数据,然后持久化。但是,当我尝试保存数据时,我看不到支持Bean中反映的更改。
我有一个简单的表单,我预先填充了一些数据,我可以在保存之前对其进行编辑:
<h:form id="productSummaryForm">
<h:panelGrid columns="2" columnClasses="label, value">
<h:outputText value="Product name:" />
<p:inputText id="productNameInputText" value="#{editProduct.product.productName}" required="true" requiredMessage="Enter Product Name" size="32">
<p:watermark value="The name of the product" for="productNameInputText"/>
</p:inputText>
<h:outputText value="Output name:" />
<p:inputText id="outputNameInputText" value="#{editProduct.product.outputName}" size="32">
<p:watermark value="Output name" for="outputNameInputText"/>
</p:inputText>
</h:panelGrid>
<h:panelGrid columns="3" styleClass="buttonPanelGrid">
<p:commandButton value="Cancel" immediate="true" action="#{productController.cancel}"/>
<p:commandButton id="saveButton" value="Save" process="@this" immediate="true" action="#{editProduct.saveProduct}"/>
</h:panelGrid>
</h:form>
控制器是:
@Named
@ViewScoped
public class EditProduct implements Serializable {
private Product product; // JPA Entity
@Inject
protected ProductService productService;
public String saveProduct() {
productService.saveProduct(product);
return "/product?faces-redirect=true";
}
}
当我在saveProduct()
上进行调试时,我通过 UI 所做的任何编辑都不会反映在我保存的product
中。我尝试将inputText
ids添加到process
属性(例如process="@this outputNameInputText"
(,但更改仍未反映出来。
我尝试过的属性的不同组合都没有改变saveButton
,这让我认为Product
问题所在:它是一个 JPA 实体。听起来对吗?
因此,我的一个组件上存在验证错误,我通过处理命令按钮/命令链接/ajax action/listener 方法中的列表未调用或未设置/更新输入值时发现该错误。在完成此操作的过程中,了解PrimeFaces进程/更新和JSF f:ajax执行/渲染属性,我发现有多种方法可以完成我需要的事情:
依赖默认的 PrimeFaces process="@form"
行为:
<p:commandButton id="saveButton" value="Save" action="#{editProduct.saveProduct}"/>
或者,只是为了明确:
<p:commandButton id="saveButton" value="Save" process="@form"
action="#{editProduct.saveProduct}"/>
仅以PrimeFaces方式处理某些表单字段:
<p:commandButton id="saveButton" value="Save"
process="@this outputNameInputText productNameInputText"
action="#{editProduct.saveProduct}"/>
而且,在没有PrimeFaces的情况下做到这一点:
<h:commandButton id="saveButton" value="Save" action="#{editProduct.saveProduct}">
<f:ajax execute="@form" render="@all"/>
</h:commandButton>