Syboos jsf4jstl forEach tokenizer 実装例2

2008/11/20 12:00Update
TAGS: jsf4jstl | forEach | tokenizer | 繰り返し

JSPでデータを表示する際に、そのままのデータだと、思い通りの表示にならない場合があります。このような場合、表示にあわせてJavaBeanを修正することが当たり前ですが、forEach tokenizer機能を利用すれば、JavaBeanを修正しなくても済みます。

forEach tokenizer機能は、データを表示する前に、指定されるトークンクラスのオブジェクトを自動的に生成し、データの変換をかけることができます。


■JSP例:
<%@ taglib uri="http://tfaces.syboos.com/tag/core" prefix="tc" %>   

<tc:forEach items="#{myBean.list}" var="item" tokenizer="com.syboos.tokenizer.List2PairListTokenizer">
    <h:outputText value="左:#{item.left.name}"></h:outputText>
    <f:verbatim>--</f:verbatim>
    <h:outputText value="右:#{item.right.name}"></h:outputText>

    <f:verbatim><hr></f:verbatim>
</tc:forEach>  


■Beanクラス実装例:
//MyBean.java
public class MyBean {
    private List <Book> list;


    public List<Book> getList() {
        if (list != null) return list;

        list = new ArrayList<Book>();

        Book book01 = new Book("Book01");
        list.add(book01);

        Book book02 = new Book("Book02");
        list.add(book02);

        Book book03 = new Book("Book03");
        list.add(book03);
        //...
    }

    public void setList(List<Book> list) {
        this.list = list;
    }
}

//Book.java
public class Book {
    private String name;

    public Book(String name) {
        this.name = name;
    }

    //setter/getter TODO
    //...
}



■トークンクラス実装例
//List2PairListTokenizer
package com.syboos.tokenizer;

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

import com.syboos.faces.component.core.IForEachTokenizer;

public class List2PairListTokenizer implements IForEachTokenizer {
    public List2PairListTokenizer() {
        super();
    }

    // List<Object>  から List <Pair>に変換
    //例:
    //value = {"1", "2", "3", "4", "5"} List型の場合
    //戻り値 = {  ⇒List型
    //    {left: "1", right: "2"},  ⇒Pair型
    //    {left: "3", right: "4"},  ⇒Pair型
    //    {left: "5", right: null}  ⇒Pair型
    // } List型の形になります。
    @SuppressWarnings("unchecked")
    public Object tokenize(Object value) {
        if (value == null || value.equals("")
                || !(value instanceof List)) {
            return value;
        }
        
        List <Pair>ret = new ArrayList<Pair>();
        
        int i=0;
        for (Object obj : (List)value) {
            Pair pair = null;
            if (ret.size() <= i/2) {
                pair = new Pair();
                ret.add(pair);
            } else {
                pair = ret.get(i/2);
            }
            
            if (i%2 == 0) {
                pair.setLeft(obj);
            } else {
                pair.setRight(obj);
            }
            
            i++;
        }
                
        return ret;
    }
    
    public class Pair {
        private Object left;
        private Object right;
        
        public Pair () {
            
        }
        
        public Pair (Object left, Object right) {
            this.left = left;
            this.right = right;
        }

        public Object getLeft() {
            return left;
        }
        public void setLeft(Object left) {
            this.left = left;
        }
        public Object getRight() {
            return right;
        }
        public void setRight(Object right) {
            this.right = right;
        }
    }
    
    

    @SuppressWarnings("unchecked")
    public static void main(String []args) {
        List2PairListTokenizer x = new List2PairListTokenizer();
        
        List <String>list = new ArrayList<String>();
        list.add("0");
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        
        List <Pair> retList = (List<Pair>)x.tokenize(list);
    
        int i = 0;
        for (Pair pair:retList) {
            System.out.println((i++) + ": left=" + pair.getLeft() + " right=" + pair.getRight());
        }
    }
}


以上。

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments