Struts2:よくあるリストの追加、編集、削除画面のサンプル(Iteratorタグプチ解説) | プログラム垂れ流し

Struts2:よくあるリストの追加、編集、削除画面のサンプル(Iteratorタグプチ解説)

iteratorをよく使うのはこれかな?
マスター管理とかで使うような追加、編集、削除画面ですかね?

プログラム垂れ流し

とりあえずActionクラスにIteratorかCollectionの変数を定義してgetter,setterを作る。
(別に、定義せずともデータは無くて繰り返すだけなら画面側のタグだけで使える)
画面呼ぶ前に定義した変数にデータをセットしておく。

で、画面に書いていく。

●hogehoge.jsp
-------------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
<<<<pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript">
<!--
function deltag(index){
    var form = document.forms[0];
    form.editId.value = form.tagId[index].value;
    form.editName.value = form.tagName[index].value;
    if(!confirm(form.editName.value+"タグを削除しますか?")){
        return;
    }
    singleSubmit(form,"tag!delete.action");
}
function edittag(index){
    var form = document.forms[0];
    form.editId.value = form.tagId[index].value;
    form.editName.value = form.tagName[index].value;
    form.editViewst.value = form.viewStart[index].value;
    form.editViewed.value = form.viewEnd[index].value;
    if(!confirm(form.editName.value+"タグを編集しますか?")){
        return;
    }
    singleSubmit(form,"tag!update.action");
}
//-->
</script>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>メモを書く</title>
</head>
<body>
<s:form>
<div>
<table border="1" bordercolor="yellow">
    <tr>
        <th>名前</th>
        <th>開始</th>
        <th>終了</th>
        <th>更新日付</th>
        <th>編集</th>
        <th>削除</th>
    </tr>
    <s:iterator status="st" value="tagList" >
    <tr>
        <td><s:textfield name="tagName"/><s:hidden name="tagId"/></td>
        <td><s:textfield name="viewStart"/></td>
        <td><s:textfield name="viewEnd"/></td>
        <td><s:label name="updateDate"/></td>
        <td><input type="button" value="編集" name="btnDel" onclick="edittag('<s:property value="#st.index" />')"/></td>
        <td><input type="button" value="削除" name="btnDel" onclick="deltag('<s:property value="#st.index" />')"/></td>
    </tr>
    </s:iterator>
</table>
<table border="1" bordercolor="blue">
    <tr>
        <td><s:textfield name="addname"/></td>
        <td><s:textfield name="addviewst"/></td>
        <td><s:textfield name="addviewed"/></td>
        <td><s:submit value=" 追 加 " action="tag!add"/></td>
    </tr>
</table>
</div>
<s:hidden name="editId"/>
<s:hidden name="editName"/>
<s:hidden name="editViewst"/>
<s:hidden name="editViewed"/>
</s:form>
</body>
</html>
-------------------------------------------------
これで追加、変更、削除に必要な情報をActionまで持っていくことが出来る。

んじゃ、iteratorについて解説。

●Iteratorの設置
<s:iterator status="st" value="tagList" >

tagListはActionにてIteratorを定義している。
private Iterator<TomatoTagModel> tagList;
また、TomatoTagModelは各種変数が定義されている。

テキストフィールドに値を表示する場合→<s:textfield name="hogehoge"/>
普通に値を表示する場合→<s:property value="hogehoge"/>

とすればよい。
プリミティブなIteratorを使える値であるならこれでよい。

<s:property/>

これでIteratorの値の表示は出来たと思う。
次は、そのデータの取得。

●Iterator内コンポーネントの値の取得
今回の例では、コンポーネントにTextFieldを使用しているので、その値を取得する。
ここで重要になってくるのは、
<s:iterator status="st" value="tagList" >
のstatusです。
statusにはIterator自体のステータスが格納され、そこからいくつかの状態を取得することができる。
今回使っているのはindexだ。
<s:property value="#st.index" />
これは、Iteratorのループにおいて、0番目からのループ回数を取得する。

これをつかって、Iteratorコンポーネントの添え字を取得して、
Javasctiptにてdocumentの対象コンポーネントの添え字番目の値を取得して、Actionまで値を持っていく。

結構簡単でしたね。
Iteratorはもっとあるけど、今回はまあいいとしよう。

ちなみに、singleSubmitは別ファイルで定義してます。
よくある2重サブミット防止処理かませてformのアクション指定してサブミットさせてるだけです。

参考:http://struts.apache.org/2.1.8.1/struts2-core/apidocs/org/apache/struts2/components/IteratorComponent.html