【Java・jsp】JSTL Core一覧と使用方法!サンプルあり!

この記事は約55分で読めます。
JSTLCoreアイキャッチ

JavaでいうところのHTMLファイルに、jspファイルというものがあります。
(jspとは何かという説明は今回割愛します)

今回はjspファイルの中で使用できる、JSTL Core(Cタグのことです)
の使用方法をサンプルコードを交えて、
ご説明していきます。

JSTL Core 一覧

属性の中で必須属性のものには、下線を引いています。

タグ名使用用途属性補足
c:if条件分岐test, var, scope・複数分岐はできない
・scopeはpage, request, session, applicationの4つがセット可能
c:choose複数条件分岐c:when, c:otherwise と共に使用。c:whenはtest属性を指定して使用
c:forEach繰り返し構文items, begin, end, step, var, varStatus
c:catch例外処理var
c:forTokens文字列の分割と繰り返しitems, delims,begin,end,step,var,varStatus
c:import外部コンテンツのインポートurl, charEncoding, context, scope, var, varReaderscopeはpage, request, session, applicationの4つがセット可能
c:param他のJSTLタグへパラメータを渡すname, value
c:redirectリダイレクトするurl, context
c:urlURLに使用できない文字のエンコードや
相対パスを絶対パスへ変換
url, context, scope, varscopeはpage, request, session, applicationの4つがセット可能
c:set変数設定var, value, scope, target, propertyscopeはpage, request, session, applicationの4つがセット可能
c:remove変数の削除var, scopescopeはpage, request, session, applicationの4つがセット可能
c:out変数の出力value, default, escapeXml

サンプルコード

環境

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0</version>
    <relativePath /> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>JSTLSample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>JSTLSample</name>
  <description>Demo project for Spring Boot</description>
  <url />
  <licenses>
    <license />
  </licenses>
  <developers>
    <developer />
  </developers>
  <scm>
    <connection />
    <developerConnection />
    <tag />
    <url />
  </scm>
  <properties>
    <java.version>17</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- JSTLの利用 -->
    <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>
    <!-- jspをコンパイル -->
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <excludes>
            <exclude>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
            </exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

application.poperties

spring.application.name=JSTLSample

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

taglib.jsp

<%@ taglib uri="jakarta.tags.core" prefix="c"%>

<%
// サーバーのプロトコル(httpまたはhttps)
String scheme = request.getScheme();
// サーバー名
String serverName = request.getServerName();
// サーバーポート
int serverPort = request.getServerPort();
// コンテキストパス
String contextPath = request.getContextPath();

// ベースURLの生成
String baseURL = scheme + "://" + serverName + ":" + serverPort + contextPath + "/";

request.setAttribute("baseURL", baseURL);
%>

ファイル階層

  • /
    • src/
      • main/
        • java/
          • com/example/demo/
            • JstlSampleApplication.java
            • ServletInitializer.java
            • controller/
              • CoreConroller.java
        • resources/
          • static/
            • CSS/
              • core.css
          • application.properties
        • webapp/
          • WEB-INF/
            • views/
              • Core/
                • import_param.jsp
                • import.jsp
                • core.jsp
                • redirect.jsp
                • url.jsp
              • taglib.jsp
    • pom.xml

コード

以下のjspファイルは、全体像です。

タグごとに分けている部分は次にあります。

また、このjspではControllerより受け取った値を使用している部分もあります。
ご注意ください。

core.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="./../taglib.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<c:url value="/CSS/core.css" var="stylesheet" />
<link rel="stylesheet" type="text/css" href="${stylesheet}">
<title>${title}</title>
</head>
<body>

	<section>

		<h1>cタグ</h1>

		<!-- c:if よくあるif文  -->
		<div>
			<h2>if</h2>
			<div class="code-block">
				<c:if test="${ IF == 0 }">
				bbbbbbb
				</c:if>
				<c:if test="${ IF == 1 }">
				ccccccc
				</c:if>
			</div>
		</div>

		<!-- switch文のJSTLver -->
		<div>
			<h2>choose</h2>
			<div class="code-block">
				<c:choose>
					<c:when test="${choose < 100 }">100より小さい</c:when>
					<c:when test="${choose > 100 }">100より大きい</c:when>
					<c:otherwise>100</c:otherwise>
				</c:choose>
			</div>
		</div>

		<!-- よくあるforEach -->
		<div>
			<h2>forEach</h2>
			<div class="code-block">
				<c:forEach var="each" items="${Each}">
					<c:out value="${each}"></c:out>
				</c:forEach>
			</div>
		</div>

		<!-- よくあるtry-catchのcatch -->
		<div>
			<h2>catch</h2>
			<div class="code-block">
				<c:catch var="e">
					<c:out value="${ cat / 2 }"></c:out>
				</c:catch>

				<c:if test="${e != null }">
				例外発生 : <c:out value="${e.message}"></c:out>
				</c:if>
			</div>
		</div>

		<!-- 変数をセットする -->
		<div>
			<h2>set</h2>
			<div class="code-block">
				<c:set var="SET" value="セット"></c:set>
				<c:out value="${SET}"></c:out>
			</div>
		</div>

		<!-- 変数を削除する -->
		<div>
			<h2>remove</h2>
			<div class="code-block">
				<c:remove var="SET" />
				<c:if test="${empty SET}">
					SETは消されました。
				</c:if>
			</div>
		</div>

		<!-- 文字列を特定の文字で分割する -->
		<div>
			<h2>forTokens</h2>
			<div class="code-block">
				<c:forTokens var="forToken" items="${forTokens}" delims="${delims}">
					<c:out value="${forToken}"></c:out>
				</c:forTokens>
			</div>
		</div>

		<!-- 他のファイルをインポートする -->
		<div>
			<h2>import</h2>
			<div class="code-block">
				<c:import url="import.jsp" var="imported" charEncoding="UTF-8"></c:import>
				<c:out value="${IMPORT}"></c:out><br>
				<c:out value="${imported}"></c:out>
			</div>
		</div>

		<!-- 特定の処理のパラメータを渡す -->
		<div>
			<h2>param</h2>
			<div class="code-block">
				<c:import url="import_param.jsp">
					<c:param name="PARAM" value="パラメータ!"></c:param>
				</c:import>
			</div>
		</div>

		<!-- 指定のURLにリダイレクトする -->
		<div>
			<h2>redirect</h2>
			<div class="code-block">
				<c:if test="${!empty param.redirect}">
					<a href="${baseURL}jsp/init"><c:out value="${param.redirect}" /></a>
				</c:if>
				<c:if test="${empty param.redirect}">
					<c:set var="redirectSuffix" value="jsp/redirect"></c:set>
					<a href="<c:out value='${baseURL}${redirectSuffix}'/>">
						リダイレクトしますよ </a>
				</c:if>
			</div>
		</div>

		<!-- URLをエンコードする -->
		<div>
			<h2>url</h2>
			<div class="code-block">
				<c:if test="${empty param.redirectUrl}">
					<c:set var="urlSet" value="jsp/url" />
					<c:url value="${baseURL}${urlSet}" var="URL">
						<c:param name="urlTest" value="coreのurlを使用しているよ" />
					</c:url>
					<a href="${URL}">クリック</a>
				</c:if>

				<c:if test="${!empty param.redirectUrl}">
					<a href="${baseURL}jsp/init"><c:out
							value="${param.redirectUrl}" /></a>
				</c:if>
			</div>
		</div>

	</section>

</body>
</html>

タグごと

補足として、Controllerに記載している関連部分も載せています。

リンク

c:if
//c:ifの設定
model.put("IF", 1);
		<!-- c:if よくあるif文  -->
		<div>
			<h2>if</h2>
			<div class="code-block">
				<c:if test="${ IF == 0 }">
				bbbbbbb
				</c:if>
				<c:if test="${ IF == 1 }">
				ccccccc
				</c:if>
			</div>
		</div>
c:choose
//c:chooseの設定;
model.put("choose", 100);
		<!-- switch文のJSTLver -->
		<div>
			<h2>choose</h2>
			<div class="code-block">
				<c:choose>
					<c:when test="${choose < 100 }">100より小さい</c:when>
					<c:when test="${choose > 100 }">100より大きい</c:when>
					<c:otherwise>100</c:otherwise>
				</c:choose>
			</div>
		</div>
c:forEach
//c:forEachの設定
List<String> Each = new ArrayList<>();
Each.add("one");
Each.add("two");
Each.add("three");
model.put("Each", Each);
		<!-- よくあるforEach -->
		<div>
			<h2>forEach</h2>
			<div class="code-block">
				<c:forEach var="each" items="${Each}">
					<c:out value="${each}"></c:out>
				</c:forEach>
			</div>
		</div>
c:catch
//c:catchの設定
model.put("cat", "例外");
		<!-- よくあるtry-catchのcatch -->
		<div>
			<h2>catch</h2>
			<div class="code-block">
				<c:catch var="e">
					<c:out value="${ cat / 2 }"></c:out>
				</c:catch>

				<c:if test="${e != null }">
				例外発生 : <c:out value="${e.message}"></c:out>
				</c:if>
			</div>
		</div>
c:set, c:remove
		<!-- 変数をセットする -->
		<div>
			<h2>set</h2>
			<div class="code-block">
				<c:set var="SET" value="セット"></c:set>
				<c:out value="${SET}"></c:out>
			</div>
		</div>

		<!-- 変数を削除する -->
		<div>
			<h2>remove</h2>
			<div class="code-block">
				<c:remove var="SET" />
				<c:if test="${empty SET}">
					SETは消されました。
				</c:if>
			</div>
		</div>
c:forTokens
//c:forTokensの設定
StringBuilder forTokensBuilder = new StringBuilder();
forTokensBuilder.append("for,");
forTokensBuilder.append("Tokens,");
forTokensBuilder.append("Test");
model.put("forTokens", forTokensBuilder.toString());
model.put("delims", ",");
		<!-- 文字列を特定の文字で分割する -->
		<div>
			<h2>forTokens</h2>
			<div class="code-block">
				<c:forTokens var="forToken" items="${forTokens}" delims="${delims}">
					<c:out value="${forToken}"></c:out>
				</c:forTokens>
			</div>
		</div>
c:import
		<!-- 他のファイルをインポートする -->
		<div>
			<h2>import</h2>
			<div class="code-block">
				<c:import url="import.jsp" var="imported" charEncoding="UTF-8"></c:import>
				<c:out value="${IMPORT}"></c:out><br>
				<c:out value="${imported}"></c:out>
			</div>
		</div>
c:param
		<!-- 特定の処理のパラメータを渡す -->
		<div>
			<h2>param</h2>
			<div class="code-block">
				<c:import url="import_param.jsp">
					<c:param name="PARAM" value="パラメータ!"></c:param>
				</c:import>
			</div>
		</div>
c:url
		<!-- URLをエンコードする -->
		<div>
			<h2>url</h2>
			<div class="code-block">
				<c:if test="${empty param.redirectUrl}">
					<c:set var="urlSet" value="jsp/url" />
					<c:url value="${baseURL}${urlSet}" var="URL">
						<c:param name="urlTest" value="coreのurlを使用しているよ" />
					</c:url>
					<a href="${URL}">クリック</a>
				</c:if>

				<c:if test="${!empty param.redirectUrl}">
					<a href="${baseURL}jsp/init"><c:out
							value="${param.redirectUrl}" /></a>
				</c:if>
			</div>
		</div>

import.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="./../taglib.jsp"%>
<%-- インポートさきで以下の文言が表示される --%>
<c:set var="IMPORT" value="インポートされた!" scope="request"></c:set>
IMPORT : <c:out value="${IMPORT}"></c:out>

import_param.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="./../taglib.jsp"%>
<!-- このファイルをインポートすると、パラメータにセットしているキーがPARAMという値を出力する -->
<c:out value="${param.PARAM}"></c:out>

redirect.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="./../taglib.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${title}</title>
</head>
<body>

<!-- 初期ページへパラメータ付きでリダイレクトする -->
<c:set var="suffix" value="jsp/init"></c:set>
<c:redirect url="${baseURL}${suffix}">
<c:param name="redirect" value="リダイレクトされてるよ"></c:param>
</c:redirect>
</body>
</html>

url.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="./../taglib.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${title}</title>
</head>
<body>
	<c:set var="suffix" value="jsp/init" />
	<c:redirect url="${baseURL}${suffix}">
		<c:param name="redirectUrl" value="${param.urlTest}"/>
	</c:redirect>
</body>
</html>

CoreController.java

package com.example.demo.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/jsp")
public class CoreController {

	/**
	 * 初期表示
	 * @param model
	 * @return 初期ページ
	 */
	@GetMapping("/init")
	public String init(ModelMap model) {
		model.put("title", "jspSample");
		//c:ifの設定
		model.put("IF", 1);
		//c:chooseの設定;
		model.put("choose", 100);
		//c:catchの設定
		model.put("cat", "例外");

		//c:forEachの設定
		List<String> Each = new ArrayList<>();
		Each.add("one");
		Each.add("two");
		Each.add("three");
		model.put("Each", Each);

		//c:forTokensの設定
		StringBuilder forTokensBuilder = new StringBuilder();
		forTokensBuilder.append("for,");
		forTokensBuilder.append("Tokens,");
		forTokensBuilder.append("Test");
		model.put("forTokens", forTokensBuilder.toString());
		model.put("delims", ",");

		return "core";
	}

	/**
	 * c:redirectのコントローラ
	 * @param model
	 * @return 初期ページ
	 */
	@GetMapping("/redirect")
	public String redirect(ModelMap model) {
		model.put("title", "redirect");
		return "redirect";
	}

	/**
	 * c:urlの設定
	 * @param model
	 * @return 初期ページ
	 */
	@GetMapping("/url")
	public String url(ModelMap model) {
		model.put("title", "URL");
		return "url";
	}
}

core.css

@charset "UTF-8";

body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f9;
    margin: 0;
    padding: 20px;
}

section {
    background: #fff;
    padding: 20px;
    margin-bottom: 20px;
    border-radius: 8px;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

h1, h2 {
    color: #333;
}

div {
    margin-bottom: 15px;
}

a {
    color: #1e90ff;
    text-decoration: none;
}

a:hover {
    text-decoration: underline;
}

.code-block {
    background: #f4f4f9;
    padding: 10px;
    border-radius: 5px;
    border: 1px solid #ddd;
}

画面表示

jspSample画面表示例1
jspSample画面表示例2

redirect

redirectSample1
redirectSample2

url

urlSample1
urlSample2

サンプルコード詳細説明

環境

pom.xml

jsp、JSTL Coreを使用するにあたって、必須の依存関係があります。

    <!-- JSTLの利用 -->
    <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>

    <!-- jspをコンパイル -->
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>

この3つです。

JSTLの使用には上記2つの依存関係が、
jspの使用には最後の依存関係が必須となります。

application.properties

こちらにもjspを使用するにあたって必須のものがあります。

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

上記の2行は必須です。

特に2行目の
spring.mvc.view.suffix=.jsp
に関しては、設定値しければhtmlファイルを読み込もうとします。
そのため、うまくjspファイルを表示しません。

1行目の
spring.mvc.view.prefix=/WEB-INF/views/
は必須とまではいきませんが、設定値があった方が、
jspファイルの階層の指定が自由になります。

デフォルトでは、
src/main/webapp
の配下となりますが、それにプラスして、
Controllerで指定したパス(今回の場合だと/jsp)
も含まれてのファイル階層となります。

今回の例だと、spring.mvc.view.prefix=/WEB-INF/views/の記述がなければ、
core.jspを

  • src/
    • main/
      • webapp/
        • jsp/
          • core.jsp

に配置し、tablib.jspも同階層に
配置しておくと読み込みます。
(import.jsp, import_param.jsp, url.jspも同様に配置する必要があります)

taglib.jsp

1行目

<%@ taglib uri="jakarta.tags.core" prefix="c"%>

この部分でcタグを使用するための設定をしています。
必須です。

prefixの「c」部分は自由に設定できますのでcにする必要はないです。

が、指定無いならcが一般的なので、cで設定しておきましょう。

1行目より下の部分、

<%
// サーバーのプロトコル(httpまたはhttps)
String scheme = request.getScheme();
// サーバー名
String serverName = request.getServerName();
// サーバーポート
int serverPort = request.getServerPort();
// コンテキストパス
String contextPath = request.getContextPath();

// ベースURLの生成
String baseURL = scheme + "://" + serverName + ":" + serverPort + contextPath + "/";

request.setAttribute("baseURL", baseURL);
%>

上記はurlの前半部分をセットしていっています。

urlのセットの部分に関しての詳細は割愛します。

コード

ジャンプ用

core.jsp

3行目
<%@ include file="taglib.jsp"%>

この部分は、taglib.jspファイルを読み込んでいます。

taglib.jspファイルには、cタグを使用するために非常に大切な定義をしているので、
includeする必要があります。

includeしていないとcタグを使用できません。

taglib.jspの説明は、前でしています。(非常に簡潔なので見る必要はないかもです、、、)

c:if
		<!-- c:if よくあるif文  -->
		<div>
			<h2>if</h2>
			<div class="code-block">
				<c:if test="${ IF == 0 }">
				bbbbbbb
				</c:if>
				<c:if test="${ IF == 1 }">
				ccccccc
				</c:if>
			</div>
		</div>
//c:ifの設定
model.put("IF", 1);

どの言語でもよくある、if文です。

test属性の中身がtrueの場合、タグ内のhtmlを表示します。

(サンプルのtestタグ内の「IF」はControllerにてmodelにセットしている値の1です。)

今回はtestの2つ目がtrueのため、連続cの羅列が表示されています。

ただ、注意が必要なのは、elseがないということです。
条件分岐したい場合は、繰り返しif文を書くか、
次で紹介するchooseを使用するしかありません。

c:choose
		<!-- switch文のJSTLver -->
		<div>
			<h2>choose</h2>
			<div class="code-block">
				<c:choose>
					<c:when test="${choose < 100 }">100より小さい</c:when>
					<c:when test="${choose > 100 }">100より大きい</c:when>
					<c:otherwise>100</c:otherwise>
				</c:choose>
			</div>
		</div>
//c:chooseの設定;
model.put("choose", 100);

コメントに書いているように、よくあるswich分のJSTL Coreバージョンです。

c:chooseタグ内に、c:whenタグを記載し、
その中に、test属性を書き条件分岐します。
(ここが他の部分で言うcaseなどにあたります。)

(サンプルのタグ内の「choose」はControllerにてmodelにセットしている値100です。)

c:whenタグのtest属性のどの条件にも当てはまらないときに
c:otherwiseタグの内容を表示します。
(他の言語で言うdefaultなどにあたります)

c:forEach
		<!-- よくあるforEach -->
		<div>
			<h2>forEach</h2>
			<div class="code-block">
				<c:forEach var="each" items="${Each}">
					<c:out value="${each}"></c:out>
				</c:forEach>
			</div>
		</div>
//c:forEachの設定
List<String> Each = new ArrayList<>();
Each.add("one");
Each.add("two");
Each.add("three");
model.put("Each", Each);

よくあるforEachです。

itemsにループしたい変数を入れ、
ループする際の変数名をvarで指定して、ループさせます。
(他の言語で言うと拡張for文などにあたると思います)

サンプルでは、beginやend、stepなどは使用していませんが、
これらを用いることで、ループのさせ方を指定することも可能です。

beginは何番目の要素からスタートさせるかを指定し、
endは何番目までループさせるかを指定します。

また、stepは何個ずつループするかを指定します。

例えば、begin を0、stepを2、endを2とすると、奇数番の要素を3番目まで
出力することになります。
要素の数え方は0から始まりますので注意してください

奇数のみ出力の際のコードと出力例

		<!-- よくあるforEach -->
		<div>
			<h2>forEach</h2>
			<div class="code-block">
				<c:forEach var="each" items="${Each}" begin="0" end="2" step="2">
					<c:out value="${each}"></c:out>
				</c:forEach>
			</div>
		</div>
forEachのbeginとend
とstepセットver
c:catch
		<!-- よくあるtry-catchのcatch -->
		<div>
			<h2>catch</h2>
			<div class="code-block">
				<c:catch var="e">
					<c:out value="${ cat / 2 }"></c:out>
				</c:catch>

				<c:if test="${e != null }">
				例外発生 : <c:out value="${e.getMessage()}"></c:out>
				</c:if>
			</div>
		</div>
//c:catchの設定
model.put("cat", "例外");

他のプログラミング言語でも使用機会の多いであろう例外キャッチです。

例外が発生しそうな部分を囲っておくと、
catchのvar属性にセットした変数に発生した例外をセットしておけます。

サンプルでは、例外をキャッチして、
エラーメッセージを表示しています。

今回例外としてセットしている「e」で使用できるメソッドですが、
Exeptionクラスのメソッドと同じです。

ちなみに今回のe.getMessage()ですが、
e.messageとしても出力可能です。

c:set, c:remove
		<!-- 変数をセットする -->
		<div>
			<h2>set</h2>
			<div class="code-block">
				<c:set var="SET" value="セット"></c:set>
				<c:out value="${SET}"></c:out>
			</div>
		</div>

		<!-- 変数を削除する -->
		<div>
			<h2>remove</h2>
			<div class="code-block">
				<c:remove var="SET" />
				<c:if test="${empty SET}">
					SETは消されました。
				</c:if>
			</div>
		</div>

変数の設定と除去です。

setでは、varに変数名、valueにセットしたい値を設定します。

removeでは、削除したい変数名をvarに記載することで削除できます。

c:forTokens
		<!-- 文字列を特定の文字で分割する -->
		<div>
			<h2>forTokens</h2>
			<div class="code-block">
				<c:forTokens var="forToken" items="${forTokens}" delims="${delims}">
					<c:out value="${forToken}"></c:out>
				</c:forTokens>
			</div>
		</div>
//c:forTokensの設定
StringBuilder forTokensBuilder = new StringBuilder();
forTokensBuilder.append("for,");
forTokensBuilder.append("Tokens,");
forTokensBuilder.append("Test");
model.put("forTokens", forTokensBuilder.toString());
model.put("delims", ",");

変数を、指定の文字列で分割し、分割してできた要素分
ループして処理します。

分割したいものをitems属性にセットし、
何で分割したいかをdelims属性にセット、
そして分割後の変数名をvar属性にセットしてループしています。

サンプルでは、「for,Tokens,Test」という文字列を「,」で分割し出力しています。

c:import
		<!-- 他のファイルをインポートする -->
		<div>
			<h2>import</h2>
			<div class="code-block">
				<c:import url="import.jsp" var="imported" charEncoding="UTF-8"></c:import>
				<c:out value="${IMPORT}"></c:out><br>
				<c:out value="${imported}"></c:out>
			</div>
		</div>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="taglib.jsp"%>
<%-- インポートさきで以下の文言が表示される --%>
<c:set var="IMPORT" value="インポートされた!" scope="request"></c:set>
IMPORT : <c:out value="${IMPORT}"></c:out>

他のファイルをインポートします。

url属性にインポートしたいファイルパスをセットすることでインポートでき、
それをvar属性にセットした値の変数でセットします。
var属性をセットしなければ、そのまま出力されます。

サンプルは、
インポートしたimport.jsp内でセットしている「IMPORT」を
core.jsp出力した後に、import.jsp自身を出力しています。

そのため、「インポートされた!」(IMPORTの出力)の後に
「IMPORT : インポートされた!」(import.jspの出力。import.jspの6行目が出力されている)
と出力されています。

import.jspにあるc:setタグ内のscope属性のrequestは、
HTTPリクエスト(Controller→Model→Viewの流れ)の中で使用できる変数をセットする
という意味になります。

この設定値がないと、インポート先のcore.jspで使用することができません。

c:param
		<!-- 特定の処理のパラメータを渡す -->
		<div>
			<h2>param</h2>
			<div class="code-block">
				<c:import url="import_param.jsp">
					<c:param name="PARAM" value="パラメータ!"></c:param>
				</c:import>
			</div>
		</div>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="taglib.jsp"%>
<!-- このファイルをインポートすると、パラメータにセットしているキーがPARAMという値を出力する -->
<c:out value="${param.PARAM}"></c:out>

ファイルをインポートする際などにパラメータを渡します。
渡したパラメータは、${param.パラメータ名}で使用することができます。

サンプルでは、「PARAM」というパラメータ名でimport_param.jspにパラメータを渡し、
渡されたパラメータが、import_param.jspのファイル上で出力されているので、
core.jspでそのまま出力されています。

c:redirect
		<!-- 指定のURLにリダイレクトする -->
		<div>
			<h2>redirect</h2>
			<div class="code-block">
				<c:if test="${!empty param.redirect}">
					<a href="${baseURL}jsp/init"><c:out value="${param.redirect}" /></a>
				</c:if>
				<c:if test="${empty param.redirect}">
					<c:set var="redirectSuffix" value="jsp/redirect"></c:set>
					<a href="<c:out value='${baseURL}${redirectSuffix}'/>">
						リダイレクトしますよ </a>
				</c:if>
			</div>
		</div
	/**
	 * c:redirectのコントローラ
	 * @param model
	 * @return 初期ページ
	 */
	@GetMapping("/redirect")
	public String redirect(ModelMap model) {
		model.put("title", "redirect");
		return "redirect";
	}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="taglib.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${title}</title>
</head>
<body>

<!-- 初期ページへパラメータ付きでリダイレクトする -->
<c:set var="suffix" value="jsp/init"></c:set>
<c:redirect url="${baseURL}${suffix}">
<c:param name="redirect" value="リダイレクトされてるよ"></c:param>
</c:redirect>
</body>
</html>

指定したurlへリダイレクトします。
その際にControllerに設定があれば、そこを経由します。

サンプルは少し複雑な構造になっていますが、説明すると、

rediectというパラメータがない
→jsp/redirectにgetリクエストする「リダイレクトしますよ」というリンクを表示
→リンクをクリック
→該当のControllerを経由しredirect.jspを表示
→c:redirectとc:paramによりkeyに「redirect」、値に「リダイレクトされてるよ」というパラメータ付きでjsp/initへgetリクエスト
→該当のControllerを経由しcore.jspを表示
→redirectというパラメータが存在するのでredirectのパラメータの値を画面表示

という流れになります。

c:url
		<!-- URLをエンコードしたり、相対パスを絶対パスに変更したりする -->
		<div>
			<h2>url</h2>
			<div class="code-block">
				<c:if test="${empty param.redirectUrl}">
					<c:set var="urlSet" value="url" />
					<c:url value="${urlSet}" var="URL">
						<c:param name="urlTest" value="coreのurlを使用しているよ" />
					</c:url>
					<a href="${URL}">クリック</a>
				</c:if>

				<c:if test="${!empty param.redirectUrl}">
					<a href="${baseURL}jsp/init"><c:out
							value="${param.redirectUrl}" /></a>
				</c:if>
			</div>
		</div>
	/**
	 * c:urlの設定
	 * @param model
	 * @return 初期ページ
	 */
	@GetMapping("/url")
	public String url(ModelMap model) {
		model.put("title", "URL");
		return "url";
	}
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="taglib.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${title}</title>
</head>
<body>
	<c:set var="suffix" value="jsp/init" />
	<c:redirect url="${baseURL}${suffix}">
		<c:param name="redirectUrl" value="${param.urlTest}"/>
	</c:redirect>
</body>
</html>

URLに使用できない文字をエンコードしたり、相対パスを絶対パスに変換したりして、
URLを作成します。

サンプルでは相対パスの「url」を絶対パス「http://localhost:8080/jsp/url」へ
変換しています。(パラメータは省略)

このサンプルのリンクをクリックした際の挙動は少々煩雑ですが、
c:redirectでの挙動と同じように動作しますので、動きを追いたい方は
c:redirectの詳細説明部分を一読してから追うことをおすすめします。