4

Glassfish 3.1.2.2 と JSF Mojarra 2.1.6 を使用しています。

次の Facelets ページがあります。

<h:form>
  <h:commandLink value="link">
    <f:actionListener binding="#{backingBean.someMethod(1)}"/>
  </h:commandLink>
</h:form>

そして、次のバッキング Bean:

@RequestScoped
@ManagedBean
public class BackingBean {
  public void someMethod(int i) {
    System.out.println("It was called: " + i);
  }
}

リンクをクリックすると、「Info: It was called: 1」がコンソールに表示されます。

ドキュメントのbinding読み取り:

ライブラリ: http://xmlns.jcp.org/jsf/corehttp://java.sun.com/jsf/core (Jsf コア)

タグ: アクションリスナー

バインディング

javax.faces.event.ActionListener を実装するオブジェクトに評価される値バインディング式。[鉱山を強調]

また、この質問に対する受け入れられた回答ではf:actionListener、任意のメソッドを呼び出すことはできないと述べています。

サポートされていない場合、バッキング Bean メソッドが呼び出されるのはなぜですか?

4

1 に答える 1

6

これは、#{bean.method()}構文を介してプロパティを参照するだけでなく、構文を介して値式でメソッドを呼び出すという新しい EL 2.2 機能の結果です#{bean.property}(実際には正確なタイプである必要がありますActionListener)。EL 2.1 以前では機能せず、引数と括弧を削除しても機能しません。このドキュメントは、EL 2.2 が存在しなかったときに作成されました (2006 年 5 月のJSF 1.2 バージョンと比較して、実際には変更されていません。EL 2.2 は 2009 年 12 月に導入されました)。ただし、初心者にとって混乱を招くため、その部分の更新が必要であることに同意します。

あなたが見つけた答えはドキュメントに基づいて主張しましたが、回答者はbinding="#{testController.nodeListener}"失敗したもののbinding="#{testController.nodeListener(event)}" 実際には機能したという質問に基づいて認識していないようでした。これでは、合格する機会が与えられないだけですActionEventbinding="#{testController.nodeListener()}"代わりに使用して、呼び出しや引数としてUIComponent#getCurrentComponent()渡すなど、他の方法でイベント情報を取得することを提案した場合、答えはより良いものでした。#{component}もちろん、本当にそれを手に入れる必要がある場合に限ります。

<h:commandLink value="link">
    <f:actionListener binding="#{bean.someMethod(component)}"/>
</h:commandLink>
public void someMethod(UIComponent component) {
    System.out.println("It was called on: " + component); // HtmlCommandLink
}

以下も参照してください。

于 2015-06-10T07:31:42.553 に答える