ユーザーがいずれかをクリックするcommandButtonと、対応するアクションがマネージドBeanで呼び出されます。このアクション名を@PostConstructメソッドまたはイベントリスナーメソッドから取得することは可能ですか?
2 に答える
ボタンの名前=値のペアは、通常の方法で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
UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());