問題の症状
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」などのキーワードで検索することをお勧めします。