第25章 ELの拡張

標準のELは、メソッドへのパラメータはJavaコードにより渡される事を前提としています。 したがって、JSFのメソッドバインディングでは、 パラメータを渡すことは出来ません。 SeamではELを拡張して、パラメータを渡すことが出来るようにしています。この拡張は、下の例のように、 JSFのメソッドバインディングを含むすべての Seam のメソッド式に適用されます。

<s:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>

25.1. 設定

この拡張機能をfaceletで使うためには、faces-config.xmlに特別なview handler、 SeamFaceletViewHandlerを宣言する必要があります。

<faces-config>
    <application>
        <view-handler>org.jboss.seam.ui.facelet.SeamFaceletViewHandler</view-handler>
    </application>
</faces-config>

25.2. 使用方法

パラメータは括弧で囲み、それぞれはコンマで区切ります。

<h:commandButton action="#{hotelBooking.bookHotel(hotel, user)}" value="Book Hotel"/>

上記の例ではパラメータ、hoteluser が値式として評価され、 コンポーネントのbookHotel() に渡されます。 この方法で、@Inの代用をする事が出来ます。

パラメータには、下のように、どのような値式も使う事が出来ます。

<h:commandButton action="#{hotelBooking.bookHotel(hotel.id, user.username)}" value="Book Hotel"/>

文字列も、下のように、シングルクオート、あるいはダブルクオートで括って渡す事が出来ます。

<h:commandLink action=”#{printer.println( ‘Hello world!’ )}” value=”Hello”/>
<h:commandLink action=’#{printer.println( “Hello again” )}’ value=’Hello’/>

パラメータを渡す必要が有る無しに関わらず、アクションメソッドの全てに、この様な表記をすることができ、これにより、 式が値式ではなく、メソッド式であることを明確に示し、可読性を向上させる事が出来ます。

<s:link value="Cancel" action="#{hotelBooking.cancel()}"/>

25.3. 制約

以下の制約について留意してください。

25.3.1. JSP 2.1との非互換性

現時点でこの拡張は JSP 2.1とは非互換です。 したがって、この拡張をJSF 1.2で使う場合にはfaceletを使う必要があります。 JSP 2.0.ではこの拡張は問題なく動作します。

25.3.2. JavaコードからのMethodExpressionの呼び出し

通常、MethodExpressionMethodBinding が生成された時に パラメータの型はJSFにより伝えられますが、メソッドバインディングの場合、JSFは渡されるパラメータが存在しないことを前提としています。 この拡張によりパラメータの型は式が評価されるまで知ることは出来ませんので、2つのマイナーな問題を生じます。

  • Javaコード中でMethodExpressionを呼び出したとき、渡されたパラメータが無視されます。また、 式中で定義されたパラメータが優先されます。

  • 通常、methodExpression.getMethodInfo().getParamTypes() はいつでも安全に呼び出す事が 出来ます。 パラメータを伴う式の場合、 まづ MethodExpression を呼び出してから、 getParamTypes() を呼び出すようにしてください。

上の2つのようなケースは非常に稀で、Javaコード中でMethodExpressionを呼び出す必要が有るときにのみ、 適用されます。