JSP по умолчанию позволяет встраивать код на java в разметку html. Однако иногда использование стандартных способов для ряда операций, например, для вывода на страницу элементов из списка и т.д., может быть несколько громоздким. Чтобы упростить встраивание кода java в JSP была разработана специальная библиотека - JSTL. JSTL (JSP Standard Tag Library) предоставляет теги для базовых задач JSP (цикл, условные выражения и т.д.)
Эта библиотека не является частью инфраструктуры Java EE, поэтому ее необходимо добавлять в проект самостоятельно. Библиотеку можно найти по адресу https://search.maven.org/remotecontent?filepath=javax/servlet/jstl/1.2/jstl-1.2.jar.
В проекте Eclipse эту библиотеку необходимо добавить в папку WebContent/WEB-INF/lib:
Несмотря на то, что JSTL часто называется библиотекой, на самом деле она содержит ряд библиотек:
Core: содержит основные теги для наиболее распространенных задач.
Использует префикс "c" и uri "http://java.sun.com/jsp/jstl/core"
Formatting: предоставляет теги для форматирования чисел, дат, времени.
Использует префикс "fmt" и uri "http://java.sun.com/jsp/jstl/fmt"
SQL: предоставляет теги для работы с sql-запросами и источниками данных.
Использует префикс "sql" и uri "http://java.sun.com/jsp/jstl/sql"
XML: предоставляет теги для работы с xml.
Использует префикс "x" и uri "http://java.sun.com/jsp/jstl/xml"
Functions: предоставляет функции для работы со строками.
Использует префикс "fn" и uri "http://java.sun.com/jsp/jstl/functions"
Для подключения функционала этих библиотек на страницу jsp применяется директива taglib. Например, подключения основной библиотеки:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Рассмотрим некоторые базовые и наиболее используемые возможности JSTL.
Стандартный синтаксис EL не позволяет нам экранировать теги. Например, допустим, в сервлете в jsp передается некоторый текст, который содержит код html:
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("message", "<script>alert('Hello gold')</script>");
getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
}
}
Передаваемая здесь строка содержит javascript-код, который отображает диалоговое окно. Но естественно код мог бы быть менее безобидным. И если в jsp для вывода атрибута message применяется только стандартный EL:
<p>${message}</p>
то в результате этот html-код будет внедрен напрямую в страницу:
Теперь используем возможности JSTL:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>JSTL</title>
</head>
<body>
<p><c:out value="${message}" /></p>
</body>
</html>
Тег c:out позволяет декодировать теги html. Его атрибут value указывает на выводимое значение. В итоге мы получим совсем другой вывод:
Через атрибуты сервлет передает данные в JSP. Однако вполне возможно, что из-за каких-то условий нужное значение не будет передано. В этом случае мы можем установить для тега <c:out>
значение по умолчанию, используя его параметр default:
<p><c:out value="${message2}" default="Hello world" /></p>
И если значение для атрибута message2 не передано, то для него будет использоваться строка "Hello world".