在我的JSF2应用程序中,我有一个phaselistener需要在RENDER_RESPONSE之前执行,但是在JSF构建了viewroot之后。
首先,我所做的是在faces-config中注册我的PhaseListener。然后调用侦听器,但是当我执行beforePhase时,getViewRoot().getChildren()
仍为空。
其次,我通过在我的xhtml页面上添加以下内容找到了如何做到这一点:
<f:phaseListener type="be.application.PolicyController" />
这很好用,但是将它添加到我的每个页面都会非常繁琐。 因此,我正在为我的申请寻找一次这样做的可能性。
任何想法如何做到这一点?
答案 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中完全避免它)