在构建viewroot之后如何应用JSF2 phaselistener?

时间:2011-08-18 12:19:52

标签: jsf-2 phaselistener

在我的JSF2应用程序中,我有一个phaselistener需要在RENDER_RESPONSE之前执行,但是在JSF构建了viewroot之后。

首先,我所做的是在faces-config中注册我的PhaseListener。然后调用侦听器,但是当我执行beforePhase时,getViewRoot().getChildren()仍为空。

其次,我通过在我的xhtml页面上添加以下内容找到了如何做到这一点:

<f:phaseListener type="be.application.PolicyController" />

这很好用,但是将它添加到我的每个页面都会非常繁琐。 因此,我正在为我的申请寻找一次这样做的可能性。

任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:7)

在faces-config:

中注册PreRenderViewEvent的系统事件监听器
<?xml version="1.0" encoding="UTF-8"?>

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

    <application>
        <system-event-listener>
            <system-event-listener-class>test.PreRenderViewListener</system-event-listener-class>
            <system-event-class>javax.faces.event.PreRenderViewEvent</system-event-class>
        </system-event-listener>
    </application>

</faces-config>

监听器示例:

public class PreRenderViewListener implements SystemEventListener {

    @Override
    public void processEvent(SystemEvent event) throws AbortProcessingException {
        UIViewRoot root = (UIViewRoot) event.getSource();
        System.out.println(root.getChildCount());
    }

    @Override
    public boolean isListenerForSource(Object source) {
        return true;
    }

}

答案 1 :(得分:0)

使用

<f:phaseListener type="de.xxx.listener.HeaderControlPhaseListener" />
模板中的

(facelets)对我来说很好。或者我有什么问题我不知道......? (我讨厌jsf中的faces-config.xml thingy并试图在jsf2中完全避免它)

相关问题