Перейти к основному содержимому

Путеводитель по библиотеке JSTL

· 16 мин. чтения

1. Обзор

Библиотека тегов страниц JavaServer (JSTL) представляет собой набор тегов, которые можно использовать для реализации некоторых общих операций, таких как цикл, условное форматирование и другие.

В этом уроке мы обсудим, как настроить JSTL и как использовать его многочисленные теги.

2. Настройка

Чтобы включить функции JSTL, нам нужно добавить библиотеку в наш проект. Для проекта Maven мы добавляем зависимость в файл pom.xml :

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

С библиотекой, добавленной в наш проект, окончательной настройкой будет добавление основного тега JSTL и файла пространства имен любых других тегов в наш JSP с помощью директивы taglib следующим образом:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Далее мы рассмотрим эти теги, которые в целом сгруппированы в пять категорий.

3. Основные теги

Базовая библиотека тегов JSTL содержит теги для выполнения основных операций, таких как печать значений, объявление переменных, обработка исключений, выполнение итераций и объявление условных операторов среди прочего.

Давайте посмотрим на основные теги.

3.1. Тег <c:out >

<c:out> используется для отображения значений, содержащихся в переменных, или результата неявного выражения.

Он имеет три атрибута: значение, значение по умолчанию и escapeXML. Атрибут escapeXML выводит необработанные XML-теги, содержащиеся в атрибуте value или его вложении.

Пример тега <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 со значением по умолчанию для всех областей действия .

Ниже мы показываем пример использования тега <c:remove> :

<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> — это условный тег, который отображает или выполняет вложенные в него сценарии только тогда, когда его тестовый атрибут имеет значение true. Результат оценки может быть сохранен в его атрибуте var .

3.6. Теги <c:choose> , <c:when> и <c:otherwise>

<c:choose> — это родительский тег, который используется при выполнении выражений типа switch или if-else. Он имеет два подтега; <c:when> и <c:inotherwise> , которые представляют if/else-if и else соответственно.

<c:when> принимает тестовый атрибут, который содержит оцениваемое выражение. Ниже мы покажем пример использования этих тегов:

<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 и var для хранения URL-адреса и содержимого, полученного из URL-адреса соответственно. Например, мы могли бы импортировать содержимое из URL-адреса следующим образом:

<c:import var = "data" url = "http://www.example.com"/>

3.8. Тег <c:forEach >

Тег <c:forEach> похож на синтаксис for, while или do-while в Java. Атрибут 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> используется для разделения строки на токены и их повторения.

Подобно тегу <c:forEach> , он имеет атрибут items и дополнительный атрибут 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> также имеет вложенный тег <c:param> , который используется для указания параметров URL. Мы показываем пример ниже:

<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 также можно использовать для повышения интернационализации веб-сайта.

Прежде чем использовать эти теги форматирования, мы должны добавить библиотеку тегов в наш JSP:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

Давайте определим различные теги форматирования и то, как их можно использовать.

4.1. Тег < fmt :formatDate>

Тег <fmt:formatDate> полезен для форматирования даты или времени. Атрибут value содержит форматируемую дату, а атрибут type принимает одно из трех значений; дата, время или и то, и другое .

<fmt:formatDate> также имеет атрибут шаблона , в котором мы можем указать желаемый шаблон форматирования. Ниже приведен пример одного из шаблонов:

<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 . Пример использования <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> мы можем указать шаблон форматирования, в котором базовый синтаксический анализатор чисел должен ожидать, что число будет в нем.

Мы могли бы использовать это как:

<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.foreach.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 и обеспечения его доступности на всей странице. Загруженный пакет ресурсов хранится в атрибуте var тега <fmt:setBundle> . Мы можем установить пакет:

<fmt:setBundle basename="com.foreach.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 > используется для отображения сообщения интернационализации. Уникальный идентификатор извлекаемого сообщения должен быть передан в его ключевой атрибут.

Конкретный пакет для поиска сообщения, который также можно указать с помощью атрибута пакета .

Это может выглядеть так:

<fmt:setBundle basename = "com.foreach.jstl.bundles.CustomMessage" var = "lang"/>
<fmt:message key="verb.go" bundle="${lang}"/>

4.11. Тег < fmt :requestEncoding>

Тег <fmt:requestEncoding> полезен при указании типа кодировки для форм с типом действия post .

Имя используемой кодировки символов указывается в ключевом атрибуте тега <fmt:requestEncoding> .

Давайте посмотрим на пример ниже:

<fmt:requestEncoding value = "UTF-8" />

5. XML-теги

