Описание тега jstl
JSTL (стандартная библиотека тегов JSP) - это стандартная библиотека тегов на основе JSP, которая предлагает<c:xxx>
теги для управления потоком на странице JSP,<fmt:xxx>
теги для форматирования даты / чисел и средств интернационализации, а также несколько${fn:xxx()}
служебные функции EL.
Обратите внимание, что JSTL также предлагает библиотеки тегов SQL и XML, которые позволяют декларативно выполнять запросы SQL и анализировать XML внутри страницы JSP. Однако это не рекомендуется для других целей, кроме быстрого прототипирования. В реальном мире обе задачи должны выполняться реальными классами Java, которые (не) напрямую контролируются / делегируются сервлетом.
JSTL является частью Java EE API и включен в серверы приложений Java EE, такие как WildFly, TomEE, GlassFish, но не в базовые контейнеры сервлетов, такие как Tomcat и Jetty. JSTL - это библиотеки тегов, которые вы импортируете изhttp://java.sun.com/jsp/jstl/*
пространство имен. JSTL не следует путать с " пользовательской библиотекой тегов JSP " (в которой вы определяете.tld
подайте сами). JSTL также не следует путать с библиотеками тегов сторонних фреймворков, таких как JSF, Spring MVC, Struts, Displaytag и т. Д. JSTL также не следует путать с языком выражений (EL) (это те${}
вещи).
Установка JSTL
На самом деле это довольно просто:
Только если ваш servletcontainer не поставляется со встроенным JSTL (например, Tomcat и Jetty), просто поместите jstl-1.2.jar прямо в webapp.
/WEB-INF/lib
папка (которая находится в пути к классам веб-приложения по умолчанию, поэтому в немного умной IDE вам не нужно ничего делать). Для начала, не возитесь с настройкой пути сборки проекта IDE. Это не верно.Если вы используете Maven, это координата:
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
Наблюдение: это, кстати, JSTL API, связанный с реализацией JSTL Apache в едином JAR-формате. Это не требует
standard.jar
(только для JSTL 1.1). Обратите внимание, что есть такжеjstl:jstl
зависимости, но это точно такой же файл, только с неправильным идентификатором группы. Кроме того, есть такжеjavax.servlet.jsp.jstl:jstl
зависимость, но она пуста.Объявите taglib в файле JSP с правильным URI TLD. Вы можете найти здесь документацию TLD, которая относится как к JSTL 1.1 и JSTL 1.2. Щелкните интересующий тег, чтобы получить примеры объявлений. Например, основная библиотека тегов JSTL
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Если вы используете Facelets или JSPX вместо JSP, его следует объявить как пространство имен XML.
<anyxmlelement xmlns:c="http://java.sun.com/jsp/jstl/core">
Вам нужно только убедиться, что у вас нет дубликатов старых версий JSTL в пути к классам (включая JDK/JRE /lib
и сервера /lib
), чтобы избежать столкновений. Если у вас есть полный контроль над сервером на уровне администратора, вы также можете поместить файл JAR в серверную/lib
вместо веб-приложения /WEB-INF/lib
чтобы они применялись ко всем развернутым веб-приложениям. По крайней мере, НЕ извлекайте файлы JAR и не загромождайте путь к классам их содержимым (свободными файлами TLD) и / или не объявляйте библиотеки тегов в своем веб-приложении.web.xml
как предлагают некоторые плохие онлайн-руководства.
История версий JSTL и URI taglib
JSTL был доступен в разных версиях:
1.0: Изобретено Apache/Jakarta. Состоит из двух файлов JAR
jstl.jar
(API) иstandard.jar
(имп). Taglib URI не имеет/jsp
в пути какhttp://java.sun.com/jstl/core
а версия прототипа имеет имя библиотеки с суффиксом_rt
нравитьсяhttp://java.sun.com/jstl/core_rt
. Пришел вместе с сервлетом 2.3 / JSP 1.2 и требует как минимум.1.1: Интегрирован как часть J2EE 1.4. EL был перемещен с JSTL на JSP. Taglib URI включает
/jsp
на пути какhttp://java.sun.com/jsp/jstl/core
. Пришел вместе и требует как минимум Servlet 2.4 / JSP 2.0.1.2.x: интегрирован как часть Java EE 5 и новее. Taglib URI не изменился и по-прежнему похож на
http://java.sun.com/jsp/jstl/core
. Пришел вместе с Servlet 2.5 / JSP 2.1, но работает и с Servlet 2.4 / JSP 2.0.Facelets: Facelets, преемник JSP, имеет среди предоставленных библиотек тегов выбранное подмножество ядра JSTL 1.2 и полный набор встроенных функций JSTL 1.2. Для этого требуется как минимум JSTL 1.2. Для Facelets 1.x URI пространства имен XML:
http://java.sun.com/jstl/core
а для Facelets 2.x URI пространства имен XML -http://java.sun.com/jsp/jstl/core
с (сбивает с толку!)/jsp
часть и начиная с Facelets 2.2 и далее URI пространства именhttp://xmlns.jcp.org/jsp/jstl/core
.
Помогите! Язык выражения (EL, те${}
вещи) не работает в моих тегах JSTL!
Заявленная версия сервлета в web.xml
очень важно, чтобы JSTL и EL работали правильно. Вам необходимо убедиться, что вы используете контейнер сервлетов, который поддерживает минимально необходимую версию сервлета для версии JSTL. Например, Apache Tomcat 6.0 представляет собой контейнер Servlet 2.5. Затем вы должны объявить свойweb.xml
соответствуют спецификации Servlet 2.5, это работает как для JSTL 1.1, так и для 1.2:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- Config here. -->
</web-app>
Однако если вы используете контейнер Servlet 2.4, например, Apache Tomcat 5.5, тогда web.xml
должен быть объявлен соответствующим спецификации Servlet 2.4.
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- Config here. -->
</web-app>
И если вы используете контейнер Servlet 2.3 (например, Apache Tomcat 4.1), тогда web.xml
должен быть заявлен как соответствующий спецификации Servlet 2.3.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
<!-- Config here. -->
</web-app>
Объяснение предыстории: EL изначально был частью JSTL 1.0, но в JSTL 1.1 / JSP 2.0 он был перемещен с JSTL на JSP. Так что, если вы запустите JSTL 1.1 на JSP 1.2 / Servlet 2.3, он вообще не сработает. Обратите внимание, что при развертывании веб-приложения с совместимым с сервлетом 2.3web.xml
в контейнер, совместимый с Servlet 2.4/2.5/3.0, то он все равно будет работать в режиме "отката", соответствующий версии, указанной вweb.xml
!
Интернет-ресурсы
- Руководство по Java EE 5 - Стандартная библиотека тегов JavaServer Pages
- JSR 52: стандартная библиотека тегов для JavaServer Pages™
Часто задаваемые вопросы
- Как перебрать
Map
(а такжеList
) в<c:forEach>
? - Как интернационализировать веб-приложение Java с помощью JSTL
fmt
taglib? - JSTL в JSF2 Facelets... имеет смысл?