ユーザーがいずれかをクリックする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.xml
action
UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());