JSF 2.2中h:commandButton未点击即执行action的问题求助
问题原因与解决方案
问题根源
你使用了JSTL的<c:forEach>遍历商品列表,而JSTL标签是在JSF的视图构建阶段执行的。这个阶段会解析循环内所有JSF组件的属性,包括<h:commandButton>的action方法表达式,导致页面加载/刷新时,所有商品的添加购物车方法被意外触发,而非仅在按钮点击时执行。
解决步骤
替换JSTL循环为JSF原生迭代器
将页面中的<c:forEach>替换为JSF的<ui:repeat>,它是专门为JSF组件设计的迭代器,在视图渲染阶段执行,只会渲染组件,不会在页面加载时触发action方法。移除不必要的
immediate="true"属性
该属性用于跳过JSF生命周期的验证阶段,在添加购物车的场景下完全不需要,移除后可避免不必要的生命周期干扰。
修改后的核心代码
<div class = "row container-fluid"> <ui:repeat value="#{productController.findAll()}" var="p" > <div class="col-lg-4 product"> <h:graphicImage value="#{p.imgPath}" height="150" width="150"/> <br></br> <h:outputText value=" #{p.description}"/> <br></br> <h:outputText value="₪ #{p.price}"/> <h:form> <h:commandButton class="btn btn-success" id="AddToCart" value="add to cart" action="#{shoppingCartController.orderNecklace(p)}"/> </h:form> </div> </ui:repeat> </div>
额外说明
JSF的<ui:repeat>会严格遵循JSF生命周期,仅在用户点击按钮触发POST请求时,才会执行对应的orderNecklace方法,完全符合你"仅点击才添加商品"的需求。
内容的提问来源于stack exchange,提问作者Gal Lisha
相关产品推荐
相关产品推荐

