第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"/>
Copy to Clipboard Toggle word wrap
@Name("hotelBooking") 
public class HotelBooking { 
  public String bookHotel(Hotel hotel) { 
    // Book the hotel 
  } 
}
Copy to Clipboard Toggle word wrap

32.1.1. 使い方

Java からのメソッド呼び出しのように、パラメータは括弧で囲まれコンマで区切られます。
<h:commandButton action="#{hotelBooking.bookHotel(hotel, user)}" 
                 value="Book Hotel"/>
Copy to Clipboard Toggle word wrap
パラメータ hoteluser は値式として評価され、コンポーネントの bookHotel() メソッドに渡されます。
以下のように、パラメータにはいずれの値式も使用できます。
<h:commandButton action="#{hotelBooking.bookHotel(hotel.id, 
                           user.username)}" 
                 value="Book Hotel"/>
Copy to Clipboard Toggle word wrap
ページがレンダリングされるとパラメータの名前 hotel.id および user.username が保存され、 ページがサブミットされるときに値式として評価されます。 パラメータとしてオブジェクトを渡すことはできません。
ページがレンダリングされる場合だけでなくサブミットされる場合にもパラメータは使用可能である必要があります。ページがサブミットされるときに引数が解決できないと、アクションメソッドは null 引数を付けて呼び出されます。
一重引用符を用いてリテラル文字列を渡すこともできます。
<h:commandLink action="#{printer.println('Hello world!')}" 
               value="Hello"/>
Copy to Clipboard Toggle word wrap
Unified EL は値式にも対応し、バッキング Bean にフィールドをバインドするために使用されます。値式は JavaBean の命名規則を使用し getter と setter の組み合わせが必要です。 JSF は値の取得 (get) のみが必要な場合にも値式を必要とすることがよくあります (rendered 属性など)。しかし、多くのオブジェクトは適切な名前が付いたプロパティアクセサを持たず、パラメータを必要としません。
JBoss EL は、メソッド構文を使って値が取得されるようにすることでこの制約を取り除きます。例えば以下のとおりです。
<h:outputText value="#{person.name}" 
              rendered="#{person.name.length() > 5}" />
Copy to Clipboard Toggle word wrap
同様にして 1 つのコレクションのサイズにアクセスが可能です。
#{searchResults.size()}
Copy to Clipboard Toggle word wrap
一般的には #{obj.property} 形式の式は #{obj.getProperty()} 式と同一となります。
パラメータを使うこともできます。 次の例ではリテラル文字列の引数を持つ productsByColorMethod を呼び出しています。
#{controller.productsByColor('blue')}
Copy to Clipboard Toggle word wrap

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(); 
    }
    
    Copy to Clipboard Toggle word wrap
    <h:dataTable value="#{items}" var="item"> 
      <h:column> 
        <h:commandLink value="Select #{item.name}" 
           action="#{itemSelector.select(item})" /> 
      </h:column> 
    </h:dataTable>
    
    Copy to Clipboard Toggle word wrap
    ただし、 <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 を手作業で呼び出したい場合にのみ適用されます。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat