JSTLライブラリの手引き
1概要
JavaServer Pagesタグライブラリ(JSTL)は、ループ、条件付き書式設定などの一般的な操作を実装するために使用できるタグのセットです。
このチュートリアルでは、JSTLの設定方法と多数のタグの使用方法について説明します。
2セットアップ
JSTL機能を有効にするには、ライブラリをプロジェクトに追加する必要があります。
Mavenプロジェクトの場合は、
pom.xml
ファイルに依存関係を追加します。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
ライブラリをプロジェクトに追加したら、次のようにtaglibディレクティブを使用して、コアのJSTLタグとその他のタグのネームスペースファイルをJSPに追加します。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
次に、大きく5つのカテゴリに分類されるこれらのタグについて見ていきます。
3コアタグ
-
JSTLコアタグライブラリには、値の出力、変数の宣言、例外処理、繰り返しの実行、条件付きステートメントの宣言など、基本的な操作を実行するためのタグが含まれています。
コアタグを見てみましょう。
3.1.
<c:out>
タグ
-
<c:out>
は、変数に含まれる値または暗黙の式の結果を表示するために使用されます。
value、default、およびescapeXMLの3つの属性があります。
escapeXML
属性は、
value__属性またはそのエンクロージャーに含まれる生のXMLタグを出力します。
<c:out>
タグの例は次のようになります。
<c:out value="${pageTitle}"/>
3.2.
<c:set>
タグ
<c:set>
タグは、JSPでスコープ付き変数を宣言するために使用されます。変数の名前とその値をそれぞれ
var
属性と
value
属性で宣言することもできます。
例は次の形式になります。
<c:set value="JSTL Core Tags Example" var="pageTitle"/>
3.3.
<c:remove>
タグ
<c:remove>
タグはスコープ変数を削除します。これは
null
を変数に代入することと同じです。これは
var
および
scope
属性を取り、
scope
はすべてのスコープのデフォルト値を持ちます。
以下に、
<c:remove>
tagの使用例を示します。
<c:remove var="pageTitle"/>
3.4.
<c:catch>
タグ
<c:catch>
タグは、そのエンクロージャ内でスローされた例外をすべてキャッチします。
例外がスローされると、その値はこのタグの
var
属性に格納されます。
典型的な使い方は次のようになります。
<c:catch var ="exceptionThrown">
<% int x = Integer.valueOf("a");%>
</c:catch>
そして、例外がスローされたかどうかを確認するには、以下のように
<c:if>
タグを使用します。
<c:if test = "${exceptionThrown != null}">
<p>The exception is : ${exceptionThrown} <br/>
There is an exception: ${exceptionThrown.message}
</p>
</c:if>
3.5.
<c:if>
タグ
<c:if>
は、
test
属性がtrueと評価された場合にのみ囲まれたスクリプトレットを表示または実行する条件付きタグです。
評価結果は、その
var
属性に格納できます。
3.6.
<c:>
を選択、
<c:when>
、
<c:それ以外>
Tags
<c:choose>
は、switchに似た式またはif-else式を実行する際に使用される親タグです。 2つのサブタグがあります。 if/else-ifおよびelseを表す
<c:when>
および
<c:else>>
。
<c:when>
は評価される式を保持する
test
属性を取ります。以下に、これらのタグの使用例を示します。
<c:set value="<%= Calendar.getInstance().get(Calendar.SECOND)%>" var="seconds"/>
<c:choose>
<c:when test="${seconds le 30 }">
<c:out value="${seconds} is less than 30"/>
</c:when>
<c:when test="${seconds eq 30 }">
<c:out value="${seconds} is equal to 30"/>
</c:when>
<c:otherwise>
<c:out value="${seconds} is greater than 30"/>
</c:otherwise>
</c:choose>
3.7.
<c:import>
タグ
<c:import>
タグは、絶対URLまたは相対URLからのコンテンツの取得と公開を処理します。
url
属性と
var
属性を使用して、それぞれURLとそのURLから取得したコンテンツを保持できます。たとえば、URLからコンテンツをインポートすることができます。
<c:import var = "data" url = "http://www.example.com"/>
3.8.
<c:forEach>
タグ
<c:forEach>
タグは、Javaのfor、while、do-whileの構文に似ています。
items
属性は反復対象の項目のリストを保持し、
begin
属性と
end
属性はそれぞれ開始インデックスと終了インデックスを保持します(ゼロインデックス)。
<c:forEach>
タグには、各反復後のインデックス増分のサイズを制御する
step
属性もあります。以下に、使用例を示します。
<c:forEach var = "i" items="1,4,5,6,7,8,9">
Item <c:out value = "No. ${i}"/><p>
</c:forEach>
3.9.
<c:forTokens>
タグ
<c:forTokens>
タグは、
String
をトークンに分割して反復するために使用されます。
<c:forEach>
タグと同様に、
items
属性と、次のように
String
の区切り文字である追加の
delim
属性があります。
<c:forTokens
items = "Patrick:Wilson:Ibrahima:Chris"
delims = ":" var = "name">
<c:out value = "Name: ${name}"/><p>
</c:forTokens>
3.10.
<c:url>
と
<c:param>
タグ
<c:url>
タグは、適切なリクエストエンコーディングでURLをフォーマットするのに役立ちます。フォーマットされたURLは
var
属性に格納されています。
<c:url>
タグには、URLパラメータを指定するために使用される
<c:param>
サブタグもあります。以下に例を示します。
<c:url value = "/core__tags" var = "myURL">
<c:param name = "parameter__1" value = "1234"/>
<c:param name = "parameter__2" value = "abcd"/>
</c:url>
3.11.
<c:redirect>
タグ
<c:redirect>
タグは、URLの書き換えを実行し、ユーザーをその
url
属性で指定されたページにリダイレクトします。典型的なユースケースは次のようになります。
<c:redirect url="/core__tags"/>
4フォーマットタグ
-
JSTLフォーマットタグライブラリは、テキスト、数字、日付、時刻、その他の変数をより見やすくフォーマットするための便利な方法を提供します。
JSTLフォーマットタグを使用して、Webサイトの国際化を強化することもできます。
これらのフォーマットタグを使用する前に、taglibをJSPに追加します。
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
さまざまなフォーマットタグとその使用方法を確認しましょう。
4.1.
<fmt:formatDate>
タグ
<fmt:formatDate>
タグは、日付や時刻をフォーマットするのに役立ちます。
value
属性はフォーマットされる日付を保持し、
type
属性は3つの値のうちの1つを取ります。日付、時間、またはその両方。
<fmt:formatDate>
には
pattern
属性もあり、ここで希望のフォーマットパターンを指定できます。以下はパターンの1つの例です。
<c:set var="now" value="<%= new java.util.Date()%>"/>
<fmt:formatDate type="time" value="${now}"/>
4.2.
<fmt:parseDate>
タグ
<fmt:parseDate>
タグは
<fmt:formatDate>
タグに似ています。
-
違いは、
<fmt:parseDate>
タグを使用することで、基礎となる日付パーサーが日付値が入ると想定する書式パターンを指定できることです。**
日付を解析できます。
<c:set var="today" value="28-03-2018"/>
<fmt:parseDate value="${today}" var="parsedDate" pattern="dd-MM-yyyy"/>
4.3.
<fmt:formatNumber>
タグ
<fmt:formatNumber>
タグは、
type
属性で指定された
number、currency、percentage
のいずれかになり得る特定のパターンまたは精度での数値のレンダリングを処理します。
<fmt:formatNumber>
の使用例は次のとおりです。
<c:set var="fee" value="35050.1067"/>
<fmt:formatNumber value="${fee}" type="currency"/>
4.4.
<fmt:parseNumber>
タグ
<fmt:parseNumber>
タグは
<fmt:formatNumber>
タグに似ています。違いは、
<fmt:parseNumber>
tagを使用することで、基になる数値パーサーが数値を格納すると想定する書式パターンを指定できることです。
これを次のように使うことができます。
<fmt:parseNumber var="i" type="number" value="${fee}"/>
4.5.
<fmt:bundle>
タグ
<fmt:bundle>
タグは、
<fmt:message>
タグの親タグです。
<fmt:bundle>
は、
basename
属性で指定されたバンドルを、囲まれた
<fmt:message>
タグにします。
<fmt:bundle>
タグは、ロケール固有のオブジェクトを指定できるため、国際化を有効にするのに役立ちます。典型的な使い方は次の形式になります。
<fmt:bundle basename="com.baeldung.jstl.bundles.CustomMessage" prefix="verb.">
<fmt:message key="go"/><br/>
<fmt:message key="come"/><br/>
<fmt:message key="sit"/><br/>
<fmt:message key="stand"/><br/>
</fmt:bundle>
4.6.
<fmt:setBundle>
タグ
<fmt:setBundle>
タグは、JSP内でリソースバンドルをロードし、それをページ全体で使用可能にするために使用されます。ロードされたリソースバンドルは、
<fmt:setBundle>
タグの
var
属性に格納されます。次の方法でバンドルを設定できます。
<fmt:setBundle basename="com.baeldung.jstl.bundles.CustomMessage" var="lang"/>
4.7.
<fmt:setLocale>
タグ
<fmt:setLocale>
タグは、宣言の後に配置されたJSP内のセクションのロケールを設定するために使用されます。通常、これを次のように設定します。
<fmt:setLocale value="fr__FR"/>
fr__FRは、この場合フランス語のロケールを表します。
4.8.
<fmt:timeZone>
タグ
<fmt:timeZone>
タグは、そのエンクロージャ内のタグによる時間の書式設定または解析アクションで使用するタイムゾーンを指定する親タグです。
このタイムゾーンパラメータは、その
value
属性によって提供されます。使用例を以下に示します。
<fmt:timeZone value="${zone}">
<fmt:formatDate value="${now}" timeZone="${zn}"
type="both"/>
</fmt:timeZone>
4.9.
<fmt:setTimeZone>
タグ
<fmt:setTimeZone>
タグを使用して、その
value
属性で指定されたタイムゾーンをその
var
属性で指定されたスコープ付き変数にコピーできます。これを次のように定義します。
<fmt:setTimeZone value="GMT+9"/>
4.10.
<fmt:message>
タグ
__ <fmt:message
>
タグは国際化メッセージを表示するために使用されます。取得するメッセージの一意の識別子を
key__属性に渡す必要があります。
bundle
属性でも指定できるメッセージを検索するための特定のバンドル。
これは次のようになります。
<fmt:setBundle basename = "com.baeldung.jstl.bundles.CustomMessage" var = "lang"/>
<fmt:message key="verb.go" bundle="${lang}"/>
4.11.
<fmt:requestEncoding>
タグ
<fmt:requestEncoding>
タグは、アクションタイプが
post
のフォームのエンコードタイプを指定するのに役立ちます。
使用する文字エンコードの名前は、
<fmt:requestEncoding>
タグの
key
属性を介して指定されます。
以下の例を見てみましょう。
<fmt:requestEncoding value = "UTF-8"/>
5 XMLタグ
JSTL XMLタグライブラリは、JSP内でXMLデータと対話するための便利な方法を提供します。
これらのXMLタグにアクセスできるようにするには、タグライブラリをJSPに追加します。
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
JSTL XMLタグライブラリのさまざまなタグを見てみましょう。
5.1.
<x:out>
タグ
<x:out>
タグはJSPの
<%=%>
スクリプトレットタグに似ていますが、
<x:out>
はXPath式に特に使用されます。
<x:out>
タグには、
String
を評価し、特殊なXML文字のエスケープをそれぞれ可能にするためにXPath式を指定するために使用される
select
および
escapeXML
属性があります。
簡単な例は:
<x:out select="$output/items/item[1]/name"/>
上記の
$ output
は、プリロードされたXSLファイルを参照しています。
5.2.
<x:parse>
タグ
<x:parse>
タグは、その
xml
属性または
doc
____属性またはエンクロージャで指定されたXMLデータを解析するために使用されます。典型的な例は次のようになります。
<x:parse xml="${xmltext}" var="output"/>
5.3.
<x:set>
タグ
<x:set>
タグは、その
var
属性で指定された変数を、その
select
属性に渡された評価済みXPath式に設定します。典型的な例は次のようになります。
<x:set var="fragment" select="$output//item"/>
5.4.
<x:if>
タグ
<x:if>
タグは、
select
属性に指定されたXPath式がtrueと評価された場合に本体を処理します。
評価結果は、その
var
属性に格納できます。
単純なユースケースは次のようになります。
<x:if select="$output//item">
Document has at least one <item> element.
</x:if>
5.5.
<x:forEach>
タグ
<x:forEach>
タグは、XML文書内のノードをループするために使用されます。
XMLドキュメントは、
<x:forEach>
タグの
select
属性を介して提供されます。
<c:forEach>
コアタグと同様に、
<x:forEach>
タグには
begin、end
、および
step
属性があります。
したがって、次のようになります。
<ul class="items">
<x:forEach select="$output/items/item/name" var="item">
<li>Item Name: <x:out select="$item"/></li>
</x:forEach>
</ul>
5.6.
<x:>>を選択、
<x:when>
および
<x:それ以外> __ Tags
<x:choose>
タグは、switch式またはif/else-if/else式の実行に使用され、属性はありませんが、
<x:when>
および
<x:else>を囲む親タグです
タグ
<x:when>
タグはif/else-ifに似ており、評価される式を保持する
select
属性を取ります。
<x:else>
tagはelse/default句に似ており、属性はありません。
以下にユースケースの例を示します。
<x:choose>
<x:when select="$output//item/category = 'Sneakers'">
Item category is Sneakers
</x:when>
<x:when select="$output//item/category = 'Heels'">
Item category is Heels
</x:when>
<x:otherwise>
Unknown category.
</x:otherwise>
</x:choose>
5.7.
<x:transform>
と
<x:param>
タグ
<x:transform>
タグは、XSL(eXtensible Stylesheet Language)を適用してJSP内のXML文書を変換します。
適用されるXSLが
<x:transform>
タグの
xslt
属性に渡されるのに対して、変換されるXML文書または
String
は
doc
属性に渡されます。
<x:param>
tagは
<x:transform>
tagのサブタグであり、変換スタイルシートでパラメータを設定するために使用されます。
単純なユースケースは次の形式になります。
<c:import url="/items__xml" var="xslt"/>
<x:transform xml="${xmltext}" xslt="${xslt}">
<x:param name="bgColor" value="blue"/>
</x:transform>
6. SQLタグ
-
** JSTL SQLタグライブラリは、リレーショナルデータベース操作を実行するためのタグを提供します。
JSTL SQLタグを有効にするために、taglibをJSPに追加します。
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
JSTL SQLタグは、MySQL、Oracle、およびMicrosoft SQL Serverを含むさまざまなデータベースをサポートします。
次に、利用可能なさまざまなSQLタグを見てみましょう。
6.1.
<sql:setDataSource>
タグ
<sql:setDataSource>
タグは、JDBC構成変数を定義するために使用されます。
これらの構成変数は、次に示すように、
<sql:setDataSource>
タグの
driver、url、user、password
、および
dataSource
属性に保持されます。
<sql:setDataSource var="dataSource" driver="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost/test" user="root" password=""/>
上記で、
var
属性は関連データベースを識別する値を保持します。
6.2.
<sql:query>
タグ
<sql:query>
タグは、その結果が
var
属性で定義されたスコープ付き変数に格納された状態でSQL SELECTステートメントを実行するために使用されます。
通常、これを次のように定義します。
<sql:query dataSource="${dataSource}" var="result">
SELECT ** from USERS;
</sql:query>
<sql:query>
tagの
sql
属性は、実行されるSQLコマンドを保持します。他の属性には、
maxRows
、
startRow
、および__dataSourceがあります。
6.3.
<sql:update>
タグ
<sql:update>
タグは
<sql:query>
タグと似ていますが、戻り値を必要としないSQLのINSERT、UPDATE、またはDELETE操作のみを実行します。
使用例は次のようになります。
<sql:update dataSource="${dataSource}" var="count">
INSERT INTO USERS(first__name, last__name, email) VALUES
('Grace', 'Adams', '[email protected]');
</sql:update>
<sql:update>
タグの
var
属性は、その
sql
属性で指定されたSQLステートメントの影響を受けた行数を保持します。
6.4.
<sql:param>
タグ
<sql:param>
タグは、次のようにsqlステートメントの値プレースホルダーに値を指定するために
<sql:query>
または
<sql:update>
タグ内で使用できるサブタグです。
<sql:update dataSource = "${dataSource}" var = "count">
DELETE FROM USERS WHERE email = ?
<sql:param value = "[email protected]"/>
</sql:update>
<sql:param>
タグには単一の属性があります。提供される値を保持する
value
。
6.5.
<sql:dateParam>
タグ
<sql:dateParam>
タグは、
<sql:query>
または
<sql:update>
タグ内で使用され、sqlステートメント内の値プレースホルダの日時値を提供します。
これをJSPで次のように定義できます。
<sql:update dataSource = "${dataSource}" var = "count">
UPDATE Users SET registered = ? WHERE email = ?
<sql:dateParam value = "<%=registered%>" type = "DATE"/>
<sql:param value = "<%=email%>"/>
</sql:update>
<sql:param>
タグと同様に、
<sql:dateParam>
タグには
value
属性があり、その値は
date、time
、または
timestamp
(日付と時刻)のいずれかです。
6.6.
<sql:transaction>
タグ
<sql:transaction>
タグは、次のように
<sql:query>
タグと
<sql:update>
タグをグループ化してJDBCのトランザクションに似た操作を作成するために使用されます。
<sql:transaction dataSource = "${dataSource}">
<sql:update var = "count">
UPDATE Users SET first__name = 'Patrick-Ellis' WHERE
email='[email protected]'
</sql:update>
<sql:update var = "count">
UPDATE Users SET last__name = 'Nelson' WHERE
email ='[email protected]'
</sql:update>
<sql:update var = "count">
INSERT INTO Users(first__name, last__name, email)
VALUES ('Grace', 'Adams', '[email protected]');
</sql:update>
</sql:transaction>
<sql:transaction>
tagは、いずれかの操作でエラーが発生した場合に、すべてのデータベース操作が正常に処理された(コミットされた)、またはすべて失敗した(ロールバックされた)ことを保証します。
7. JSTLの機能
JSTLメソッドは、JSP内でデータを操作するためのユーティリティです。一部の関数は異なるデータ型を取りますが、それらのほとんどは
String
操作専用です。
JSPでJSTLメソッドを有効にするには、taglibをページに追加します。
<%@ taglib prefix = "fn"
uri = "http://java.sun.com/jsp/jstl/functions" %>
これらの機能とその使い方を見てみましょう。
7.1.
fn:contains()
および
fn:containsIgnoreCase()
fn:contains()
メソッドは
String
を評価して、次のように指定された部分文字列が含まれているかどうかを確認します。
<c:set var = "string1" value = "This is first string"/>
<c:if test = "${fn:contains(string1, 'first')}">
<p>Found 'first' in string<p>
</c:if>
fn:contains()
関数は2つの
String
引数を取ります。最初の引数はソースの
String
で、2番目の引数は部分文字列です。評価の結果に応じてブール値を返します。
fn:containsIgnoreCase()
関数は、
fn:contains()
メソッドの大文字と小文字を区別しないバリアントで、次のように使用できます。
<c:if test = "${fn:containsIgnoreCase(string1, 'first')}">
<p>Found 'first' string<p>
</c:if>
<c:if test = "${fn:containsIgnoreCase(string1, 'FIRST')}">
<p>Found 'FIRST' string<p>
</c:if>
7.3.
fn:endsWith()
関数
fn:endsWith()
関数は
String
を評価して、その接尾辞が他の部分文字列と一致するかどうかをチェックします。これは2つの引数を取ります。最初の引数は
String
で、その接尾辞はテストされますが、2番目の引数はテストされたサフィックスです。
これを次のように定義できます。
<c:if test = "${fn:endsWith(string1, 'string')}">
<p>String ends with 'string'<p>
</c:if>
7.4.
fn:escapeXml()
関数
fn:escapeXML()
関数は、次のように入力
String
のXMLマークアップをエスケープするために使用されます。
<p>${fn:escapeXml(string1)}</p>
7.5.
fn:indexOf()
関数
fn:indexOf()
関数は
String
を調べ、与えられた部分文字列が最初に出現した位置のインデックスを返します。
これは2つの引数を取ります。最初の引数はソースの
String
で、2番目の引数は一致する最初の部分文字列です。
fn:indexOf()
関数は整数を返し、次のように使用できます。
<p>Index: ${fn:indexOf(string1, "first")}</p>
7.6.
fn:join()
関数
fn:join()
関数は、配列のすべての要素を単一の
String
に連結し、次のように使用できます。
<c:set var = "string3" value = "${fn:split(string1, ' ')}"/>
<c:set var = "string4" value = "${fn:join(string3, '-')}"/>
7.7.
fn:length()
関数
fn:length()
関数は、指定されたコレクションの要素数、または指定された__Stringの文字数を返します。
fn:length()
関数は単一の
Object
を取ります。これはコレクションまたは
String
のいずれかであり、次のような整数を返します。
<p>Length: ${fn:length(string1)}</p>
7.8.
fn:replace()
関数
fn:replace()
関数は、String内のサブストリングのすべての出現箇所を別の__Stringと置き換えます。
それは3つの引数を取ります。ソース
String、
ソース内で検索する部分文字列、およびすべての部分文字列を次のように置き換える
String
<c:set var = "string3" value = "${fn:replace(string1, 'first', 'third')}"/>
7.9.
fn:split()
関数
fn:split()
関数は、指定された区切り文字を使用して
String
に対して分割操作を実行します。使用例は次のとおりです。
<c:set var = "string3" value = "${fn:split(string1, ' ')}"/>
7.10.
fn:startsWith()
関数
fn:startsWith()
関数は、
String
のプレフィックスをチェックし、次のように特定のサブストリングと一致する場合はtrueを返します。
……
<c:if test = “$ {fn:startsWith(string1、 ‘This’)}”>>
<p>文字列は ‘This’で始まります</p>
</c:if>
……
7.11.
fn:substring()
関数
fn:substring()
関数は、指定された開始インデックスと終了インデックスで、ソース
String
からサブストリングを作成します。これを次のように使用します。
<c:set var = "string3" value = "${fn:substring(string1, 5, 15)}"/>
7.12.
fn:substringAfter()
関数
fn:substringAfter()
関数は、指定された部分文字列のソース
String
をチェックし、指定された部分文字列が最初に出現した直後に
String
を返します。
これを次のように使用します。
<c:set var = "string3" value = "${fn:substringAfter(string1, 'is')}"/>
7.13.
fn:substringBefore()
関数
fn:substringBefore()
関数は、指定された部分文字列のソース
String
をチェックし、指定された部分文字列が最初に出現する直前の
String
を返します。
JSPページでは、次のようになります。
<c:set var = "string3" value = "${fn:substringBefore(string1, 'is')}"/>
7.14.
fn:toLowerCase()
関数
fn:to LowerCase()
関数は、
String
内のすべての文字を小文字に変換します。これは、次のように使用できます。
<c:set var = "string3" value = "${fn:toLowerCase(string1)}"/>
7.15.
fn:toUpperCase()
関数
fn:toUpperCase()
関数は、
String
内のすべての文字を大文字に変換します。
<c:set var = "string3" value = "${fn:toUpperCase(string1)}"/>
7.16.
fn:trim()
関数
fn:trim()
関数は、
String:
の前後の空白を削除します。
<c:set var = "string1" value = "This is first String "/>
9結論
この広範な記事では、さまざまなJSTLタグとその使用方法について説明しました。
いつものように、コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-forms-jsp[over on GitHub]にあります。