Tomcat環境でJSTLを設定し、forEachタグが機能しない問題を解決する方法

問題の症状

JSPファイル内で以下のようにc:forEachタグを使用しても、テーブルセル(<td>)にデータが表示されない現象が発生します。

<c:forEach var="book" items="[Books(bookId=1, bookName=Java, bookCounts=1, detail=入門から達人へ), Books(bookId=2, bookName=MySQL, bookCounts=10, detail=削除から復旧), Books(bookId=3, bookName=Linux, bookCounts=5, detail=基本から応用)]">
<tr>
<td>${book.bookId}</td>
<td>${book.bookName}</td>
<td>${book.bookCounts}</td>
<td>${book.detail}</td>
</tr>
</c:forEach>

上記コードでは、<td>タグ内の式が評価されず、空のセルが表示されます。

原因と解決策

1. JSTL依存関係の確認

まず、プロジェクトのビルドファイル(Mavenの場合はpom.xml)にJSTL関連の依存関係が正しく追加されているか確認します。

  • JSTL 1.2(javax命名空間、Tomcat 9以前)
<dependency>
  <groupId>taglibs</groupId>
  <artifactId>standard</artifactId>
  <version>1.1.2</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
  • JSTL 3.0(jakarta命名空間、Tomcat 10.1.x以降)
<dependency>
  <groupId>jakarta.servlet.jsp.jstl</groupId>
  <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
  <version>3.0.0</version>
</dependency>
<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>jakarta.servlet.jsp.jstl</artifactId>
  <version>3.0.1</version>
</dependency>

注意:Tomcat 10.1.xでは、実際には実装ライブラリのみで動作します。以下の1つの依存関係で十分です。

<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>jakarta.servlet.jsp.jstl</artifactId>
  <version>2.0.0</version>
</dependency>

API依存関係は推移的に解決されるため、明示的に宣言する必要はありません。

2. JSPファイルでのtaglib定義

JSPファイルの先頭で、使用するJSTLバージョンに応じたtaglibディレクティブを正しく記述します。

  • JSTL 1.0(古い形式)
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
  • JSTL 1.2(javax)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • JSTL 3.0(jakarta、Tomcat 10以降) JSTLコアタグのURIはURN形式に変更されています。
<%@ taglib prefix="c" uri="jakarta.tags.core" %>

3. データオブジェクトとEL式の整合性

items属性に指定されたデータがList<Books>のようなコレクションオブジェクトであることを確認します。上記の例では文字列リテラルが直接指定されていますが、実際の使用ではサーブレットやコントローラーからrequest.setAttribute("books", bookList)のようにオブジェクトを設定し、items="${books}"と参照する必要があります。

Booksクラスには適切なgetterメソッド(例:getBookId(), getBookName())が定義されていることも確認してください。

4. Tomcatバージョンに応じた選択

  • Tomcat 9以前:JSTL 1.2(javax)を使用します。以下の依存関係を追加します。
<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>jakarta.servlet.jsp.jstl</artifactId>
  <version>1.2.6</version>
</dependency>
  • Tomcat 10以降:Jakarta EE 9以降に対応したJSTL 3.0(jakarta)を使用します。

バージョン間でのURIや依存関係の違いに注意してください。適切なバージョンを選ばないと、「絶対URIを解決できない」や「taglibが見つからない」といったエラーが発生します。

補足

より詳細な情報やトラブルシューティングについては、Stack Overflowなどの技術フォーラムで「JSTLのインストール方法」や「絶対URI解決失敗」「NoClassDefFoundError」「ClassCastException」などのキーワードで検索することをお勧めします。

タグ: JSTL Tomcat foreach jakarta javax

6月28日 16:10 投稿