6. 可変行の入力フィールドの値を取得する

明細行など入力フィールドの数が可変になるパラメータの受け取り方です。

明細行クラス

可変行のフィールドをまとめたクラスを作ります。

package ww2.examples.event.input;

public class MultiInputFieldValue {
    private boolean check;

    private String text;

    private String select;

    public boolean isCheck() {
        return check;
    }

    public void setCheck(boolean check) {
        this.check = check;
    }

    public String getSelect() {
        return select;
    }

    public void setSelect(String select) {
        this.select = select;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String toString() {
        return "[check:" + check + "," + "text:" + text + "," + "select:"
                + select + "]";
    }
}

Action

Actionのgetterで明細行クラスをコンストラクタに指定したXWorkListを返すようにします。

package ww2.examples.event;

import java.util.List;

import ww2.examples.event.input.MultiInputFieldValue;

import com.opensymphony.xwork.ActionSupport;
import com.opensymphony.xwork.util.XWorkList;

public class MultiInputFieldAction extends ActionSupport {
    private List value = new XWorkList(MultiInputFieldValue.class);
    
    public String execute() throws Exception {
        System.out.println(value);
        return SUCCESS;
    }

    public List getValue() {
        return value;
    }

    public void setValue(List value) {
        this.value = value;
    }
}

multiinputfield.vmを作成

フィールド名は「"ActionのXWorkListのプロパティ名"["要素番号"]."明細行のフィールド名"」とします。

<form action="multiinputfield.action" method="POST">
<table>
<tr><th>checkbox</th><th>text</th><th>select</th></tr>
#foreach ( $item in [1..3] ) 
#set($num = $item - 1)
<tr>
<td><input type="checkbox" name="value[$num].check" value="true" /></td>
<td><input type="text" name="value[$num].text" /></td>
<td>
    <select name="value[$num].select">
        <option>A</option>
        <option>B</option>
        <option>C</option>
    </select>
</td>
</tr>
#end
</table>
<input type="submit" value="実行" />
</form>

xwork.xml

<action name="multiinputfield" class="ww2.examples.event.MultiInputFieldAction">
    <interceptor-ref name="defaultStack"/>
    <result name="success" type="dispatcher">
        <param name="location">/WEB-INF/vm/multiinputfield.vm</param>
    </result>
</action>

結果

checkbox:チェックされている場合はtrue、されていない場合はfalse
text:入力された場合はその値、未入力の場合は空文字
select:選択された値