2011-08-18 6 views
6

私のJSF2アプリケーションでは、Render_RESPONSEより前に実行する必要があるphaselistenerがありますが、JSFがビュールートを構築した後です。viewrootのビルド後にJSF2 phaselistenerを適用する方法は?

まず、Face-configにPhaseListenerを登録しました。リスナーが呼び出されますが、beforePhaseを実行すると、getViewRoot().getChildren()はまだ空です。

第二に、私は私のXHTMLページに以下を加えることにより、これを行う方法が見つかりました:

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

これは正常に動作しますが、私の各ページにこれを追加することが非常に面倒になります。 私はこれをアプリケーションのために一度行う可能性を探しています。

どのようにこれを行うことができますか?

答えて

7

面-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> 

例:(Faceletsの)テンプレートの

<f:phaseListener type="de.xxx.listener.HeaderControlPhaseListener" /> 

を用い

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; 
    } 

} 
+0

特定のコンポーネントがレンダリング/表示された後で(またはページ全体が表示された後に)上記のコードはカスタマイズすることができますか、それとも別の方法で行われますか? –

0

を私のためにうまく動作します。それとも私が気付いていない何か問題はありますか? (私はこのfaces-config.xmlをjsfで嫌い、jsf2で完全に回避しようとしています)

関連する問題