В начале был HTML — и все были счастливы. Затем, однажды, кто-то умный решил, что им нужно иметь динамический контент на своем веб-сайте, изобрел язык сценариев, который генерирует HTML, и весь ад развалился. За несколько месяцев веб-страницы превратились в джунгли HTML, кода сценариев и операторов SQL.
Сначала Java взяла на себя все это — сервлет. Хотя это было полезно в определенных обстоятельствах, оно оказалось громоздким и громоздким. Спаситель должен был прийти в форме Java ServerPages. Будучи способными перепрыгивать через здания в одной границе, JSP выглядели как язык сценариев и действовали как язык сценариев, но на самом деле были не более чем умным способом написания сервлетов! JSP решили множество проблем, которые были присущи сервлетам, но они также создали ряд проблем.
Страницы могут легко стать беспорядком кода скриптлета и фрагментов HTML. Хуже того, JSP позволили вам избежать написания JavaBeans для заботы о вашей бизнес-логике; размещение всей функциональности вашего сайта на самой веб-странице было быстрым решением, которое чаще всего возвращалось и кусало вас, когда вы меньше всего этого ожидали. Наконец, типичный разработчик внешнего интерфейса взял сценарии JSP, как рыба на велосипеде, избегая сложностей Векторов, Объектов Запроса и исключений нулевого указателя в пользу более простых удовольствий.
Почему я говорю тебе все это? Потому что, когда казалось, что все движется по нисходящей спирали, приходит решение! Войдите в стадию слева, стандартную библиотеку тегов Java.
Познакомьтесь с JSTL
Стандартная библиотека тегов Java (или JSTL) — это не что иное, как библиотека тегов Java, которая предоставляет нам ряд стандартных функций. Хорошо, хорошо — иными словами, JSTL сделает ваш болт JSP-скрипта и HTML снова похожим на обычные старые HTML-страницы. И это хорошо. Ваши страницы станут более читабельными (больше не будет скриптлетов), ваша архитектура кода станет намного чище (больше не будет HTML в ваших классах JavaBean), и, что лучше всего, разработчики внешнего интерфейса, с которыми вы работаете, будут приглашать вас в паб во время обеда как раньше.
Хорошо, просто для того, чтобы подогреть аппетит, прежде чем мы поговорим о том, как его установить, вот довольно типичный фрагмент кода, который вы можете увидеть на странице JSP:
<% For (Enumeration e = shoppingCart.getProducts(); e.hasMoreElements();) { Product thisProduct = (Product)e.nextElement(); %> <br /><%=thisProduct.getDescription()%> <% } %>
Ясно, как грязь, верно? Вот та же функциональность, написанная с использованием JSTL:
<c:forEach var="thisProduct" items="${shoppingCart.products}"> <br /><c:out value="${thisProduct.description}"/> </c:forEach>
К настоящему моменту разработчики HTML, с которыми вы работаете, не просто приглашают вас в паб, но и привлекают внимание!
Хорошо, давайте установим эту вещь. Вам понадобится сервер приложений, который соответствует спецификации JSP 1.2. Для большинства людей это означает Tomcat 4.0+. После установки Tomcat вам необходимо скачать копию самого JSTL. Вы можете получить копию с сайта Apache Jakarta (см. Ресурсы в конце этой статьи). Загрузите код для этой статьи здесь .
- Создайте новое веб-приложение в Tomcat (вы можете просто создать новый каталог в каталоге webapps /). В этой статье мы будем называть веб-приложение «jstl_stuff».
- Распакуйте архив JSTL.
- Создайте каталог «WEB-INF» в «jstl_stuff» и каталог «lib» в «WEB-INF».
- Скопируйте все из каталога lib вашего архива JSTL в <Tomcat Home> / webapps / jstl_stuff / WEB-INF / lib.
- Перезапустите Tomcat.
Чтобы проверить установку, создайте страницу с именем index.jsp в каталоге / jstl_stuff и добавьте следующий код:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <c:out value="Doh! It's working!"/>
Теперь попробуйте перейти на http: // localhost: 8080 / jstl_stuff. Если вы видите страницу с надписью «Doh! Это работает! »И ничего больше, все работает отлично. Если вы видите взрыв исключений Java, что-то пошло не так, и пришло время начать проверку конфигурации Tomcat.
Компоненты объяснены
Я собираюсь сослаться на следующий класс ( simpsons.Homer
) для примеров. Вы можете скомпилировать его и поместить в <tomcat home> / webapps / WEB-INF / classes / simpsons, или написать свой собственный.
package simpsons; import java.util.Vector; public class Homer { private int iq; private Vector braincells; public Homer() { iq = 24; braincells = new Vector(); braincells.add("Eating"); braincells.add("Drinking"); braincells.add("Sleeping"); } public int getIq() { return iq; } public void setIq(int iq) { if (iq < 100) { this.iq = iq; } } public Vector getBraincells() { return braincells; } }
Примечание: в следующих примерах мы должны объявить, что будем использовать класс Homer
на наших страницах JSP. Не забудьте добавить следующую строку в начало ваших страниц JSP после того, как вы скомпилировали класс:
<jsp:useBean id="homer" class="simpsons.Homer" scope="page" />
JSTL разделен на 4 компонента:
- Core — основные теги, используемые в библиотеке
- XML — набор тегов обработки XML
- Формат — Интернационализация и форматирование тегов
- SQL — теги для доступа к базе данных SQL
В этой статье мы рассмотрим набор тегов Core и Format. Если вы хотите справиться с любым из других, см. Ссылки на ресурсы в конце этой статьи.
Чтобы сообщить Tomcat о том, что мы собираемся использовать основные теги JSTL на нашей странице, нам необходимо включить следующую директиву taglib
на каждую страницу, на которой используются теги JSTL:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
Как я упоминал ранее, идея JSTL состоит в том, чтобы предоставить программисту базовый уровень функциональности, чтобы скриптовые JSP больше не нужны. Например, если мы хотим присвоить значение переменной, мы можем использовать действие set
:
<c:set var="homer" value="Doh!" />
Чтобы вывести что-то в HTML, мы можем использовать действие out
:
<c:set var="homer" value="Doh!" /> <c:out value="${homer}" />
Выполнение этого должно предоставить нам единственное «Doh!»
Вы также можете установить свойство JavaBean. Например, если вы хотите установить свойство IQ homer
мы можем сделать:
<c:set target="${homer}" property="iq" value="34"/>
Ветераны JSP-кодеров, вероятно, будут чесать свои головы в этот момент. Эта часть кода может выглядеть необычно:
${homer}
Добро пожаловать на язык выражений JSTL (или EL)! EL — это метод доступа к переменным Java гораздо более простым способом, чем старый «JSP-стиль». EL простой и мощный. Используя его, мы можем получить доступ к переменным объекта различными способами:
${homer.iq}
Выше было бы получить доступ к свойству объекта iq
.
${homer.braincell[1]}
Выше будет возвращать второй элемент коллекции Braincell объекта Гомера. Обратите внимание, что нам не нужно знать (и, действительно, не важно), является ли свойство braincell объекта homer массивом или вектором (или чем-то еще, что реализует интерфейс List); EL делает всю работу за нас.
Мы также можем использовать EL для оценки выражений. Так, например, следующее будет оцениваться как true:
${homer.iq < 50}
Теперь мы можем начать использовать теги EL и JSTL для радикального упрощения наших страниц JSP.
Условные и итерационные операции
В большинстве случаев JSP-скриптлеты используются для выполнения условных (if..else) или итеративных (for, while) задач. Базовые теги JSTL предоставляют эту функциональность, не прибегая к скриптлетам. Теги <c:if ...>
и <c:choose ...>
обеспечивают основные условные операции. Например, простой оператор if будет читать:
<c:if test="${homer.iq < 50}"> Doh! My IQ is <c:out value="${homer.iq}"/> </c:if>
Для выполнения операции if… else мы можем использовать <c:choose>
, например так:
<c:choose> <c:when test="${homer.iq < 50}"> Doh! </c:when> <c:when test="${homer.iq > 50}"> Wohoo! </c:when> <c:otherwise> An IQ of 50? Wohoo! </c:otherwise> </c:choose>
Зацикливание можно выполнить с помощью <c:forEach ...>
:
<c:forEach var="braincell" items="${homer.braincells}"> <br /><c:out value="${braincell}"/> </c:forEach> /#epc#/
Это будет отображать:
Eating Drinking Sleeping
Тег forEach
предоставляет нам некоторые необязательные атрибуты. Например, мы можем написать:
<c:forEach items="${homer.braincells}" var="braincell" begin="1" end="2" varStatus="status"> <br />Braincell <c:out value="${status.count}"/>: <c:out value="${braincell}" /> </c:forEach>
Выше будет отображаться:
Braincell 1: Drinking Braincell 2: Sleeping
Здесь мы использовали параметры begin
и end
чтобы определить, где цикл будет начинаться и заканчиваться. Мы также используем объект varStatus
. Этот объект предоставляет интерфейс в состояние цикла. Проверьте ресурсы в конце для получения дополнительной информации.
JSTL и генерация URL
JSTL также предоставляет теги, которые помогут нам привести в порядок URL-адреса. Код Scriptlet часто используется для создания URL, которые передают параметры на другие страницы, и могут очень быстро запутаться. С помощью JSTL мы можем создавать URL-адреса гораздо аккуратнее. Например:
<c:url var="thisURL" value="homer.jsp"> <c:param name="iq" value="${homer.iq}"/> <c:param name="checkAgainst" value="marge simpson"/> </c:url> <a href="<c:out value="${thisURL}"/>">Next</a>
Выше будет генерировать URL, который гласит:
homer.jsp?iq=24&checkAgainst=marge+simpson
Обратите внимание, как JSTL закодировал параметр checkAgainst
для использования в URL, заменив пробел checkAgainst
+
. Больше не нужно беспокоиться о недействительных URL! Дополнительный бонус от использования тега url
— это помощь тем, кто занимается серфингом, если в их браузере не включены сессионные куки JSTL проверит и автоматически добавит sessionId
к ссылке, если сеансовые куки были отключены.
Наконец, быстрое упоминание тегов формата. Они отделены от основных тегов и должны быть импортированы с оператором следующим образом:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
Вышеуказанное появляется в верхней части страницы JSP. Теги формата предоставляют мощные функции форматирования текста. В качестве короткого эксперимента попробуйте выполнить следующее на странице JSP:
<fmt:formatNumber value="34.5423432426236" maxFractionDigits="5" minFractionDigits="3"/> <fmt:formatNumber value="34.5423432426236" type="currency"/> <fmt:parseDate value="2/5/53" pattern="dd/MM/yy" var="homersBirthday"/> <fmt:formatDate value="${homersBirthday}" dateStyle="full"/>
Приведенный выше пример анализирует дату, а затем возвращает дату в более подробном стиле. Мы даже можем добавить языковые особенности к форматированию даты, например:
<fmt:timeZone value="US/Eastern"> <fmt:parseDate value="2/5/53" pattern="dd/MM/yy" var="homersBirthday"/> <fmt:formatDate value="${homersBirthday}" dateStyle="short"/> </fmt:timeZone>
Будет ли вывод:
5/2/53
Подумаешь?
Как видите, JSTL — большая тема. Мы рассмотрели только небольшую часть базовых и форматных библиотек; Существуют также библиотеки для работы с XML, а также набор тегов для доступа к JDBC.
К настоящему времени вы, вероятно, думаете одну из двух вещей; либо вы думаете: «Это здорово, мои страницы перестанут выглядеть как куча скриплетов», либо: «Какой смысл? Мне нужно изучить все эти вещи, и я действительно не получаю никакой дополнительной функциональности».
Как я уже упоминал в начале этой статьи, JSTL — это действительно облегчение вашей жизни в долгосрочной перспективе. Использование JSTL помогает в ряде областей:
- Это помогает нам отделить бизнес-логику (в JavaBeans) от логики представления (в теги JSTL).
- Это позволяет разработчикам, не являющимся Java, писать код на Java, не касаясь какой-либо Java.
- Это упростит и упростит ваши JSP-файлы и сделает их не похожими на спагетти скриптлетов.
Когда вы начнете использовать JSTL, вы заметите, что он заставляет вас писать более качественный и понятный код. Поначалу это небольшое изменение, но когда вы освоитесь с тегами, вы обнаружите, что это быстрее, чем разработка с использованием скриптлетов.
Существует четвертая причина использования JSTL в ваших собственных проектах, и это важная вещь: Java Server Faces. В следующем году (2004) появятся серверы приложений, которые соответствуют спецификации JSP 2.0, что позволит разработчикам начать использовать популярную инфраструктуру Java Server Faces от Sun. Это захватывающая разработка, и разработчики JSTL получат преимущество. JSF будет интенсивно использовать язык выражений, а также сами теги JSTL. Использование JSTL теперь не только поможет с вашими проектами сегодня, но и даст вам преимущество, когда серверы JSF начнут выходить в 2004 году.
Ресурсы
В высшей степени полезной ссылкой является PDF-файл спецификации Sun JSTL, который вы можете найти по адресу:
http://jcp.org/aboutJava/communityprocess/final/jsr052/
Это в формате PDF и делает отличную ссылку.
Область Sun JSTL находится по адресу:
http://java.sun.com/products/jsp/jstl/
Хороший учебник из трех частей на IBM developerWorks:
http://www-106.ibm.com/developerworks/java/library/j-jstl0211.html
Джакартский сайт JSTL:
http://jakarta.apache.org/taglibs/doc/standard-1.0-doc/intro.html
Загрузки
Джакартскую реализацию можно скачать по адресу:
http://apache.mirrors.ilisys.com.au/jakarta/taglibs/standard-1.0/binaries/jakarta-taglibs-standard-1.0.4.zip
Tomcat можно скачать здесь:
http://apache.planetmirror.com.au/dist/jakarta/tomcat-4/tomcat-4.1.27.zip