1

メソッド

public void beforePhase(PhaseEvent event)
public void afterPhase(PhaseEvent event)

に関連付けられたメソッドの後に呼び出されている

<p:commandButton value="Login" action="#{checkUser.login}" ajax="false" />

ログオフ機能を実装しようとしているので、現在、ページを離れるにはボタンを 2 回押す必要があります。

上記の「フェーズリスナー」メソッドの前に「コマンドボタン」メソッドを呼び出す方法はありますか?

4

2 に答える 2

1

クライアントが新しい HTTP リクエストを発行できるようにするには、ログインとログアウトの後にリダイレクトを送信する必要があります。

例えば

public String login() {
    // ...
    return "home?faces-redirect=true";
}

public String logout() {
    // ...
    return "login?faces-redirect=true";
}

ところで、aPhaseListenerは要求ベースの認証を実行するための適切なツールではありません。Filter仕事にはサーブレットを優先する必要があります。にPhaseListenerは、JSF リクエストでのみ実行され、リクエストごとに最大 12 回呼び出されるという大きな欠点があります。このようなフィルターのキックオフの例については、EL 式を使用せずに Bean メソッドを提供する方法も参照してください。

于 2012-12-06T11:28:08.293 に答える
0

編集:私はBalusCの答えがおそらくこの問題を解決するための好ましい方法であるべきであることを指摘する必要があります。ただし、それでもフェーズオーダーを試してみたい場合は、読み続けてください。/ end-edit

実際、phaseListenersは、すべてのフェーズをリッスンするように実装した場合、action-attributeで指定されたメソッドの前後の両方で呼び出される可能性があります。

public class MyPhaseListener implements PhaseListener {
    public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; }

    public void beforePhase(PhaseEvent event) {
        System.out.println("Before Phase: " + event.getPhaseId());
    }
    public void afterPhase(PhaseEvent event)  {
        System.out.println("After Phase: " + event.getPhaseId());
    }
}

faces-config.xmlでリスナーをアクティブ化します

<faces-config ... >
    <lifecycle>
        <phase-listener>MyPhaseListener</phase-listener>
    </lifecycle>
</faces-config>

これは、すべてのリスナー呼び出しと、actionListenerとアクションが呼び出されたときのプリントアウトです。

INFO: Before Phase: RESTORE_VIEW 1
INFO: After Phase: RESTORE_VIEW 1
INFO: Before Phase: APPLY_REQUEST_VALUES 2
INFO: After Phase: APPLY_REQUEST_VALUES 2
INFO: Before Phase: PROCESS_VALIDATIONS 3
INFO: After Phase: PROCESS_VALIDATIONS 3
INFO: Before Phase: UPDATE_MODEL_VALUES 4
INFO: After Phase: UPDATE_MODEL_VALUES 4
INFO: Before Phase: INVOKE_APPLICATION 5
INFO: ActionListener Done
INFO: Action Done
INFO: After Phase: INVOKE_APPLICATION 5
INFO: Before Phase: RENDER_RESPONSE 6
INFO: After Phase: RENDER_RESPONSE 6
于 2012-12-06T08:31:43.010 に答える