Рассмотрим некоторые основные возможности JSTL.
Вывод в цикле элементов массива или коллекции:
<c:forEach var="user" items="${users}"> <p>${user}</p> </c:forEach>
В данном случае параметр "items" указывает на коллекцию, элементы которой выводятся. А параметр "var" задает переменную, через которую доступен текущий перебираемый элемент.
Например, в сервлет передается массив строк:
public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String[] users = new String[]{"Tom", "Bob", "Sam"}; request.setAttribute("users", users); getServletContext().getRequestDispatcher("/index.jsp").forward(request, response); } }
В jsp мы можем получить и вывести элементы массива следующим образом:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>User Info</title> </head> <body> <ul> <c:forEach var="user" items="${users}"> <li><c:out value="${user}" /></li> </c:forEach> </ul> </body> </html>
Еще один пример - вывод в цикле всех куки:
<ul> <c:forEach var="cook" items="${cookie}"> <li> <p><c:out value="${cook.value.name}" /></p> <p><c:out value="${cook.value.value}" /></p> </li> </c:forEach> </ul>
Выражение if:
<c:if test="${isVisible == true}"> <p>Visible</p> </c:if>
В данном случае если атрибут isVisible равен true, то выводится код, который расположен между тегами
<c:if>
и </c:if>
Если надо задать альтернативную логику, то можно добавить тег c:if
, который проверяет противоположное условие:
<c:if test="${isVisible == true}"> <p>Visible</p> </c:if> <c:if test="${isVisible == false}"> <p>Invisible</p> </c:if>
Тег c:choose
подобно конструкции switch...case в Java проверяет объект на соответствие одному из значений. Например
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>JSTL in JSP</title> </head> <body> <c:choose> <c:when test="${val == 1}"> <p>Equals to 1</p> </c:when> <c:when test="${val == 2}"> <p>Equals to 2</p> </c:when> <c:otherwise> <p>Undefined</p> </c:otherwise> </c:choose> </body> </html>
В данном случае тег c:choose
проверяет значение атрибута "val". Для проверки применяются вложенные теги
c:when
, которые аналогичны блокам case в конструкции switch..case. С помощью их параметра test
значение атрибута сравнивается с определенным значением. И если выражения сравнения истинно, то выводится код, который размещен
внутри данного элемента c:when. Таким образом мы можем определить несколько блоков c:when. Дополнительный тег <c:otherwise>
выполняется, если условия проверки значения во всех тегах c:when ложно.
Тег <c:url>
позволяет создать адрес относительно корня приложения. Этот тег может применяться, например, при создании
ссылок.
Например,
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>JSTL in JSP</title> </head> <body> <a href='<c:url value="/edit" />'><c:url value="/edit" /></a> </body> </html>
Параметр value
содержит часть адреса, которая добавляется к корню приложения.
С помощью тега redirect
можно установить редирект на другой адрес. Например, в случае если атрибут val не определен, то
делаем редирект на страницу "notfound.jsp":
<c:if test="${val == null}"> <c:redirect url="/notfound.jsp" /> </c:if>