Рассмотрим некоторые основные возможности 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>