我有一个JSF视图,其中在Primefaces DataTable
中列出了集合中的项目。最右侧的列包含删除按钮。当单击删除按钮时,它应该进行Ajax调用,从会话变量Cart
中删除相应的项目,并在原地更新视图。我希望请求和视图更改尽可能少。
以下是我为此目的编写的代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Register user</title>
</h:head>
<h:body>
<f:view>
<h:form id="itemsForm">
<p:outputPanel id="items">
<p:dataTable value="#{cart.itemList}" var="item">
<p:column>
<f:facet name="header">
<h:outputText value="name" />
</f:facet>
<h:outputText value="#{item.product.description}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="quantity" />
</f:facet>
<h:outputText value="#{item.quantity}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="" />
</f:facet>
<p:commandButton icon="ui-icon-close" title="remove from cart">
<p:ajax listener="#{cart.removeItem}"
update="form:itemsForm"
process="@this" />
</p:commandButton>
</p:column>
<f:facet name="footer">
Total amount: ${cart.totalAmount}
</f:facet>
</p:dataTable>
</p:outputPanel>
</h:form>
</f:view>
</h:body>
</html>
因此,我在
Cart.java
中编写了以下方法。public void removeItem() {
System.out.println("REMOVE REQUEST ARRIVED");
}
然而,当我点击删除按钮时,
removeItem
方法甚至没有执行。因此我的问题是:
1)我的Ajax调用有什么问题?我应该如何更改我的XHTML?
2)如何在removeItem
方法中处理请求并返回响应?
3)如何更新显示总金额的footer
?涉及到it技术。
@ViewScoped
注释引发了异常。当我将其更改为@SessionScoped
时,按钮没有响应。单击时什么也不会发生。 - Murat Derya Özen#{item}
作为参数,而不必使用<f:setPropertyActionListener>
。你肯定需要将我的例子转换为你自己的用例。我无法猜测你需要什么来给你一个100%的工作解决方案。 - Mr.J4mesactionListener
属性应该是action
,对吗? - Murat Derya ÖzenactionListener
。 - Mr.J4mes@ViewScoped
是这样一个 bean 的唯一正确注释。也许你只需要阅读异常并相应地修复它,而不是完全忽略它?我敢打赌它是一个NotSerializableException
,这是相当自我解释的。 - BalusCprocess="@this"
。请参见 https://dev59.com/-F8e5IYBdhLWcg3w0NCO - Jasper de Vries