明細行など入力フィールドの数が可変になるパラメータの受け取り方です。
明細行クラス
可変行のフィールドをまとめたクラスを作ります。
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:選択された値