いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Tapestry奮闘記-0011 (Forコンポーネント(1))

Forコンポーネントはループをしながら表示を行うためのコンポーネントです。
ループ元(ソースオブジェクト)には、コレクションやイテレータ、配列などが
指定できます。今回は、Form外でまずForコンポーネントを使用してデータを
表示してみます。

[HTMLテンプレート]

                    <!--
                    
                        Forコンポーネントを使用しリストを表示する。
                        (Forコンポーネントを使用。)

                        コンポーネントの使用方法については下記参照。

                    -->
                    <br/>
                    <hr/>
                    <div id="for_001" align="center">
                        <b>
                            Forコンポーネントを使用(1)<br/>
                            <br/>
                            ForコンポーネントをFormコンポーネント外で使用。<br/>
                        </b>
                        <br/>
                        出力: <br/>
                        <table border="1">
                            <tr>
                                <th>インデックスの値</th>
                                <th>Value 1</th>
                                <th>Value 2</th>
                                <th>Value 3</th>
                                <th>Value 4</th>
                            </tr>
                            <!--
                                Forコンポーネント
                                    ・source属性は、元となるコレクションもしくは配列もしくはイテレータを指定する
                                    ・value属性には、ループ変数を指定する
                                    ・index属性には、カウント変数を指定する
                                    ・element属性には、ループ毎にこのコンポーネントのbody部に記述されているデータを
                                     囲む要素を指定する。通常、Forコンポーネントはtable内部で使用されることが多いので
                                     trを指定することが多い模様。

                            -->
                            <!--

                                今回、リストデータの作成に、org.apache.tapestry.event.PageBeginRenderListenerを
                                使用して初期リスト作成を行っている。

                                また、value属性とindex属性に指定されている一時変数はページコンポーネントクラス(Javaクラス)に
                                記述せず、ページ仕様ファイルにプロパティとして定義している。

                            -->
                            <tr jwcid="@For" source="ognl:for001Values" value="ognl:aFor001Value" index="ognl:for001Index" element="literal:tr">
                                <td><span jwcid="@Insert" value="ognl:for001Index">値0</span></td>
                                <td><span jwcid="@Insert" value="ognl:aFor001Value.value1">値1</span></td>
                                <td><span jwcid="@Insert" value="ognl:aFor001Value.value2">値2</span></td>
                                <td><span jwcid="@Insert" value="ognl:aFor001Value.value3">値3</span></td>
                                <td>
                                    <span jwcid="@If" condition="ognl:aFor001Value.value4">○</span>
                                    <span jwcid="@Else">×</span>
                                </td>
                            </tr>
                        </table>
                        <br/>
                    </div>
                    <hr/>
                    <br/>

[ページ仕様ファイル]

<page-specification class="gsf.samples.tapestry.ThirdSample">

    <property name="radio001" initial-value="ognl:@gsf.samples.tapestry.ThirdSample@RADIO001"/>
    
    <property name="aFor001Value"/>
    <property name="for001Index"/>

</page-specification>

[データクラス]

package gsf.samples.tapestry;

import java.io.*;

public class For001Value implements Serializable{

    private String  value1;
    private String  value2;
    private Integer value3;
    private boolean value4;
    
    /**
     * Get value1.
     *
     * @return value1 as String.
     */
    public String getValue1(){
        return this.value1;
    }
    
    /**
     * Set value1.
     *
     * @param value1 the value to set.
     */
    public void setValue1(String value1){
        this.value1 = value1;
    }
    
    /**
     * Get value2.
     *
     * @return value2 as String.
     */
    public String getValue2(){
        return this.value2;
    }
    
    /**
     * Set value2.
     *
     * @param value2 the value to set.
     */
    public void setValue2(String value2){
        this.value2 = value2;
    }
    
    /**
     * Get value3.
     *
     * @return value3 as Integer.
     */
    public Integer getValue3(){
        return this.value3;
    }
    
    /**
     * Set value3.
     *
     * @param value3 the value to set.
     */
    public void setValue3(Integer value3){
        this.value3 = value3;
    }
    
    /**
     * Get value4.
     *
     * @return value4 as boolean.
     */
    public boolean getValue4(){
        return this.value4;
    }
    
    /**
     * Set value4.
     *
     * @param value4 the value to set.
     */
    public void setValue4(boolean value4){
        this.value4 = value4;
    }
}

[ページコンポーネントクラス]

package gsf.samples.tapestry;

import java.util.*;

import org.apache.tapestry.*;
import org.apache.tapestry.event.*;
import org.apache.tapestry.html.*;

public abstract class ThirdSample extends BasePage implements PageBeginRenderListener{

    public static final String RADIO001 = "radio button 1";
    public static final String RADIO002 = "radio button 2";
    public static final String RADIO003 = "radio button 3";

    /**
     * PageBeginRenderListenerの実装メソッド.<br/>
     * このメソッドは、ページがリクエストされる毎に最初に呼ばれる。<br/>
     * 
     * @param event イベントオブジェクト
     */
    public void pageBeginRender(PageEvent event){

        this.createFor001Values();

    }

    private void createFor001Values(){

        List<For001Value> values = new ArrayList<For001Value>();
        for(int i = 0; i < 20; i++){
            For001Value aFor001Value = new For001Value();
            aFor001Value.setValue1("value1-" + i);
            aFor001Value.setValue2("value2-" + i);
            aFor001Value.setValue3(i);

            if((i % 2) == 0){
                aFor001Value.setValue4(true);
            }else{
                aFor001Value.setValue4(false);
            }

            values.add(aFor001Value);
        }

        this.setFor001Values(values);

    }

    public abstract boolean getCheckbox001();
    public abstract void setCheckbox001(boolean value);

    public abstract String getRadio001();
    public abstract void setRadio001(String value);

    public abstract List<For001Value> getFor001Values();
    public abstract void setFor001Values(List<For001Value> values);

}

実行すると、画面上にテーブルが表示されます。
次は、Form内でForコンポーネントを使用してみます。
実際の開発では一覧画面からデータを修正したり、IDから
別ページに遷移したりするのが多いので、Form内で使用することの
方が多いでしょう。