16

ページの読み込み中にバッキング Bean でメソッドを呼び出す必要があります。を使用して達成しました

<f:event listener="#{managedBean.onLoad}" type="preRenderView">

ただし、ページで ajax リクエストが行われるたびに、そのメソッドが再度呼び出されます。私の要件では必要ありません。ajaxリクエストでそのメソッド呼び出しを回避するには?

4

1 に答える 1

30

イベントは、preRenderViewビューをレンダリングする前に、すべてのリクエストで呼び出されます。ajax リクエストは、ビューをレンダリングするリクエストでもあります。したがって、動作は完全に予想されます。

基本的に 2 つのオプションがあります。

  1. Bean@PostConstructのメソッドで置き換えます。@ViewScoped

    @ManagedBean
    @ViewScoped
    public class ManagedBean {
    
        @PostConstruct
        public void onLoad() {
            // ...
        }
    
    }
    

    これは、Bean が初めて構築されるときにのみ呼び出されます。ビュー スコープの Bean インスタンスは、Ajax であろうとなかろうと、ポストバック全体で同じビューを操作している限り存続します。


  2. 現在のリクエストが ajax リクエストである場合は、リスナー メソッド内でチェックを実行します。

    @ManagedBean
    // Any scope.
    public class ManagedBean {
    
        public void onLoad() {
            if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) { 
                return; // Skip ajax requests.
            }
    
            // ...
        }
    
    }
    

    または、特に ajax リクエストではなくポストバックをスキップすることに実際に関心がある場合は、代わりに次のようにします。

            if (FacesContext.getCurrentInstance().isPostback()) { 
                return; // Skip postback requests.
            }
    
于 2013-02-04T15:13:00.900 に答える