首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未执行commandLink操作

未执行commandLink操作
EN

Stack Overflow用户
提问于 2012-12-29 07:39:18
回答 1查看 11.7K关注 0票数 3

我有以下XHTML:

代码语言:javascript
复制
<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属性的设置器和getter,仅此而已。

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

据我所知,这应该是一个直截了当的RequestScope,我不明白为什么它能与SessionScope一起工作。

我已经通读了this的帖子,但我不认为我违反了任何这些规则。

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

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-29 11:25:57

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

当第一次请求包含表单的页面时,将创建一个新的bean实例,该实例接收一个具体的product属性作为视图参数。在生成并发送关联的响应之后,bean实例被清理,因为它是请求的结尾。

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

解决方案是将bean放在视图范围内。只要您与相同的JSF视图进行交互(提交/回发),视图范围内的bean就会存活。标准JSF为此提供了@ViewScoped。由于您使用的是CDI而不是JSF来管理@ConversationScoped,因此最好的选择是CDI bean。这相对比较笨拙(您必须自己开始和结束作用域),所以一些CDI扩展可能更有用,比如提供@ViewAccessScopedMyFaces CODI

另请参阅:

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14077155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档