Библиотека XML-тегов JSTL предоставляет удобные способы взаимодействия с XML-данными в JSP.

Чтобы получить доступ к этим тегам 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> имеет атрибуты select и escapeXML, используемые для указания выражения XPath для оценки строки и включения экранирования специальных символов XML соответственно.

Простой пример:

<x:out select="$output/items/item[1]/name"/>

$output в приведенном выше примере относится к предварительно загруженному XSL-файлу.

5.2. Тег <x:parse >

Тег <x:parse> используется для синтаксического анализа XML-данных, указанных в его атрибуте xml или doc `` или приложении. Типичным примером может быть:

<x:parse xml="${xmltext}" var="output"/>

5.3. Тег <x:set >

Тег <x:set> присваивает переменной, указанной в его атрибуте var , вычисленное выражение XPath, переданное в его атрибут select . Типичным примером может быть:

<x:set var="fragment" select="$output//item"/>

5.4. Тег <x:if >

Тег <x:if> обрабатывает свое тело, если выражение XPath, предоставленное его атрибуту select , оценивается как истинное.

Результат оценки может быть сохранен в его атрибуте var .

Простой вариант использования будет выглядеть так:

<x:if select="$output//item">
Document has at least one <item> element.
</x:if>

5.5. Тег <x:forEach >

Тег <x:forEach> используется для циклического обхода узлов в XML-документе. XML-документ предоставляется через атрибут select тега <x:forEach> . ``

Как и основной тег <c:forEach> , тег <x:forEach> имеет атрибуты начала, конца и шага .

Таким образом, у нас было бы:

<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:когда> и <x:иначе>

Тег <x:choose> является родительским тегом, который используется при выполнении выражений типа switch или if/else-if/else и не имеет атрибутов, но заключает в себе теги <x:when> и <x:otherwise> .

Тег <x:when> подобен if/else-if и принимает атрибут select , который содержит вычисляемое выражение.

Тег <x:otherwise> аналогичен предложению 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> преобразует XML-документ в JSP, применяя к нему расширяемый язык таблиц стилей (XSL).

Преобразуемый XML-документ или строка передается в атрибут doc , а применяемый XSL передается в атрибут xslt тега <x:transform> .

Тег <x:param> является вложенным тегом тега <x:transform> и используется для установки параметра в таблице стилей преобразования.

Простой вариант использования будет иметь вид:

<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.

Эти переменные конфигурации хранятся в драйвере, URL-адресе, пользователе, пароле и атрибутах dataSource тега <sql:setDataSource> , как показано ниже:

<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> используется для выполнения инструкции SQL SELECT, результат которой сохраняется в переменной области действия, определенной в ее атрибуте var . Обычно мы определяем это как:

<sql:query dataSource="${dataSource}" var="result">
SELECT * from USERS;
</sql:query>

