gpt4 book ai didi

jsf - 未执行 commandLink 操作

转载 作者:行者123 更新时间:2023-12-01 09:02:39 27 4
gpt4 key购买 nike

我有以下 XHTML:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<head>
<title>TODO supply a title</title>
</head>
<body>
<f:metadata>
<f:viewParam id="productCV" name="productName" value="#{productBean.product}"
converter="#{productConverter}" required="true"/>
</f:metadata>

<ui:composition template="/templates/mastertemplate.xhtml">
<!-- Define the page title for this page-->
<ui:define name="pageTitle">
<h:outputFormat value="#{msgs.productPageTitle}">
<f:param value="#{productBean.product.description}"/>
</h:outputFormat>
</ui:define>

<!-- Pass the categoryName parameter to the sidebar so the category of this product is highlighted-->
<ui:param name="categoryName" value="#{productBean.product.categoryName}"/>

<ui:define name="content">
<!-- If productconversion failed, show this error-->
<h:message id="error" for="productCV" style="color: #0081c2;" rendered="#{productBean.product == null}" />

<!-- If productconversion succeeded show the product page-->
<h:panelGroup rendered="#{productBean.product != null}">
<p>#{productBean.product.description} #{productBean.product.categoryName}</p>
<h:form>
<h:commandLink action="#{cartBean.addItemToCart(productBean.product)}">
<f:ajax event="action" render=":cart :cartPrice" />
<h:graphicImage value="resources/img/addToCart.gif"/>
</h:commandLink>
</h:form>
</h:panelGroup>
</ui:define>
</ui:composition>
</body>
</html>

在顶部,我接受一个字符串作为 GET 参数,我通过转换器运行它,然后得到一个 Product 对象,我将它放在 productBean.product 中,即bean 有 Product 属性的 setter 和 getter,仅此而已。

然后我使用这个对象来显示信息等。这很好用。我还添加了 commandLink 以使用 AJAX 将其添加到我的购物车中。如果我的 ProductBeanRequestScope 中,这将无法工作,当我将它放入 SessionScope 时它可以工作,但只会添加产品 1 次。

据我所知,这应该是一个直截了当的 RequestScope,但我不明白为什么它可以与 SessionScope 一起使用。

我已阅读 this发帖,但我认为我没有违反任何这些规则。

为了完整起见,这是我的 ProductBean:

import be.kdg.shop.model.stock.Product;
import java.util.logging.Logger;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named
@RequestScoped
public class ProductBean {

private static final Logger logger = Logger.getLogger(ProductBean.class.getName());
private Product product;

public ProductBean() {}

public Product getProduct() {
return product;
}

public void setProduct(Product product) {
this.product = product;
}
}

最佳答案

您的 bean 是请求范围的。因此,bean 实例的生命周期与单个 HTTP 请求-响应周期一样长。

当第一次请求带有表单的页面时,会创建一个新的 bean 实例,该实例接收一个具体的 product 属性作为 View 参数。生成并发送相关响应后,bean 实例被丢弃,因为它是请求的结束。

当提交表单时,有效地触发了一个新的 HTTP 请求,因此创建了一个所有属性设置为默认值的新 bean 实例,包括 product 属性。这样 #{productBean.product} 对于整个请求来说是 null 。命令链接的父组件的 rendered 属性将评估 false。因此,命令链接 Action 永远不会被解码。这匹配 commandButton/commandLink/ajax action/listener method not invoked or input value not updated 的第 5 点你已经找到了,但显然没有真正理解。

解决方案是将 bean 放在 View 范围内。只要您与同一个 JSF View 交互(提交/回发), View 范围的 bean 就存在。标准 JSF 提供 @ViewScoped为了这。当您使用 CDI 而不是 JSF 来管理 bean 时,最好的选择是 CDI @ConversationScoped .这是比较笨拙的(你必须自己开始和结束范围),所以一些 CDI 扩展,如 MyFaces CODI提供 @ViewAccessScoped 可能更有用。

另见:

关于jsf - 未执行 commandLink 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14077155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com