JSF2.2入門 第10回ELの基本


kanban10

katatsumuriEL(Expression Language)

はJSFやJSPにおいて、つまりはJavaEEの世界において、プレゼンテーションレイヤーからマネージドビーンというアプリケーションのロジックレイヤーに簡単にアクセスできるようにする重要なコミュニケーション機能です。ここでは基本的な使い方について説明します。

leafマネージドビーンのプロパティへのアクセス

これまでのサンプルでも使ってきたように、ユーザー入力をマネージドビーンの特定のプロパティに送信して設定するにはh:inputTextタグのvalueプロパティに#{ビーン名.プロパティ名}というEL式を指定します。

<h:inputText value=”#{userBean2.userName}”/>

同様にh:outputTextで同じEL式を使うと、マネージドビーンのプロパティの現在の値が表示できます。

つまり次の図のようにEL式によってマネージドビーンとの間で設定と読み出しが簡単にできるというわけです。具体的にはマネージドビーンのメソッドがコールされます。

EL1

leafマネージドビーンの内部クラスのプロパティにアクセス

2つ目の例として、マネージドビーンのプロパティにアクセスするというところまでは同じですが、そのプロパティがオブジェクトであった場合にどうなるでしょうか。Stringもオブジェクトですが、それとは別に。

次の図にあるBookBeanは1冊の本の情報を保持するものです。title(題名)、auther(著者)まではStringです。Detailオブジェクトとしてbookdetailを持っています。これはpubdate(出版日)、pages(ページ数)、publisher(出版社)などさらに詳細情報を意味します。

次のh:outputTextは詳細情報の中のpubdateを表示するものです。つまりマネージドビーンの中の子供クラスの中のプロパティを読み出しています。このような場合には#{bookBean.bookdetail.pubdate}と入れ子状に表現すればよいのです。EL2

もちろんJavaのクラスとしてはこのDetailクラスはマネージドビーンの中で定義されている必要はありません。アクセスできるようになっていれば外でも構いません。

アクセス方法は単純にピリオドで接続する方法のほかにカッコとシングルクォーテーションを使った方法のどちらも可能です。それらのミックスでも構いません。

<h:outputText value=”#{bookBean.bookdetail.pubdate}”/>

<h:outputText value=”#{bookBean[‘bookdetail’][‘pubdate’]}”/>

シングルクオーテーションとダブルクォーテーションは次のどちらかのパターンにします。”#{aaa[‘bbb’][‘ccc’]}”か’#{aaa[“bbb”][“ccc”]}’、前者のほうが自然でしょうね。

leafここまでのまとめ

次のようなJSFページにすると

<h:panelGrid columns=”2″ styleClass=”grid”>
タイトル<h:outputText value=”#{bookBean.title}”/>
著者<h:outputText value=”#{bookBean.auther}”/>
ページ数<h:outputText value=”#{bookBean.bookdetail.pages}”/>
発行年<h:outputText value=”#{bookBean.bookdetail.pubdate}”/>
出版社<h:outputText value=”#{bookBean.bookdetail.publisher}”/>
</h:panelGrid>

こんなふうに表示されます。

el2output

マネージドビーンは次のようになっています。

[BookBean.java]

public class BookBean implements Serializable{
String title;
String auther;
Detail bookdetail;
public BookBean() {
title=”吾輩は猫である”;
auther=”夏目漱石”;
bookdetail=new Detail(“1905-10-06″,500,”服部書店”);
}
・・・
public class Detail{
String pubdate;
int pages;
String publisher;
public Detail(String pubdate,int pages,String publisher){
this.pubdate=pubdate;
this.pages=pages;
this.publisher=publisher;
}
・・・
}}

leafマネージドビーンの配列プロパティにアクセス

もしプロパティが配列の場合にどのようにアクセスするか説明しましょう。次のBookBeanではbungakuShubetsuが要素2つをもつ配列になっています。この例ではコンストラクタで設定してしまっています。

public class BookBean implements Serializable{
・・・
String[] bungakuShubetsu=new String[2];
・・・
public BookBean() {
・・・
bungakuShubetsu[0]=”日本文学”;bungakuShubetsu[1]=”小説”;
・・・
}
・・・
public String[] getBungakuShubetsu() {
return bungakuShubetsu;
}
・・・
}

JSFページから配列プロパティを参照するには、基本的には次のようにします。ごく自然に配列のインデックスを指定します。

<h:outputText value=”#{bookBean.bungakuShubetsu[0]}”/>
<h:outputText value=”#{bookBean.bungakuShubetsu[1]}”/>

leaf便利な配列へのアクセス

JSTLのcoreタグやuiタグを使うと繰り返し動作で簡単に配列を表示できます。

1.c:forEach その1

これはforループですね。アクセスする要素の開始と終了インデックスを指定することができます。なおこのコードはh:panelGridタグで挟んでいます。

<c:forEach begin=”0″ end=”1″ var=”i”>
要素#{i}は#{bookBean.bungakuShubetsu[i]}
</c:forEach>

el3array

2.c:forEach その2

インデックス指定なしでループするパターン。

<c:forEach var=”item” items=”#{bookBean.bungakuShubetsu}”>
#{item}
</c:forEach>

3.ui:repeat

ループの別パターン。

<ui:repeat var=”item” value=”#{bookBean.bungakuShubetsu}”>
#{item},
</ui:repeat>

これもh:panelGridタグでcolumns=”2″としていますが、前の2事例とは違って1つのセルに詰め込まれてしまいます。

el4array

なおこれらのcやuiタグを使うにはJSFページのxhtmlで次のようしておく必要があります。

<html xmlns=”http://www.w3.org/1999/xhtml”
xmlns:h=”http://xmlns.jcp.org/jsf/html”
xmlns:c=”http://xmlns.jcp.org/jsp/jstl/core”
xmlns:ui=”http://xmlns.jcp.org/jsf/facelets”>

 

previousnext

JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA