23 сентября 2011 г.

Основные тэги JSTL (JSP Standard Tag Library)

Перед тем, как начать описывать тэги думаю не лишним будет еще раз напомнить как же подключается сам JSTL. А подключается он следующей строчкой:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Тэг <c:out>
Используется для вывода данных на экран. Лучше, чем вывод типа ${pageContext.parameter}  тем, что позволяет контролировать специальные символы html, такие как <, >, &, ‘ и “. За то будут ли они обработаны как html или просто показаны на экране отвечает свойство escapeXml, которое по умолчанию стоит в true. Пример:
<c:out value=’${pageContext.parameter}’ escapeXml=’false’ />
Если в value будет null, то c:out выведет на экран пустое место, но если задать значение аттрибута по-умолчанию, то выведется оно. Например:
<c:out value=’${user}’ default=’guest’ />
напечатает имя пользователя, если оно есть или guest, если пользователь не задан.
Или можно написать так:
<c:out value=’${user}’>guest</c:out>

Тэг <c:forEach>
Позволяет, как это ни странно, сделать цикл. Пример использования:
<table>
    <c:forEach var=”movie” items=”${movieList}” >
        <tr> <td>${movie}</td> </tr>
    </c:forEach>
</table>
У тэга <c:forEach> есть опциональный параметр varStatus, с помощью которого, к примеру, можно реализовать счетчик (как “i” в обыкновенном цикле)
<c:forEach var=”movie” items=”${movieList}” varStatus=”movieLoopCount” >
    <tr> <td>count: ${movieLoopCount.count} </td> </tr>
    <tr><td>${movie}</td></tr>
</c:forEach>
Если у вас есть коллекция коллекций, то можно прогнать её через двойной <c:forEach>.
Помимо свойства count есть еще много замечательных, например begin, end, step и т.п. Их можно посмотреть в спецификации.

Тэг <c:if>
Форвардинг страничек можно написать так:
<%@ taglib prefix=”c” uri=http://java.sun.com/jsp/jstl/core %>
<c:if test=”${empty param.userName}” >
    <jsp:forward page=”LoginScreen.jsp” />
</c:if>
Тэг <c:if> не предпологает наличие else, таким образом можно сделать несколько вариантов поведения, нельзя сделать некоторое значение по-умолчанию.

Тэг <c:choose>
В нормальной джаве это называется switch. Синтаксис такой:
<c:choose>
    <c:when test=”${userPref == ‘something1’}”>
        Blah-blah.
    </c:when>
    <c:when test=”${userPref === ‘something2’}”>
        Another blah-blah.
    </c:when>
    <c:otherwise>
        Omg! Not blah-blah!
    </c:otherwise>
</c:choose>
Тэг <c:set>
Используется чтобы задать переменную вместо <jsp:setProperty>. Используется так:
<c:set var=”userValue” scope=”session” value=”Cowboy” />
Параметр scope не обязательный, по-умолчанию используется scope=”page”.
Можно указывать значение переменных в теле тэга:
<c:set var=”userValue” >Cowgirl</c:set>
Если value равно null, то переменная удаляется.
С помощью тэга <c:set> можно устанавливать свойства бинов или значение Map. Можно добавлять значения к листам и массивам, для этого используется параметр target. Например:
<c:set target=”${PetMap}” property=”dogName” value=”Fido” />
Тэг <c:remove>
Удалять переменные через <c:set> не интуитивно очевидно, для этого используется тэг <c:remove>. Например:
<c:remove var=”userStatus” scope=”request” />
Тэг <c:import>
Используется чтобы вложить одну страницу в другую. Синтаксис:
<c:import url=http://www.mysite/home.html />
Страница загружается динамически на этапе запроса. В качестве url может использоваться страница за пределами контейнера.
Если вы хотите передать какой-то параметр удаленной странице, то можно использовать тэг <c:param>. Пример:
<c:import url=”Header.jsp” >
    <c:param name=”subtitle” value=”My title” />
</c:import>
Тэг <c:url>
Тэг используется вместо response.encodeURL(“/test.do”). К примеру, если у клиента отключены cookies, то правильно указывать линки так:
<a href=”<c:url value=’/inputComments.jsp’ />”>Click here</a>
Если вы хотите передать удаленной страничке параметры, то есть два способа:
1. Неправильный:
<c:url value=”/inputComments.jsp?first=${first}&last=${last}” var=”inputURL” />
2. Правильный:
<c:url value=”/inputComments.jsp” var=”inputURL” >
    <c:param name=”first” value=”${first}” />
    <c:param name=”second” value=”${second}” />
</c:url>
Первый неправильный потому, что в значении параметров могут быть пробелы, что сделает запрос нерабочим.

Тэг <c:catch>
Если вы хотите обрабатывать исключения в теле JSP, то это можно сделать используя тэг <c:catch>. Синтаксис такой:
<c:catch>
    <% int x = 10/0; %>
</c:catch>
Чтобы иметь возможность просмотреть информацию об исключении нужно использовать следующий синтаксис:
<c:catch var=”myException”>
    <% int x = 10/0; %>
</c:catch>
<c:if test=”%{myException != null}”>
    There was an exception: %{myException.message}
</c:if>
Все тэги
Тэги JSTL 1.1 делятся на 4 категории:
1.    Основные:
        o    Общего назначения:  <c:out>, <c:set>, <c:remove>, <c:catch>
        o    Условия: <c:if>, <c:choose>, <c:when>, <c:otherwise>
        o    Относящиеся к URL: <c:import>, <c:url>, <c:redirect>, <c:param>
        o    Итерации: <c:forEach>, <c:forTokens>
2.    Библиотеки форматирования:
        o    Интернационализация: <fmt:message>, <fmt:setLocale>, <fmt:bundle>, <fmt:setBundle>, <fmt:param>, <fmt:requestEncoding>
        o    Форматирование: <fmt:timeZone>, <fmt:setTimeZone>, <fmt:formatNumber>, <fmt:parseNumber>, <fmt:parseDate>
3.    Библиотеки «SQL»:
        o    Работа с БД: <sql:query>, <sql:update>, <sql:setDataSource>, <sql:param>, <sql:dateParam>
4.    Библиотеки XML:
        o    Общие XML операции: <x:parse>, <x:out>, <x:set>
        o    XML-контроль: <x:if>, <x:choose>, <x:when>, <x:otherwise>, <x:forEach>
        o    Трансформации: <x:transform>, <x:param>

8 комментариев:

  1. Спасибо за пост, помог быстро разобраться с JSTL, а не читать "JSTL. Практическое руководство для JSP-программистов" Сью Шпильмана, которое безусловно полезно прочитать, но на это нужно время)

    ОтветитьУдалить
  2. Этот комментарий был удален автором.

    ОтветитьУдалить
  3. пример для c:import, значение аттрибута url нужно обнести кавычками. Поправьте

    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. Этот комментарий был удален автором.

    ОтветитьУдалить
  6. Этот комментарий был удален автором.

    ОтветитьУдалить
  7. Почему же c:out "лучше, чем вывод типа ${pageContext.parameter} тем, что позволяет контролировать специальные символы html, такие как <, >, &, ‘ и “"? Ведь и функция fn:escapeXml позволяет делать то же самое в выводе чез знак "$" и фигурные скобки: ${fn:escapeXml(pageContext.parameter)}. Так что здесь в зависимости от ситуации и предпочтений.

    ОтветитьУдалить

Примечание. Отправлять комментарии могут только участники этого блога.