3

ユーザーがいずれかをクリックするcommandButtonと、対応するアクションがマネージドBeanで呼び出されます。このアクション名を@PostConstructメソッドまたはイベントリスナーメソッドから取得することは可能ですか?

4

2 に答える 2

5

ボタンの名前=値のペアは、通常の方法でHTTPリクエストパラメータとして使用できます。コマンドボタンの生成されたHTML表現が次のようになっていると想像してください。

<input type="submit" name="formId:buttonId" value="Submit" ... />

formId:buttonId次に、null以外の値を持つ名前のリクエストパラメータとして存在します。JSFは、「要求値の適用」フェーズでこの情報を正確に使用して、ボタンが押されたかどうかを判別します。これはdecode()、ボタンコンポーネントに関連付けられたレンダラーのメソッド中に、おおよそ次のように発生します。

if (externalContext.getRequestParameterMap().containsKey(component.getClientId(context))) {
    component.queueEvent(new ActionEvent(component));
}

または、ajaxリクエストに関する場合は、代わりにボタンの名前をjavax.faces.Sourceリクエストパラメーターの値として使用できます。

if (component.getClientId(context).equals(externalContext.getRequestParameterMap().get("javax.faces.Source"))) {
    component.queueEvent(new ActionEvent(component));
}

いずれにせよ、ActionEventは最終的にプライベートフィールドとして保存さUIViewRootれ、パブリックAPIでは使用できません。したがって、リフレクションと実装固有のハックを取得しない限り、ここで話は終わりです。

押されたボタンを判別するための最善の策は、JSF自体と同じ方法で要求パラメーターマップを手動でチェックすることです。

質問から正確には明らかではない具体的な機能要件に応じて、代替案は、関心のあるすべてのコンポーネントを使用するactionListenerか、グローバルコンポーネントを登録するために使用することです。これは、実数が呼び出される直前に呼び出されます。<f:actionListener>UICommand<action-listener>faces-config.xmlaction

于 2012-08-08T11:48:00.180 に答える
0
UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());
于 2018-02-02T09:45:30.703 に答える