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]にあります。