JSTLとは
JSP Standard Tag Library
の略でアクションタグのライブラリのことです。
JARファイルをライブラリとして読み込むことで.jsp ファイルのHTMLの中にJavaプログラムを記述できるようになります。
JSTL を記述するためには以下から2つのJARファイルダウンロードして WEB-INF/lib フォルダ内に配置する必要があります。
https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api/1.2
https://mvnrepository.com/artifact/org.glassfish.web/jstl-impl/1.2
c:forEach
c:forEach は反復構造を表現するためのCoreライブラリです。
Javaプログラムでいうところのfor 文や拡張for文がこれにあたります。
使用場面としてはデータベースからListのかたちで取ってきた複数のデータをjsp上で表示させる場面で多く使われます。
ForEachServlet
- package controller;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**Servlet implementation class CoreServlet
- */
- @WebServlet(“/foreach”)
- public class ForeachServlet extends HttpServlet {
- private static final long serialVersionUID = 1L; /**
- @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // リストの作成
- List<String> bango = new ArrayList<>();
- bango.add(“いち”);
- bango.add(“に”);
- bango.add(“さん”);
- request.setAttribute(“bango”, bango);
request.getRequestDispatcher("/WEB-INF/view/foreach.jsp").forward(request, response);
- }
- }
ForEachServlet のコード解説
- // リストの作成
- List<String> bango = new ArrayList<>();
- bango.add(“いち”);
- bango.add(“に”);
- bango.add(“さん”);
サーブレットにjspで表示させるリストを用意します。
- request.setAttribute(“bango”, bango);
request.getRequestDispatcher("/WEB-INF/view/foreach.jsp").forward(request, response);
用意した「bango」というリストをjspで表示できるようにリクエストスコープに格納します。
(“bango”, bango);
第一引数はjspの方で参照するときの文字列情報となります。
第二引数はサーブレット側で用意したList名の「bango」となります。
これでjsp側で 「bango」 というリストを利用できるようになります。
forEach.jsp
- <%@ page pageEncoding=”UTF-8″%>
- <%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>
- <%@ taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt” %>
- !DOCTYPE宣言
- <body>
- <h1>番号リスト</h1>
- <ul>
- <c:forEach items=”${bango}” var=”x”>
- <li> <c:out value=”${x}” /> </li>
- </c:forEach>
- </ul>
- </body>
- </html>
forEach.jsp のコード解説
- <ul>
- <c:forEach items=”${bango}” var=”x”>
- <li> <c:out value=”${x}” /> </li>
- </c:forEach>
- </ul>
List の中身をjspでリスト表示させます。
繰り返したい対象は<li>なので<ul>ではなく<li>を c:forEachで囲みます。
- <c:forEach items=”${bango}” var=”x”>
c:forEach の
items=”${bango}”
items 属性ではリスト「bango」を指定します。
Javaプログラムにおける拡張for文では格納用の変数を用意しましたが c:forEach では
var=”x”
のx変数の中にリストの中身を代入していきます。
${ } の利用場面はサーブレット側でrequest.setAttributeによってリクエストスコープに格納されたものを参照するときに利用します。したがって変数xは ${ } の 中には入れません。
その他 ${ } は変数に格納されているものを後から参照する際に利用します。
- <li> <c:out value=”${x}” /> </li>
c:forEach の中身を出力するために c:out を使用します。
ここでは変数に格納された「x」を参照するため ${ } の中にxを格納します。
まとめ
forEach.jsp の c:forEach 構文の
「items」には処理対象の配列やリスト等の名前
「var」には各要素を格納する変数名
を記述します。
c:forEach 構文 を利用することでjspファイルの中でJavaプログラムのfor文を利用することができるようになります。