BLOGスタッフブログ

インソースマーケティングデザイン

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

インソースマーケティングデザインが書いた他の記事

見積もり・ご依頼など、
お気軽にご相談ください

本サイトはユーザーエクスペリエンスの向上などを目的に、Cookieを使用しています。
右記のバナーで「同意する」をクリックする、または本サイトを利用することにより、
お客様は弊社のCookieポリシーに同意したことになります。

同意します