第32章 JBoss EL
Seam は JBoss EL を使用し、標準の統合式言語 (Unified Expression Language : Unified EL) を拡張します。これにより EL 式のパワーや表現力の機能拡張が実現します。
32.1. パラメータ化された式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
標準の EL によりメソッドをユーザー定義のパラメータで使用することはできませんが、JBoss EL を使用するとこの制約を解消できます。例えば以下のとおりです。
<h:commandButton action="#{hotelBooking.bookHotel(hotel)}"
value="Book Hotel"/>
<h:commandButton action="#{hotelBooking.bookHotel(hotel)}"
value="Book Hotel"/>
32.1.1. 使い方 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Java からのメソッド呼び出しのように、パラメータは括弧で囲まれコンマで区切られます。
<h:commandButton action="#{hotelBooking.bookHotel(hotel, user)}"
value="Book Hotel"/>
<h:commandButton action="#{hotelBooking.bookHotel(hotel, user)}"
value="Book Hotel"/>
パラメータ
hotel と user は値式として評価され、コンポーネントの bookHotel() メソッドに渡されます。
以下のように、パラメータにはいずれの値式も使用できます。
<h:commandButton action="#{hotelBooking.bookHotel(hotel.id,
user.username)}"
value="Book Hotel"/>
<h:commandButton action="#{hotelBooking.bookHotel(hotel.id,
user.username)}"
value="Book Hotel"/>
ページがレンダリングされるとパラメータの名前
hotel.id および user.username が保存され、 ページがサブミットされるときに値式として評価されます。 パラメータとしてオブジェクトを渡すことはできません。
ページがレンダリングされる場合だけでなくサブミットされる場合にもパラメータは使用可能である必要があります。ページがサブミットされるときに引数が解決できないと、アクションメソッドは
null 引数を付けて呼び出されます。
一重引用符を用いてリテラル文字列を渡すこともできます。
<h:commandLink action="#{printer.println('Hello world!')}"
value="Hello"/>
<h:commandLink action="#{printer.println('Hello world!')}"
value="Hello"/>
Unified EL は値式にも対応し、バッキング Bean にフィールドをバインドするために使用されます。値式は JavaBean の命名規則を使用し getter と setter の組み合わせが必要です。 JSF は値の取得 (get) のみが必要な場合にも値式を必要とすることがよくあります (
rendered 属性など)。しかし、多くのオブジェクトは適切な名前が付いたプロパティアクセサを持たず、パラメータを必要としません。
JBoss EL は、メソッド構文を使って値が取得されるようにすることでこの制約を取り除きます。例えば以下のとおりです。
<h:outputText value="#{person.name}"
rendered="#{person.name.length() > 5}" />
<h:outputText value="#{person.name}"
rendered="#{person.name.length() > 5}" />
同様にして 1 つのコレクションのサイズにアクセスが可能です。
#{searchResults.size()}
#{searchResults.size()}
一般的には
#{obj.property} 形式の式は #{obj.getProperty()} 式と同一となります。
パラメータを使うこともできます。 次の例ではリテラル文字列の引数を持つ
productsByColorMethod を呼び出しています。
#{controller.productsByColor('blue')}
#{controller.productsByColor('blue')}
32.1.2. 制約とヒント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
JBoss EL には制約がいくつかあります。
- JSP 2.1 との非互換性 − JBoss EL は現在 JSP 2.1 との併用はできません。 コンパイラがパラメータ付きの式を拒否するためです。 JSF 1.2 でこの拡張機能を使用したい場合は Facelets を使用する必要があります。 この拡張機能は JSP 2.0 では正常に動作します。
- 反復コンポーネント内での使用 −
<c:forEach />や<ui:repeat />といったコンポーネントはリストまたはアレイに対して反復を行い、 一覧内の各アイテムをネストされるコンポーネントに公開します。これは<h:commandButton />または<h:commandLink />を使った行を選択している場合に効果的です。@Factory("items") public List<Item> getItems() { return entityManager.createQuery("select ...").getResultList(); }@Factory("items") public List<Item> getItems() { return entityManager.createQuery("select ...").getResultList(); }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow ただし、<s:link />や<s:button />を使用したい場合はアイテムをDataModelとして公開して<dataTable />(または<rich:dataTable />のようなコンポーネントセットと同等) を使用しなければなりません。<s:link />または<s:button />のいずれもフォームをサブミットしないためブックマーク可能なリンクを生成しません。 アクションメソッドが呼び出された場合にそのアイテムを再度作成するためには追加のパラメータが必要です。DataModelで支えられるデータテーブルが使用される場合のみこのパラメータは追加可能です。 - Java コードから
MethodExpressionを呼び出す − 通常、MethodExpressionが作成されるとパラメータタイプが JSF によって渡されます。ただし、メソッドバインディングでは JSF は渡すパラメータがないとみなします。この拡張機能では、 式の評価が終了するまでパラメータタイプを知ることはできません。これにより以下の 2 つの結果が生じます。- Java コードで
MethodExpressionを呼び出すとき、渡すパラメータが無視される場合があります。 式で定義されたパラメータが優先されます。 - 通常、
methodExpression.getMethodInfo().getParamTypes()はいつでも安全に呼び出すことができます。パラメータを持つ式に関しては、まずMethodExpressionを呼び出してから、getParamTypes()を呼び出すようにしてください。
上記のようなケースは非常に稀であり、 Java コードでMethodExpressionを手作業で呼び出したい場合にのみ適用されます。