JSF 2.0でforeach

ループ処理ってのはWebアプリではよく使われる処理ですね。テーブルやリスト、オプションタグ等の生成などいろんなところで使われてると思います。


JSFではコンポーネント単位で扱えるので扱わなくともアプリは作れるのですが、カスタマイズしたHTMLを生成することの需要はあること、Faceletsが標準で入ったことなどで他のWebアプリとの境目はどんどん減ってきています。

というわけでリストを生成してみる。

まずはBeanから。AからZまでのCharつめたListをかえすだけ。

package managed;

import java.util.ArrayList;
import java.util.List;


public class EachBean {
    private List<Character> items = new ArrayList<Character>();

    public EachBean() {

        for(int i=0;i<='Z'-'A';i++){
            char c = (char)('A'+i);
            items.add(c);
        }
    }
    

    public List<Character> getItems() {
        return items;
    }

}


続いてxhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <head>
        <title>each</title>
    </head>
    <body>
        <ul>

            <li jsfc="ui:repeat" value="#{EachBean.items}"
                var="item" varStatus="stat"  >
                #{stat.index}/#{item}<br/>
            </li>
        </ul>
    </body>
</html>

実行。

http://shin.cside.com/diary/2009/0829-01.png


生成されたXHTMLはこちら。非常にシンプルだ。

<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>each</title>
    </head>
    <body>
        <ul><li>
                0/A<br /></li><li>
                1/B<br /></li><li>
                2/C<br /></li><li>
                3/D<br /></li><li>
                4/E<br /></li><li>
                5/F<br /></li><li>
                6/G<br /></li><li>
                7/H<br /></li><li>
                8/I<br /></li><li>
                9/J<br /></li><li>
                10/K<br /></li><li>
                11/L<br /></li><li>
                12/M<br /></li><li>
                13/N<br /></li><li>
                14/O<br /></li><li>
                15/P<br /></li><li>
                16/Q<br /></li><li>
                17/R<br /></li><li>
                18/S<br /></li><li>
                19/T<br /></li><li>
                20/U<br /></li><li>
                21/V<br /></li><li>
                22/W<br /></li><li>
                23/X<br /></li><li>
                24/Y<br /></li><li>
                25/Z<br /></li>
        </ul>
    </body>
</html>

「ui:repeat」はjsfcで記述した場合タグ部分を繰り返すようだ。単独で利用することももちろん出来てその場合はc:forEachと同じ。



offsetやsizeという属性があるのでそれを使ってみる。

<li jsfc="ui:repeat" value="#{EachBean.items}"
                var="item" varStatus="stat" offset="3" size="5" >

http://shin.cside.com/diary/2009/0829-02.png
ふむ。