` Атрибут sql тега <sql:query> содержит команду 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', 'gracea@domain.com');
</sql:update>

` Атрибут var тега <sql:update> содержит количество строк, затронутых оператором SQL, указанным в его атрибуте sql .`

6.4. Тег <sql:param >

Тег <sql:param> — это вложенный тег, который можно использовать в тегах <sql:query> или <sql:update> для предоставления значения для заполнителя значения в операторе sql следующим образом:

<sql:update dataSource = "${dataSource}" var = "count">
DELETE FROM USERS WHERE email = ?
<sql:param value = "gracea@domain.com" />
</sql:update>

Тег <sql:param> имеет один атрибут; значение , которое содержит значение, которое будет предоставлено.

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 с дополнительным атрибутом типа , значением которого может быть дата, время или отметка времени (дата и время).

6.6. Тег <sql:transaction >

Тег <sql:transaction> используется для создания операции JDBC, подобной транзакции, путем группировки тегов <sql:query> и <sql:update> вместе следующим образом:

<sql:transaction dataSource = "${dataSource}">
<sql:update var = "count">
UPDATE Users SET first_name = 'Patrick-Ellis' WHERE
email='patrick@foreach.com'
</sql:update>
<sql:update var = "count">
UPDATE Users SET last_name = 'Nelson' WHERE
email ='patrick@foreach.com'
</sql:update>
<sql:update var = "count">
INSERT INTO Users(first_name, last_name, email)
VALUES ('Grace', 'Adams', 'gracea@domain.com');
</sql:update>
</sql:transaction>

Тег <sql:transaction> гарантирует, что все операции с базой данных обрабатываются успешно (фиксируются) или корректно завершаются сбоем (откатываются), если в какой-либо из операций возникает ошибка.

7. JSTL-функции

Методы JSTL — это утилиты для обработки данных в JSP. Хотя некоторые функции принимают разные типы данных, большинство из них предназначены для работы со строками .

Чтобы включить методы JSTL в JSP, мы добавим taglib на нашу страницу:

<%@ taglib prefix = "fn"
uri = "http://java.sun.com/jsp/jstl/functions" %>

Давайте посмотрим на эти функции и как их использовать.

7.1. fn:contains() и fn:containsIgnoreCase()

Метод fn:contains() оценивает строку , чтобы проверить, содержит ли она заданную подстроку, например:

<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() принимает два аргумента типа String ; первый аргумент — исходная строка , а второй аргумент — подстрока. Он возвращает логическое значение в зависимости от результата оценки.

Функция 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() оценивает строку , чтобы проверить, соответствует ли ее суффикс другой подстроке. Он принимает два аргумента; первый аргумент — это строка , суффикс которой должен быть проверен, а второй аргумент — это проверенный суффикс.

Мы можем определить это так:

<c:if test = "${fn:endsWith(string1, 'string')}">
<p>String ends with 'string'<p>
</c:if>

7.4. Функция fn :escapeXml()

Функция fn:escapeXML() используется для экранирования XML-разметки во входной строке следующим образом:

<p>${fn:escapeXml(string1)}</p>

7.5. Функция fn :indexOf()

Функция fn:indexOf() просматривает строку и возвращает индекс первого вхождения данной подстроки.

Он принимает два аргумента; первый — это исходная строка , а второй аргумент — это подстрока, которая соответствует и возвращает первое вхождение.

Функция fn:indexOf() возвращает целое число и может использоваться следующим образом:

<p>Index: ${fn:indexOf(string1, "first")}</p>

7.6. Функция fn:join( )

Функция fn:join() объединяет все элементы массива в одну строку и может использоваться следующим образом:

<c:set var = "string3" value = "${fn:split(string1, ' ')}" />
<c:set var = "string4" value = "${fn:join(string3, '-')}" />

7.7. Функция fn :length()

Функция fn:length() возвращает количество элементов в данной коллекции или количество символов в заданной строке.

Функция fn:length() принимает один объект , который может быть либо коллекцией, либо строкой , и возвращает целое число, подобное этому:

<p>Length: ${fn:length(string1)}</p>

7.8. Функция fn:replace( )

Функция fn:replace() заменяет все вхождения подстроки в строке другой строкой.

Он принимает три аргумента; исходная строка, подстрока для поиска в источнике и строка для замены всех вхождений подстроки следующим образом:

<c:set var = "string3" value = "${fn:replace(string1, 'first', 'third')}" />

7.9. Функция fn:split( )

Функция fn:split() выполняет операцию разделения строки , используя указанный разделитель. Вот пример использования:

<c:set var = "string3" value = "${fn:split(string1, ' ')}" />

7.10. Функция fn :startsWith()

Функция fn:startsWith() проверяет префикс строки и возвращает true, если он соответствует заданной подстроке, например:

<c:if test = "${fn:startsWith(string1, 'This')}">
<p>String starts with 'This'</p>
</c:if>

7.11. Функция fn:substring( )

Функция fn:substring() создает подстроку из исходной строки с указанными начальным и конечным индексами. Мы бы использовали это так:

<c:set var = "string3" value = "${fn:substring(string1, 5, 15)}" />

7.12. Функция fn:substringAfter( )

Функция fn:substringAfter() проверяет исходную строку на наличие заданной подстроки и возвращает строку сразу после первого вхождения указанной подстроки.

Мы бы использовали это так:

<c:set var = "string3" value = "${fn:substringAfter(string1, 'is')}" />

7.13. The fn:substringBefore() Function

The fn:substringBefore() function checks a source String for a given substring and returns the String just before the first occurrence of the specified substring.

In our JSP page, it'll look like this:

<c:set var = "string3" value = "${fn:substringBefore(string1, 'is')}" />

7.14. The fn:toLowerCase() Function

The fn:to LowerCase() function transforms all characters in a String to lowercase and can be used like this:

<c:set var = "string3" value = "${fn:toLowerCase(string1)}" />

7.15. The fn:toUpperCase() Function

The fn:toUpperCase() function transforms all characters in a String to uppercase:

<c:set var = "string3" value = "${fn:toUpperCase(string1)}" />

7.16. The fn:trim() Function

Функция fn:trim() удаляет предшествующие и завершающие пробелы в строке:

<c:set var = "string1" value = "This is first String    "/>

9. Заключение

В этой обширной статье мы рассмотрели различные теги JSTL и способы их использования.

Как обычно, фрагменты кода можно найти на GitHub .