- •Раздел 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. Библиотеки тегов
Раздел 14. Технология JavaServer Pages
14.1. Введение в jsp
Технология Java Server Pages (JSP) появилась как развитие технологии сервлетов в целях упрощения разработки веб-страниц, совмещающих в себе статическое и динамическое содержимое.
JSP-страница может включать:
-
Статические данные (обычно HTML-код).
-
JSP-директивы.
-
JSP-скриптлеты.
-
JSP-действия.
-
EL-выражения (Expression Language).
-
Теги разработчика (создаются с помощью так называемых библиотек тегов, Tag Libraries).
В соответствии с данной технологией, разработка JSP-страницы ведется следующим образом: вы подготавливаете текстовый документ, например, используя язык HTML или XML, а динамически формируемый код включаете в специальные теги.
Ниже приведен простейший пример JSP-страницы, генерирующей HTML-документ, в котором выводится приветствие, используя имя из параметра name:
<HTML>
<HEAD>
<TITLE>Привет.</TITLE>
</HEAD>
<BODY>
<H1>Привет, <%= request.getParameter("name") %>!</H1>
</BODY>
</HTML>
14.2. Жизненный цикл jsp-страниц
Веб-сервер (сервлет-контейнер) транслирует JSP-страницы в сервлеты, которые, затем, компилируются в байт-код. При изменении исходной JSP-страницы перепостроение и компиляция соответствующего сервлета происходит автоматически.
JSP-страницы размещаются в корне веб-модуля или любых подкаталогах веб-модуля, кроме папки WEB-INF, в которой размещаются сервлеты и другие служебные файлы.
Рекомендуемое расширение файлов с JSP-страницами: jsp.
14.3. Основной синтаксис JSP
Базовыми конструкциями языка JSP являются: директивы, скриптовые элементы (скриптлеты) и JSP-действия.
Директивы
Директивы JSP — специальные конструкции, управляющие процессом генерации сервлетов.
Директива include
Директива указывает, что до трансляции страницы в сервлет в данном месте нужно вставить содержимое указанного файла. Такая вставка аналогична простому копированию содержимого файла.
Синтаксис:
<%@ include file="filename.jspf" %>
где filename — имя файла, jspf — рекомендуемое расширение файлов-включений.
Директива page
Директива содержит информацию о структуре сервлета. Наиболее важные опции директивы page следующие:
-
import — импорт пакетов или классов (вставляет оператор import в результирующий сервлет);
-
contentType — указывает тип и кодировку генерируемого HTML-документа;
-
pageEncoding — указывает кодировку исходной JSP-страницы.
Примеры:
<%-- вставляет оператор import java.util.*; в сервлет--%>
<%@ page import="java.util.*" %>
<%-- содержимое результирующего документа кодируется в UTF-8,
в ответ вставляется заголовок, информирующий браузер о типе (документ HTML) и кодировке данных, аналог метода setContentType --%>
<%@ page contentType="text/html; charset=UTF-8" %>
<%-- указывает, что кодировка данного файла UTF-8--%>
<%@ page pageEncoding="UTF-8" %>
Директива taglib
Используется для подключения библиотеки тегов в JSP-страницу. Библиотеки тегов подробнее рассматриваются ниже, общий синтаксис директивы:
<%@ taglib prefix="myprefix" uri="uri" %>
Скриптовые элементы
Скриптовые элементы позволяют вставлять Java-код непосредственно в сервлет.
Комментарии
Комментарий, который не отсылается клиенту:
<%-- комментарий --%>
Объявления
Объявления содержат объявления полей и методов, которые будут частью объявления класса, когда JSP-страница будет переводиться в сервлет:
<%!
int counter = 0;
type method(…) {
…
}
%>
Скриптлеты
Скриптлеты содержат операторы, которые будут вставлены в метод-обработчик сервлета без изменений:
<%
Collection <String> list = new LinkedList<String>();
list.add("Один");
list.add("Два");
list.add("Три");
%>
Выражения
JSP-выражения — это Java-выражения, которые вычисляются и отсылаются клиенту при каждом запросе:
<%="Привет!".toUpperCase()%>
Эта конструкция аналогична скриптлету:
<% out.print("Привет!".toUpperCase()); %>
Предопределенные объекты
В скриптлетах и выражениях доступны несколько предопределенных объектов:
-
request: объект типа HttpServletRequest, ассоциированный с обрабатываемым запросом. Используется для доступа к параметрам запроса, HTTP-заголовкам, типу запроса и др.
-
response: объект типа HttpServletResponse, ассоциированный с ответом, генерируемым JSP-страницей. Может быть использован для установки кода статуса ответа и HTTP-заголовков ответа.
-
out: объект типа PrintWriter, используется для прямой отправки данных клиенту.
-
session: объект типа HttpSession, ассоциированный с запросом, для доступа к объектам, связанным с текущей клиентской сессией.
-
application: объект типа ServletContext, полученный методом сервлета getServletContext. Из этого объекта можно извлечь информацию о веб-сервере и веб-модуле и сохранить данные (используя методы setAttribute и getAttribute), которые будут доступны всем сервлетам и JSP-страницам веб-модуля.
Во всех трех объектах request, session и application есть методы для сохранения и извлечения объектов setAttribute и getAttribute, которые различаются сроком жизни объектов:
-
request: переменные хранятся в рамках одного запроса;
-
session: переменные хранятся в рамках одной клиентской сессии;
-
application: переменные хранятся до перезагрузки сервера или явного их удаления методом removeAttribute.
Пример JSP-страницы, выводящей список студентов:
<%@ page import="example.Student" %>
<%@ page import="java.util.Collection" %>
<%@ page contentType="text/html; charset=utf-8" %>
<%-- Получаем список студентов из объекта request
(список должен быть проинициализирован ранее) --%>
<% Collection<Student> students = (Collection<Student>) request.getAttribute("students"); %>
<html>
<head><title>Список студентов</title></head>
<body>
<ul>
<%-- В цикле формируем неупорядоченный список студентов--%>
<% for (Student student : students) { %>
<li><%=student.getFullName()%></li>
<% } %>
</ul>
</body>
</html>