インソースマーケティングデザイン
2016.08.19 システム
[JAVA]StrutsのJSPで「logic:iterate」を入れ子にするとおかしい
こんにちは。エンジニアの高田です。
もうすっかり夏ですね。暑すぎます。。。
リオオリンピックの方も熱いです!
選手の方々のがんばっている姿を見ると、がんばらなきゃなって思いますよね。
そんな訳で(?)今日は、先日StrutsのJSPにおいて困ってしまった件をご紹介します。
それをがんばって(?)解決したという。。。
「logic:iterate」の入れ子がおかしい
StrutsのJSPにおいて「logic:iterate」を入れ子にして一覧表を作ってみましたのですが、
しかし、思い通りのHTMLが出力されません。indexのカウントアップ部分がおかしいのです。
JSPは以下の通り。
<table>
<logic:iterate id="row" name="testForm" property="rows" indexId="index">
<tr>
<td><html:text name="row" property="code" indexed="true" /></td>
<logic:iterate id="col" name="testForm" property="cols" indexId="col_idx">
<td><html:text name="row" property="${col["col_name"]}" indexed="true" /></td>
</logic:iterate>
</tr>
</logic:iterate>
</table>
各種構造はこんな感じ。
public class testForm extends ActionForm {
private List _rows = new ArrayList();
private List _cols = new ArrayList();
public List getRows() {
return _rows;
}
public void setRows(List rows) {
_rows = rows;
}
public RowItem getRow(int index) {
return (RowItem) _rows.get(index);
}
public List getCols() {
return _cols;
}
public void setCols(List cols) {
_cols = cols;
}
public ColItem getCol(int index) {
return (ColItem) _cols.get(index);
}
}
public class RowItem {
private String _code = "";
private String _col_name1 = "";
・・・
private String _col_name10 = "";
}
public class ColItem {
private String _col_name = "";
private String _col_type = "";
・・・
}
出力されるHTMLは以下の通り。
<table>
<tr>
<td><input type="text" name="row[0].code"></td>
<td><input type="text" name="row[0].col_name1"></td>
<td><input type="text" name="row[1].col_name2"></td>
<td><input type="text" name="row[2].col_name3"></td>
</tr>
<tr>
<td><input type="text" name="row[1].code"></td>
<td><input type="text" name="row[0].col_name1"></td>
<td><input type="text" name="row[1].col_name2"></td>
<td><input type="text" name="row[2].col_name3"></td>
</tr>
<tr>
<td><input type="text" name="row[2].code"></td>
<td><input type="text" name="row[0].col_name1"></td>
<td><input type="text" name="row[1].col_name2"></td>
<td><input type="text" name="row[2].col_name3"></td>
</tr>
</table>
期待しているHTMLは以下の通り。
<table>
<tr>
<td><input type="text" name="row[0].code"></td>
<td><input type="text" name="row[0].col_name1"></td>
<td><input type="text" name="row[0].col_name2"></td>
<td><input type="text" name="row[0].col_name3"></td>
</tr>
<tr>
<td><input type="text" name="row[1].code"></td>
<td><input type="text" name="row[1].col_name1"></td>
<td><input type="text" name="row[1].col_name2"></td>
<td><input type="text" name="row[1].col_name3"></td>
</tr>
<tr>
<td><input type="text" name="row[2].code"></td>
<td><input type="text" name="row[2].col_name1"></td>
<td><input type="text" name="row[2].col_name2"></td>
<td><input type="text" name="row[2].col_name3"></td>
</tr>
</table>
なぜかcolのループの中でrowのindexがカウントアップされてしまいます。
JSTLの導入
そこでJSTL (JSP Standard Tag Library) を導入しました。
JSTLとは、JavaServer Pages Standard Tag Libraryの略で、JSPで利用される標準的なカスタムタグをまとめたものだそうです。
TOMCATのサイトからダウンロードしてみました。
URL:http://tomcat.apache.org/download-taglibs.cgi
・taglibs-standard-impl-1.2.5.jar
・taglibs-standard-jstlel-1.2.5.jar
・taglibs-standard-spec-1.2.5.jar
ダウンロードしたjarを「WEB-INF/lib」フォルダに入れ、パスを通しました。
参考にしたサイト:http://blog.clock-up.jp/entry/2015/01/28/tomcat-jstl
JSTLの「c:forEach」を利用
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<table>
<logic:iterate id="row" name="testForm" property="rows" indexId="index">
<tr>
<td><html:text name="row" property="code" indexed="true" /></td>
<c:forEach var="col" items="${testForm.cols}" varStatus="status">
<td><html:text name="row" property="${col["col_name"]}" indexed="true" /></td>
</c:forEach>
</tr>
</logic:iterate>
</table>
これで期待通りのHTMLが出力されました。
JSTLには他にも便利なタグが用意されているようで、使えそうです。
ではまた。
参考サイト:http://www.javaroad.jp/opensource/js_taglibs4.htm