【问题标题】:Phase listener in composite component not called ever复合组件中的相位侦听器从未被调用过
【发布时间】:2012-08-10 14:45:33
【问题描述】:

我有一个复合组件:

<cc:interface componentType="com.example.MyComponent">
    <!-- ... -->
</cc:interface>

<cc:implementation>
    <f:phaseListener binding="#{cc}"/>
    <div id="#{cc.clientId}">
        <!-- ... -->
    </div>
</cc:implementation>

及其类:

@FacesComponent("com.example.MyComponent")
public class MyComponent extends UIOutput implements NamingContainer, PhaseListener
{
    @Override
    public String getFamily()
    {
        return "javax.faces.NamingContainer";
    }

    @Override
    public PhaseId getPhaseId()
    {
        return PhaseId.ANY_PHASE;
    }

    @Override
    public void beforePhase(PhaseEvent event)
    {
        // Do something ...
    }

    @Override
    public void afterPhase(PhaseEvent event)
    {
        // Do something ...
    }
}

在任何情况下都不会调用beforePhase(PhaseEvent)afterPhase(PhaseEvent) 方法,无论是完整还是部分页面加载。

我在这里注意到了这个错误:http://java.net/jira/browse/JAVASERVERFACES-1200,但它似乎在很久以前就已经修复了。

我在 Java 6u33 x64 上使用 GlassFish 3.1.2.2。

【问题讨论】:

    标签: java jsf jsf-2 composite-component phaselistener


    【解决方案1】:

    每次&lt;f:phaseListener&gt;beforePhase()afterPhase()方法实际上需要由UIViewRoot执行时,都会重新评估#{cc}#{cc} 目前在 EL 范围内不可用。它仅在组件范围内可用。

    如果binding 至少在复合组件的构造函数中指向如下请求范围的变量,它就可以正常工作:

    public MyComponent() {
        FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("ccc", this);
    }
    

    <f:phaseListener binding="#{ccc}" />
    

    当然,只有当您有多个这种类型的复合组件时,此构造才会失败。

    您最好寻找另一种方法:完全摆脱&lt;f:phaseListener&gt;,只在复合组件的构造函数中使用UIViewRoot#addPhaseListener()

    public MyComponent() {
        FacesContext.getCurrentInstance().getViewRoot().addPhaseListener(this);
    }
    

    与具体问题无关,最好使用UINamingContainer.COMPONENT_FAMILY 常量而不是硬编码"javax.faces.NamingContainer"

    【讨论】:

    • 呃...我以为我已经掌握了这个生命周期的东西。是的,它可以工作并且足够干净。也感谢您的额外提示。这正是我一直在寻找的常数。
    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 2019-03-02
    • 1970-01-01
    • 2012-04-30
    • 2019-09-01
    • 2011-03-22
    • 2023-04-01
    相关资源
    最近更新 更多