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 .