
- •Раздел 12. Веб-сервера
- •12.2. Стандарт cgi
- •Раздел 13. Технология Java Servlet
- •Пример сервлета
- •Компиляция сервлетов
- •Структура веб-модуля
- •Запуск сервлета
- •Архив веб-модуля
- •13.2. Структура и жизненный цикл сервлета
- •Работа сервлетов в многопоточной среде
- •13.3. Основные классы Servlet api Класс HttpServletRequest (запрос)
- •Класс HttpServletResponse (ответ)
- •Класс HttpServlet (сервлет)
- •Класс ServletContext (взаимодействие с сервлет-контейнером)
- •13.4. Cookies и сессии
- •13.5. Отладка сервлетов
- •Раздел 14. Технология JavaServer Pages
- •14.1. Введение в jsp
- •14.2. Жизненный цикл jsp-страниц
- •Действия
- •14.4. Язык выражений
- •Предопределенные объекты
- •14.5. Библиотеки тегов
- •Раздел 14. Технология JavaServer Pages
- •14.1. Введение в jsp
- •14.2. Жизненный цикл jsp-страниц
- •Действия
- •14.4. Язык выражений
- •Предопределенные объекты
- •14.5. Библиотеки тегов
Действия
JSP-действия — это специальные теги, которые вызывают выполнение серверного кода. Действия подразделяются на стандартные и расширенные, подключающие код дополнительных библиотек — библиотек тегов.
Пример стандартного действия — действие include (не путать с директивой include):
<jsp:include page="page.jsp" />
Это действие вызывает передачу выполнения запроса странице page.jsp, по завершению обработки которой выполнение запроса продолжается текущей JSP-страницей.
Все стандартные действия имеют префикс «jsp:», их очень ограниченный набор: include, forward, useBean и некоторые другие.
14.4. Язык выражений
В спецификацию JSP, начиная с версии 2.0, был добавлен язык выражений (Expression Language, EL), позволяющий упростить доступ к данным.
Синтаксис:
${EL-выражение}
Примеры EL- выражений:
-
${1+1};
-
${!empty param.id} — возвращает true, если параметр id не пустой;
-
${myArray[1]} — доступ к элементу массива;
-
${myList[1]} — доступ к элементу списка (List);
-
${employee.name} — доступ к свойству объекта;
-
${myMap.key} — доступ к значению по ключу в объекте Map.
Конструкции EL-выражений могут помещаться:
-
внутри статического текста;
-
в качестве значений атрибутов, допускающих EL-выражения (при вызове библиотечного тега).
Предопределенные объекты
В EL-выражениях доступны следующие объекты:
-
рaram — объект Map, содержащий параметры запроса (аналог request.getParameter);
-
paramValues — объект Map, содержащий массив значений каждого параметра запроса (аналог request.getParameterValues);
-
pageScope — объект Map, содержащий атрибуты (установленные методом setAttribute) контекста страницы;
-
requestScope — объект Map, содержащий атрибуты контекста запроса;
-
sessionScope — объект Map, содержащий атрибуты контекста сессии;
-
applicationScope — объект Map, содержащий атрибуты контекста приложения.
Если, например, объект student размещается в контексте запроса, то обратиться к нему можно так:
${requestScope.student}
Данная конструкция аналогична следующей:
<%=request.getAttribute("student")%>
Кроме того, возможно обращение к объекту без указания контекста поиска, например:
${student}
В этом случае, объект student будет последовательно искаться в контексте страницы (pageScope), затем в контексте запроса (requestScope), сессии (sessionScope) и приложения (applicationScope).
14.5. Библиотеки тегов
Библиотеки тегов позволяют расширить функциональность JSP с помощью дополнительных тегов, выполняемых на стороне сервера, аналогично стандартным JSP-действиям (include, forward и проч.).
Библиотеки тегов решают две задачи:
-
Инкапсулируют некоторую функциональность, часто востребованную при разработке JSP-страниц, что позволяет повторно использовать код.
-
Помогают очистить код JSP-страниц от чрезмерного использования скриптовых элементов, сделать код более удобным к восприятию и в разработке.
Например, вам может понадобиться на нескольких страницах выводить неупорядоченный список элементов коллекции students. Удобно было бы определить тег, принимающий коллекцию как параметр и генерирующий соответствующий неупорядоченный список.
Для этого нужно:
-
Создать класс, реализующий специальный интерфейс javax.servlet.jsp.tagext.Tag, с требуемой функциональностью.
-
Создать XML-файл с расширением .tld, содержащий определение тега (или тегов), где задаются URI библиотеки, названия тегов и другие параметры (в т. ч. название классов с реализацией).
-
Добавить в JSP-страницу директиву, подключающую библиотеку тегов.
-
Файл с определением библиотеки тегов и реализующие теги классы должны быть видны в контексте веб-приложения. Обычно классы и файл .tld, помещенный в папку META-INF, пакуют в архив, который помещают в папку WEB-INF/lib веб-приложения.
Пусть в файле с описанием библиотеки тегов параметр URI задан равным http://mytaglib/, тег имеет название list и в нем определен атрибут collection.
Тогда директива, подключающая нашу библиотеку в JSP будет выглядеть следующим образом:
<%@ taglib prefix="myprefix" uri=" http://mytaglib/" %>
А соответствующее JSP-действие так:
<myprefix:list collection="${students}" />
Обязательный атрибут prefix в директиве taglib определяет префикс для обращения к тегу myprefix:list. Он введен для того, чтобы была возможность при подключении нескольких библиотек тегов отличать теги друг от друга и от обычных HTML-тегов.
В качестве примера использования реальной библиотеки тегов можно рассмотреть стандартную библиотеку тегов JSP (JSP Standard Tag Library, JSTL). Она, в частности, содержит теги-условия и теги-итераторы:
<%--Если объект user не определен, то выводим "Вы еще не зашли в систему!"--%>
<c:if test="${empty user}">
Вы еще не зашли в систему!
</c:if>
<%-- Выводим список студентов--%>
<c:forEach var="student" items="${student}">
Имя: <c:out value="${student.firstName}" /><br />
Фамилия: <c:out value="${student.lastName}" /><br />
</c:forEach>
Кроме библиотеки JSTL существуют и другие готовые библиотеки тегов для различных нужд.
Пользовательские теги фактически являются альтернативой скриптлетам и позволяют создавать JSP-страницы без явного использования Java-кода, вынося код в реализацию конкретных тегов.