【问题标题】:ConversationScoped bean action not fired using a rendered commandlink未使用呈现的命令触发 ConversationScoped bean 操作link
【发布时间】:2014-04-16 08:29:03
【问题描述】:

我无法理解为什么我的 ConversationScope'd bean 上的操作方法没有触发。豆是:

package org.work;

import java.io.Serializable;
import javax.enterprise.context.ConversationScoped;
import javax.faces.event.ComponentSystemEvent;
import javax.inject.Named;

@Named
@ConversationScoped
public class NewClass implements Serializable {

    private static final long serialVersionUID = 6470665657635110586L;
    private boolean b1;

    public boolean isB1() {
        return b1;
    }

    public void setB1(boolean b1) {
        this.b1 = b1;
    }

    public void preRenderView(ComponentSystemEvent evt) {
    }

    public String peformAction() {
        return null;
    }
}

而我的 XHTML 是:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <f:view>
        <h:head>

        </h:head>
        <f:metadata>
            <f:viewParam name="b1"
                         value="#{newClass.b1}" />
            <f:event type="preRenderView"
                     listener="#{newClass.preRenderView}"/>
        </f:metadata>
        <h:body>
            <h:form>
                <h:commandLink action="#{newClass.setB1(!newClass.b1)}"
                               style="background-color:  #{newClass.b1 ? 'darkorchid' : 'aquamarine'};"
                               value="btn3"/>
                <h:panelGrid rendered="#{newClass.b1}"
                             columns="1">
                    <h:commandLink value="edit"
                                   action="#{newClass.peformAction()}" />
                </h:panelGrid>
            </h:form>
        </h:body>
    </f:view>
</html>

在我按下 commandLink 后,不会触发 performAction() 方法,该命令应该反转布尔值,从而呈现另一个 commandLink。调试时,我可以看到布尔值设置为 true,但在我看来,在设置 viewparams 之前评估了“rendered”属性。这是真的? 该示例适用于@ManagedBean 和@javax.faces.bean.ViewScoped。

【问题讨论】:

    标签: java jsf scope rendered-attribute


    【解决方案1】:

    我认为您没有进行长时间的对话。您可以在此站点上阅读更多信息:http://docs.oracle.com/javaee/6/api/javax/enterprise/context/ConversationScoped.html

    如果你有短暂的对话,这个 bean 会在每次请求后重新创建

    【讨论】:

    • 在每次对话中都正确地创建了 bean,并且正确地保持实例化,直到对话结束。这是我通过调试构造函数和@PostConstruct 方法观察到的。
    • 注入 Conversation 接口并获取 isTransient() 在调试过程中始终为真。
    • 我是否要使用 Conversation 对象中的 begin() 和 end() 方法来手动启动和停止长时间运行的 bean?容器不应该控制这个吗?
    • 这就是对话的美妙之处,由你掌控。您必须指定它从哪个页面开始以及在哪个页面结束。会话结束时容器会自动销毁 bean。
    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多