Слайд 2
2011 © EPAM Systems, RD Dep.
Содержание
Основы протокола HTTP
Платформа
J2EE
Структура web-приложения
Сервлет. Request. Response
MVC
JSP (start)
Жизненный цикл сервлета и JSP
Взаимодействие
сервлета и JSP
Сессии
Cookies
Совместное использование ресурсов
События
Фильтры
Слайд 3
ОСНОВЫ ПРОТОКОЛА HTTP
2011 © EPAM Systems, RD Dep.
Слайд 4
Основы протокола HTTP
HTTP - Hyper Text Transfer Protocol
Определяет
передачу данных во время жизненного цикла сокета
Работает в среде
запрос-ответ (request-response)
Путь общения между браузерами и web-серверами
Работа по протоколу HTTP происходит следующим образом: программа-клиент устанавливает TCP-соединение с сервером (стандартный номер порта-80) и выдает ему HTTP-запрос. Сервер обрабатывает этот запрос и выдает HTTP-ответ клиенту.
2011 © EPAM Systems, RD Dep.
Слайд 5
Основы протокола HTTP
Структура HTTP-запроса
HTTP-запрос состоит из заголовка запроса
и тела запроса, разделенных пустой строкой. Тело запроса может
отсутствовать.
Заголовок запроса состоит из главной (первой) строки запроса и последующих строк, уточняющих запрос в главной строке. Последующие строки также могут отсутствовать.
2011 © EPAM Systems, RD Dep.
Слайд 6
Основы протокола HTTP
Запрос в главной строке состоит из
трех частей, разделенных пробелами:
Метод (иначе говоря, команда HTTP):
GET - запрос документа. Наиболее часто употребляемый метод.
HEAD - запрос заголовка документа. Отличается от GET тем, что выдается только заголовок запроса с информацией о документе. Сам документ не выдается.
POST - этот метод применяется для передачи данных скриптам. Сами данные следуют в последующих строках запроса в виде параметров.
PUT - разместить документ на сервере. Запрос с этим методом имеет тело, в котором передается сам документ.
2011 © EPAM Systems, RD Dep.
Слайд 7
Основы протокола HTTP
Ресурс –
это путь к определенному файлу
на сервере, который клиент хочет получить (или разместить -
для метода PUT). Если ресурс - просто какой-либо файл для считывания, сервер должен по этому запросу выдать его в теле ответа. Если же это путь к какому-либо скрипту, то сервер запускает скрипт и возвращает результат его выполнения. Кстати, благодаря такой унификации ресурсов для клиента практически безразлично, что он представляет собой на сервере.
2011 © EPAM Systems, RD Dep.
Слайд 8
Основы протокола HTTP
Версия протокола –
версия протокола HTTP,
с которой работает клиентская программа.
Таким образом, простейший HTTP-запрос
может выглядеть следующим образом:
GET / HTTP/1.0
- здесь запрашивается корневой файл из корневой директории web-сервера.
2011 © EPAM Systems, RD Dep.
Слайд 9
Основы протокола HTTP
Строки после главной строки запроса имеют
следующий формат:
параметр:значениe
Таким образом задаются параметры запроса. Это
является необязательным, все строки после главной строки запроса могут отсутствовать; в этом случае сервер принимает их значение по умолчанию или по результатам предыдущего запроса (при работе в режиме Keep-Alive).
2011 © EPAM Systems, RD Dep.
Слайд 10
Основы протокола HTTP
Некоторые наиболее употребительные параметры HTTP-запроса:
Connection
(соединение) – может принимать значения Keep-Alive и close. Keep-Alive
("оставить в живых") означает, что после выдачи данного документа соединение с сервером не разрывается, и можно выдавать еще запросы. Большинство браузеров работают именно в режиме Keep-Alive, так как он позволяет за одно соединение с сервером "скачать" html-страницу и рисунки к ней. Будучи однажды установленным, режим Keep-Alive сохраняется до первой ошибки или до явного указания в очередном запросе Connection: close.
close ("закрыть") - соединение закрывается после ответа на данный запрос.
2011 © EPAM Systems, RD Dep.
Слайд 11
Основы протокола HTTP
User-Agent - значением является "кодовое обозначение"
браузера, например:
Mozilla/4.0 (compatible; MSIE 5.0; Windows 95; DigExt)
Accept - список поддерживаемых браузером типов содержимого в порядке их предпочтения данным браузером, например для моего IE5:
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
Это нужно для случая, когда сервер может выдавать один и тот же документ в разных форматах.
2011 © EPAM Systems, RD Dep.
Слайд 12
Основы протокола HTTP
Referer - URL, с которого перешли
на этот ресурс.
Host - имя хоста, с которого
запрашивается ресурс. Полезно, если на сервере имеется несколько виртуальных серверов под одним IP-адресом. В этом случае имя виртуального сервера определяется по этому полю.
Accept-Language - поддерживаемый язык. Имеет значение для сервера, который может выдавать один и тот же документ в разных языковых версиях.
2011 © EPAM Systems, RD Dep.
Слайд 13
Основы протокола HTTP
2011 © EPAM Systems, RD Dep.
Слайд 14
ПЛАТФОРМА J2EE
2011 © EPAM Systems, RD Dep.
Слайд 15
Платформа J2EE
Java 2 Platform, Enterprise Edition (J2EE) определяет
стандарт для разработки многоуровневых корпоративных приложений.
Java 2 Enterprise Edition
- это комплекс взаимодействующих Java-технологий, базирующихся на спецификациях, разработанных фирмой Sun Microsystems (http://java.sun.com/j2ee/), представляющих стандарт разработки серверных приложений уровня предприятия.
2011 © EPAM Systems, RD Dep.
Слайд 16
Платформа J2EE
J2EE - это не конкретный продукт,
а набор спецификаций, устанавливающих правила, которых следует придерживаться поставщикам
конкретной реализации платформы J2EE, а также разработчикам корпоративных приложений.
Цифра "2" в названии спецификации связана с тем, что все технологии, охватываемые спецификациями J2EE, базируются на инструментальном комплекте поддержки разработок в среде Java - JDK (Java Development Kit) версии 1.2 и старше.
2011 © EPAM Systems, RD Dep.
Слайд 17
Платформа J2EE
Технологии J2EE ориентированы на разработку серверной стороны
приложения и облегчают, в первую очередь, процесс эффективной реализации
среднего уровня (Middle tier), содержащего бизнес-логику.
Стандарт Java EE расширяет платформу Java Standard Edition (Java SE) добавляя поддержку веб-сервисов, модели бизнес компонентов, API управления, коммуникационных протоколов, распределенных и веб-приложений. Веб-приложения являются лишь частью того, что описывает Java EE.
2011 © EPAM Systems, RD Dep.
Слайд 18
Платформа J2EE
Стандартный Java EE сервер приложений должен поддерживать
такие технологии как EJB (сервер и контейнер), JNDI, JMS
(Java Message Service), JTA (Java Transaction API), архитектуру J2EE Connector.
Java EE задает контейнеры для серверных приложений, сервлетов, EJB компонентов.
Такие контейнеры предоставляют функциональность, позволяющую устанавливать, сохранять и выполнять поддерживаемые компоненты.
2011 © EPAM Systems, RD Dep.
Слайд 19
Платформа J2EE
Java EE также предоставляет стандартную архитектуру для
взаимодействия Java EE приложений и серверов приложений с гетерогенными
корпоративными информационными системами, такими как ERP-системы, мейнфреймы, системы баз данных и т.д.
Архитектура Java EE Connector предоставляет средства взаимодействия с корпоративными системами используя стандартный интерфейс, известный как адаптер ресурсов (Resource adapter).
2011 © EPAM Systems, RD Dep.
Слайд 20
Платформа J2EE
2011 © EPAM Systems, RD Dep.
Сервис:
Java Naming Directory (JNDI)
– универсальный сервис
хранения объектов
в иерархической структуре имен
(аналогично файловой системе)
Ресурс:
DataSource
- объект, позволяющий приложению
получить доступ к соединению к БД
Слайд 21
Платформа J2EE
Платформа J2EE использует модель многоуровневого распределенного приложения.
Логически приложение разделено на компоненты в соответствии с их
функциональностью.
Различные компоненты, составляющие J2EE-приложение, установлены на различных компьютерах (слоях) в зависимости от их уровня в многоуровневой среде J2EE, которой данный компонент принадлежит.
Компоненты клиентского уровня работают на клиентской машине.
Компоненты Web-уровня работают на J2EE-сервере.
Компоненты бизнес-уровня работают на J2EE-сервере.
Программное обеспечение уровня корпоративной информационной системы (EIS) работает на EIS-сервере.
2011 © EPAM Systems, RD Dep.
Слайд 22
Платформа J2EE
Приложение Java EE может состоять из нескольких
компонентов, таких как, например, EJB, веб-модули, адаптеры ресурсов, клиентские
модули J2EE.
Каждый из компонентов может иметь свой дескриптор развертывания – XML файл, описывающий компонент.
Для разворачивания Java EE компонентов применяется файл в формате «Java архив» (JAR), который расширяется несколькими дополнительными форматами в зависимости от того или иного типа компонента. Формат JAR основан на формате ZIP.
2011 © EPAM Systems, RD Dep.
Слайд 23
Платформа J2EE
JAR файл может содержать Java классы, XML
файлы, вспомогательные ресурсы, статические HTML файлы и другие.
Стандартное Java
веб-приложение разворачивается в WAR (Web Application Archive) файле, который является JAR файлом с расширением WAR.
Стандартное Java EE приложение разворачивается в EAR (Enterprise Application Archive) файле, который является JAR файлом с расширением EAR.
2011 © EPAM Systems, RD Dep.
Слайд 24
Платформа J2EE
WAR файл - это специализированный JAR файл,
содержащий такие компоненты веб-приложения как сервлеты, JSP файлы, HTML
файлы, дескрипторы развертывания, библиотеки классов и тому подобное.
WAR файл может быть развернут на веб-сервере, таком как Tomcat.
2011 © EPAM Systems, RD Dep.
Слайд 25
Платформа J2EE
EAR файл – это специализированный JAR файл,
содержащий компоненты Java EE приложения, такие как веб-приложения (WAR),
EJB, адаптеры ресурсов и так далее.
Файл EAR может быть развернут на сервере приложений Java EE, таком как JBoss, WebLogic или WebSphere.
Сервер приложений Java EE загружает EAR файлы в процессе выполнения и устанавливает обнаруженные в нем компоненты на основе инструкций, описанных в дескрипторе развертывания каждого компонента.
2011 © EPAM Systems, RD Dep.
Слайд 26
СТРУКТУРА WEB-ПРИЛОЖЕНИЯ
2011 © EPAM Systems, RD Dep.
Слайд 27
Структура web-приложения
Компоненты типичного Java EE приложения
2011 © EPAM
Systems, RD Dep.
Слайд 28
Структура web-приложения
Традиционно, корпоративное Java EE приложение определяется как
набор следующих компонентов и технологий:
EAR файлы
Java сервлеты
JavaServer Pages или JavaServer Faces
Enterprise JavaBeans (EJB)
Сервисы аутентификации и авторизации (JAAS)
Архитектура J2EE Connector
JavaBeans Activation Framework (JAF)
JavaMail
Java Message Service (JMS)
Java Persistence API (JPA)
Java Transaction API (JTA)
The Java Management Extensions (JMX) API
Java API for XML Processing (JAXP)
The Java API for XML-based RPC (JAX-RPC)
The Java Architecture for XML Binding (JAXB)
The SOAP with Attachments API for Java (SAAJ)
Java Database Connectivity (JDBC) framework
2011 © EPAM Systems, RD Dep.
Слайд 29
Структура web-приложения
В свою очередь, веб-приложение Java объединяет подмножество
компонентов и технологий корпоративного приложения, таких как:
WAR файлы
Java сервлеты
JavaServer Faces или JavaServer Pages
Java Database Connectivity (JDBC) framework
Популярные Фреймворки, такие как Apache Struts, Spring, Hibernate и другие стирают традиционную грань между корпоративными приложениями и веб-приложениями. Каждый фреймворк предлагает свою точку зрения на то, как решить ту или иную задачу. Каждый фреймворк пытается более эффективно решить те или иные сложности, возможно используя набор дополнительных технологий.
2011 © EPAM Systems, RD Dep.
Слайд 30
Структура web-приложения
В типичном Java EE веб-приложении HTML клиент
отправляет запрос серверу, где этот запрос обрабатывается веб-контейнером сервера
приложений. Веб-контейнер вызывает сервлет, который сконфигурирован для обработки определенного контекста запроса.
2011 © EPAM Systems, RD Dep.
Слайд 31
Структура web-приложения
Как только сервлет получает начальный запрос, инициируется
выполнение определенной бизнес логики для завершения запроса. При этом
вызывается один или несколько бизнес сервисов или компонентов
2011 © EPAM Systems, RD Dep.
Слайд 32
Структура web-приложения
Некоторым бизнес сервисам или компонентам требуется доступ
к хранилищам данных или информационным системам. Как правило, для
этих целей вводится дополнительный слой абстракции между бизнес-сервисами и хранилищем данных, что позволяет сделать максимально безболезненным возможное изменение источника данных в будущем. При этом объекты доступа к данным (DAO) представляются отдельными компонентами
2011 © EPAM Systems, RD Dep.
Слайд 33
Структура web-приложения
Когда обработка запроса на сервере завершена, HTML
клиенту возвращается ответ в определенном формате.
Этот сценарий может быть
реализован с использованием ограниченного набора Java EE технологий, таких как, например, сервлеты, JDBC, JSP и тому подобные. Tomcat как и другие веб-серверы, предоставляющие среду выполнения сервлетов и JSP, вполне могут быть использованы как серверы приложений для данного сценария.
2011 © EPAM Systems, RD Dep.
Слайд 34
Структура web-приложения
Структура J2EE Web-приложения
2011 © EPAM Systems, RD
Dep.
Слайд 35
Структура web-приложения
Web-приложение должно включать:
Основную (базовую)директорию [имя директории является
именем приложения]
WEB-INF директорию
web.xml файл конфигурации [Deployment Descriptor (дескриптор развертывания)]
Web-приложение
может включать:
Servlets [located in WEB-INF\classes dir]
JSP files
HTML files
Documents, Images
Jars and other classes [usually in a lib directory]
2011 © EPAM Systems, RD Dep.
Слайд 36
Структура web-приложения
Базовая структура веб-приложения должна включать корневую директорию,
WEB-INF директорию и дескриптор развертывания web.xml.
Название корневого каталога будет
частью URL, указывающего на один из содержащихся ресурсов, и используемый в качестве имени приложения.
Например, вызов index.html файла, расположенного в корне каталога ‘mysite’, может быть сделан как:
http://localhost:8080/mysite или http://localhost:8080/mysite/index.html
2011 © EPAM Systems, RD Dep.
Слайд 37
Структура web-приложения
Web.xml конфигурационный файл используется для:
Объявление классов servlet
и JSPs
Отображения servlets и JSPs в URL шаблоны
Определения welcom-страниц
Установления
безопасности содержимого, ролей и методов аутентификации
2011 © EPAM Systems, RD Dep.
Слайд 38
Структура web-приложения
Любой класс, который загружен и выполнен в
веб-контейнерах, должен быть расположен в WEB-INF\CLASSES.
Это могут быть:
Servlets
Java
Beans (used in JSP)
Tag libraries classes (used in JSP)
Helper classes
Все классы, расположенные в директории classes, могут быть собраны в пакеты.
2011 © EPAM Systems, RD Dep.
Слайд 39
Структура web-приложения
Другие файлы как JSPs и статическое содержание
могут быть расположены где угодно в соответствии с корневой
директорией, но местоположение будет отражено в URL, используемом, чтобы вызвать их.
Например, если index.html страница расположена в mysite\pages\ каталоге, URL должен быть похож на:
http://localhost:8080/mysite/pages/index.html
2011 © EPAM Systems, RD Dep.
Слайд 40
Структура web-приложения
Jars и другие java классы, используемые в
приложении, могут быть помещены куда угодно в соответствии с
корнем директории или даже вне приложения (обычно в lib).
2011 © EPAM Systems, RD Dep.
Слайд 41
СЕРВЛЕТ. REQUEST. RESPONSE
2011 © EPAM Systems, RD Dep.
Слайд 42
Сервлет. Request. Response
Сервлеты – это компоненты приложений Java
Enterprise Edition, выполняющиеся на стороне сервера, способные обрабатывать клиентские
запросы и динамически генерировать ответы на них.
Наибольшее распространение получили сервлеты, обрабатывающие клиентские запросы по протоколу HTTP.
Сервлеты можно внедрять в различные сервера, так как API сервлета, который вы используете для его написания, ничего не «знает» ни о среде сервера, ни о его протоколе.
Множество Web-серверов поддерживает технологию Java Servlet.
2011 © EPAM Systems, RD Dep.
Слайд 43
Сервлет. Request. Response
Пакет javax.servlet обеспечивает интерфейсы и классы
для написания сервлетов.
Центральной абстракцией API сервлета является интерфейс Servlet.
Все сервлеты реализуют данный интерфейс напрямую, но более распространено расширение класса, реализующего его, как HttpServlet.
Интерфейс Servlet объявляет, но не реализует методы, которые управляют сервлетом и его взаимодействием с клиентами.
2011 © EPAM Systems, RD Dep.
Слайд 44
Сервлет. Request. Response
Servlets API
2011 © EPAM Systems, RD
Dep.
Слайд 45
Сервлет. Request. Response
Принимая запрос от клиента, сервлет получает
два объекта:
ServletRequest, который инкапсулирует связь клиента с сервером.
ServletResponse, который
инкапсулирует обратную связь сервлета с клиентом.
ServletRequest и ServletResponse – это интерфейсы, определенные пакетом javax.servlet.
2011 © EPAM Systems, RD Dep.
Слайд 46
Сервлет. Request. Response
Интерфейс ServletRequest дает сервлету доступ к:
Информации,
такой, как имена параметров, переданных клиентом, протоколы (схемы), используемые
клиентом и имена удаленного хоста, создавшего запрос и сервера который их получает.
Входному потоку ServletInputStream. Сервлеты используют входной поток для получения данных от клиентов, которые используют протоколы приложений, такие как HTTP POST и PUT методы.
Интерфейсы, которые расширяют интерфейс ServletRequest, позволяют сервлету получать больше данных, характерных для протокола. К примеру, интерфейс HttpServletRequest содержит методы для доступа к главной информации по протоколу HTTP.
2011 © EPAM Systems, RD Dep.
Слайд 47
Сервлет. Request. Response
Интерфейс ServletResponse дает сервлету методы для
ответа на запросы клиента.
Он:
Позволяет сервлету устанавливать длину содержания
и тип MIME ответа (метод setContentType(String type)).
Обеспечивает исходящий поток ServletOutputStream и Writer, через которые сервлет может отправлять ответные данные.
Интерфейсы, которые расширяют интерфейс ServletResponse, дают сервлету больше возможнойстей для работы с протоколами. Например, интерфейс HttpServletResponse содержит методы, которые позволяют сервлету манипулировать информацией заголовка HTTP.
2011 © EPAM Systems, RD Dep.
Слайд 48
Сервлет. Request. Response
HttpServlet - запросы и ответы
Методы класса
HttpServlet, которые управляют клиентскими запросами принимают два аргумента:
Объект HttpServletRequest,
который инкапсулирует данные от клиента
Объект HttpServletResponse, который инкапсулирует ответ к клиенту
2011 © EPAM Systems, RD Dep.
Слайд 49
Сервлет. Request. Response
Объект HttpServletRequest
Объекты HttpServletRequest предоставляют доступ к
данным HTTP заголовка и позволяют получить аргументы, которые клиент
направил вместе с запросом.
Непосредственно в интерфейсе HttpServletRequest объявлен ряд методов, позволяющих манипулировать содержимым запросов:
String getParameter(String name) - возвращает величину именованных параметров.
String[] getParameterValues(String name) - возвращает массив величин именованного параметра. Используется, если параметр может иметь более чем одну величину.
2011 © EPAM Systems, RD Dep.
Слайд 50
Сервлет. Request. Response
Enumeration getParameterNames() - предоставляет имена параметров.
String getQueryString() - возвращает строковую (String) величину необработанных данных
клиента для HTTP запросов GET.
BufferedReader getReader() - возвращает объект BufferedReader (текстовая информация) для считатывания необработанных данных (для HTTP запросов POST, PUT, и DELETE).
ServletInputStream getInputStream() - возвращает объект ServletInputStream (двоичная информация) для считывания необработанных данных (для HTTP запросов для POST, PUT, и DELETE).
2011 © EPAM Systems, RD Dep.
Слайд 51
Сервлет. Request. Response
Объект HttpServletResponse
Объект HttpServletResponse обеспечивает два способа
возвращения данных пользователю:
Метод getWriter возвращает Writer
Метод getOutputStream возвращает ServletOutputStream
Используйте
метод getWriter для возвращения пользователю текстовых данных и метод getOutputStream для бинарных.
Закрытие Writer или ServletOutputStream после отправления запроса позволит серверу определить, что ответ готов.
2011 © EPAM Systems, RD Dep.
Слайд 52
Сервлет. Request. Response
Интерфейс HttpServletResponse
void sendError(int sc, String
msg) – сообщение о возникших ошибках, где sc –
код ошибки, msg – текстовое сообщение;
void setDateHeader(String name, long date) – добавление даты в заголовок ответа;
void setHeader(String name, String value) – добавление параметров в заголовок ответа. Если параметр с таким именем уже существует, то он будет заменен.
2011 © EPAM Systems, RD Dep.
Слайд 53
Сервлет. Request. Response
Данные HTTP заголовка
Прежде чем получить доступ
к объектам Writer или OutputStream необходимо установить данные HTTP
заголовка.
Класс HttpServletResponse предоставляет методы для доступа к данным заголовка:
setContentType(String type) - устанавливает тип содержимого (Content-type).
2011 © EPAM Systems, RD Dep.
response.setContentType("text/html");
Слайд 54
Сервлет. Request. Response. Example 01
2011 © EPAM Systems,
RD Dep.
package _java._ee._01.firstservlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public
class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FirstServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String title = "Simple Servlet Output";
// сначала установите тип содержания и другие поля заголовков ответа
Слайд 55
Сервлет. Request. Response. Example 01
2011 © EPAM Systems,
RD Dep.
response.setContentType("text/html");
out.println("");
out.println(title);
out.println("");
out.println("" + title + "");
out.print("This is ");
out.print(this.getClass().getName());
out.print(", using
the GET method");
out.println("");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Слайд 56
Сервлет. Request. Response
Сервлет расширяет класс HttpServlet и переопределяет
метод doGet.
Чтобы ответить клиенту, метод doGet в примере использует
Writer из объекта HttpServletResponse для возвращения клиенту текстовых данных. Прежде чем получить доступ к writer, пример устанавливает заголовок content-type. В конце метода doGet, после того как был отправлен запрос, Writer закрывается.
Для работы с конкретным HTTP-методом передачи данных достаточно расширить свой класс от класса HttpServlet и реализовать один из этих методов. Метод service() переопределять не надо, в классе HttpServlet он только определяет, каким HTTP-методом передан запрос клиента, и обращается к соответствующему методу doXxx().
2011 © EPAM Systems, RD Dep.
Слайд 57
Сервлет. Request. Response
Для того, чтобы сервлет работал на
сервере, необходимо подготовить файл описания сервлета (XML-файл).
Элементы web.xml
-
блок, описывающий сервлеты
- название сервлета
- текстовое описание сервлета
- имя сервлета
- класс сервлета
- блок, описывающий параметры инициализации сервлета
- название параметра
- значение параметра
2011 © EPAM Systems, RD Dep.
Слайд 58
Сервлет. Request. Response
- блок, описывающий соответсвие url
и запускаемого сервлета
- имя сервлета
- описывает url-шаблон
- блок, описывающий параметры сессии
- максимальное время жизни сессии
- блок, описывающий параметры, как пользователь будет логиниться к серверу
- метод авторизации (BASIC, FORM, DIGEST, CLIENT-CERT)
2011 © EPAM Systems, RD Dep.
Слайд 59
Сервлет. Request. Response
- блок, описывающий имена файлов,
которые будут пытаться открыться при запросе только по имени
директории (без названия файла). Сервер будет искать первый существующий файл из списка и загрузит именно его
- имя файла
- блок, описывающий соответствие ошибки и загружаемой при этом страницы
- код произошедшей ошибки
- тип произошедшей ошибки
- загружаемый файл
- блок, описывающий соответствие JSP Tag library descriptor с URI-шаблоном
- название uri-шаблона
- расположение шаблона
2011 © EPAM Systems, RD Dep.
Слайд 60
Сервлет. Request. Response. Example 01
web.xml
2011 © EPAM Systems,
RD Dep.
id="WebApp_ID"
version="2.5">
Java_EE_01_1
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
FirstServlet
FirstServlet
_java._ee._01.firstservlet.FirstServlet
FirstServlet
/FirstServlet
Слайд 61
Сервлет. Request. Response
Запуск контейнера сервлетов и размещение проекта
Действия
по запуску сервлета с помощью контейнера сервлетов Tomcat, который
установлен в каталоге /Apache Software Foundation/Tomcat…
В этом же каталоге размещаются следующие подкаталоги:
/bin – содержит файлы запуска контейнера сервлетов tomcatX.exe, tomcatXw.exe и некоторые необходимые для этого библиотеки;
/common – содержит библиотеки служебных классов, в частности Servlet API;
/conf – содержит конфигурационные файлы, в частности конфигурационный файл контейнера сервлетов server.xml;
/logs – помещаются log-файлы;
/lib – размещены необходимые библиотеки;
/webapps – в этот каталог помещаются приложение (в отдельный каталог)
2011 © EPAM Systems, RD Dep.
Слайд 62
Сервлет. Request. Response
Web-приложение поставляется в виде архива .war,
содержащего все его файлы.
На самом деле это zip-архив,
расширение .war нужно для того, чтобы Web-контейнер узнавал архивы развертываемых на нем Web-приложений.
Содержащаяся в этом архиве структура директорий Web-приложения должна включать директорию WEB-INF, вложенную непосредственно в корневую директорию приложения.
2011 © EPAM Systems, RD Dep.
Слайд 63
Сервлет. Request. Response
Директория WEB-INF содержит две поддиректории —
/classes для .class-файлов сервлетов, классов и интерфейсов EJB-компонентов и
других Java-классов, и
/lib для .jar и .zip файлов, содержащих используемые библиотеки.
Файл web.xml также должен находится непосредственно в директории WEB_INF.
War-файл необходимо разместить в папке /webapps контейнера Tomcat
2011 © EPAM Systems, RD Dep.
Слайд 64
Сервлет. Request. Response. Example 01
2011 © EPAM
Systems, RD Dep.
Слайд 65
Сервлет. Request. Response
Если вызывать сервлет из index.jsp, то
тег FORM должен выглядеть следующим образом:
Файл index.jsp помещается в
папку /webapps/FirstWebProject и в браузере набирается строка:
http://localhost:8080/Java_EE_01_1/index.jsp
2011 © EPAM Systems, RD Dep.
Слайд 66
MVC
2011 © EPAM Systems, RD Dep.
Слайд 67
MVC
2011 © EPAM Systems, RD Dep.
Model
Модель отображаемых данных
Controller
Контроллер
запроса пользователя
View
Шаблон представления данных
1. Получает или сохраняет модель в
БД
2. Определяет нужное view и
передает ему управление
3. Накладывает модель на шаблон представления
Слайд 68
MVC
2011 © EPAM Systems, RD Dep.
Слайд 69
MVC
2011 © EPAM Systems, RD Dep.
Слайд 70
JSP (START)
2011 © EPAM Systems, RD Dep.
Слайд 71
JSP (start)
Java Server Pages (JSP) обеспечивает разделение динамической
и статической частей страницы, результатом чего является возможность изменения
дизайна страницы, не затрагивая динамическое содержание.
Это свойство используется при разработке и поддержке страниц, так как дизайнерам нет необходимости знать, как работать с динамическими данными.
2011 © EPAM Systems, RD Dep.
Слайд 72
JSP (start)
simple.jsp
2011 © EPAM Systems, RD Dep.
language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
"http://www.w3.org/TR/html4/loose.dtd">
Simple
Hello, Bender
Слайд 73
JSP (start)
2011 © EPAM Systems, RD Dep.
Слайд 74
JSP (start)
Код сервлета, полученный после компиляции simple.jsp
2011 ©
EPAM Systems, RD Dep.
public final class simple_jsp {
public void
_jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this,request,response,null,true,8192,true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\nSimple\r\n\r\n");
out.write("\r\nHello, Bender\r\n ");
} catch (Throwable t) {
}
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
}
Слайд 75
ЖИЗНЕННЫЙ ЦИКЛ СЕРВЛЕТА И JSP
2011 © EPAM Systems,
RD Dep.
Слайд 76
Жизненный цикл сервлета и JSP
В обязанности веб контейнера
входит управление жизненным циклом сервлета. Веб контейнер создает объект
сервлета и тогда вызывает метод init(). По окончании выполнения этого метода, сервлет находится в состоянии готовности принимать и обрабатывать клиентские запросы. Контейнер вызывает метод service() в сервлете для управления каждым запросом. Перед уничтожением объекта, контейнер вызовет метод destroy(). После этого сервлет становится потенциальным кандидатом для сборщика мусора.
2011 © EPAM Systems, RD Dep.
Слайд 77
Жизненный цикл сервлета и JSP
Процессы, выполняемые с файлом
JSP при первом вызове:
Браузер делает запрос к странице JSP.
JSP-engine
анализирует содержание файла JSP.
JSP-engine создает временный сервлет с кодом, основанным на исходном тексте файла JSP, при этом контейнер транслирует операторы Java в метод _jspService().
Полученный код компилируется в файл *.class.
Вызываются методы init() и _jspService(), и сервлет логически исполняется.
Сервлет на основе JSP установлен. Комбинация статического HTML и графики вместе с динамическими элементами, определенными в оригинале JSP, пересылаются браузеру через выходной поток объекта ответа ServletResponse.
2011 © EPAM Systems, RD Dep.
Слайд 78
Жизненный цикл сервлета и JSP
2011 © EPAM Systems,
RD Dep.
1. Жизненный цикл класса страницы
2. Жизненный цикл объекта
страницы
Слайд 79
ВЗАИМОДЕЙСТВИЕ СЕРВЛЕТА И JSP
2011 © EPAM Systems, RD
Dep.
Слайд 80
Взаимодействие сервлета и JSP
Страницы JSP и сервлеты никогда
не используются в информационных системах друг без друга.
Причиной
являются принципиально различные роли, которые играют данные компоненты в приложении.
Страница JSP ответственна за формирование пользовательского интерфейса и отображение информации, переданной с сервера.
Сервлет выполняет роль контроллера запросов и ответов, то есть принимает запросы от всех связанных с ним JSP-страниц, вызывает соответствующую бизнес-логику для их (запросов) обработки и в зависимости от результата выполнения решает, какую JSP поставить этому результату в соответствие.
2011 © EPAM Systems, RD Dep.
Слайд 81
Взаимодействие сервлета и JSP
2011 © EPAM Systems, RD
Dep.
Слайд 82
Взаимодействие сервлета и JSP. Example 02
Параметры клиента передаются
в сервлет как параметры запроса.
index.jsp
2011 © EPAM Systems, RD
Dep.
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
MyJSP
Слайд 83
Взаимодействие сервлета и JSP. Example 02
2011 © EPAM
Systems, RD Dep.
package _java._ee._01.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public
class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
if (request.getParameter("command").equals("forward"))
{
request.getRequestDispatcher("jsp/main.jsp").forward(request, response);
}
}
}
…
MyServlet
MyServlet
_java._ee._01.servlet.MyServlet
MyServlet
/MyServlet
…
Слайд 84
Взаимодействие сервлета и JSP. Example 02
jsp/main.jsp
2011 © EPAM
Systems, RD Dep.
"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Insert title here
request.getParameter("anything")
Слайд 85
Взаимодействие сервлета и JSP. Example 02
2011 © EPAM
Systems, RD Dep.
Слайд 86
Взаимодействие сервлета и JSP
Передачу информации между JSP и
сервлетом можно осуществлять, в частности, с помощью добавления атрибутов
к объектам HttpServletRequest, HttpSession, HttpServletContext. Вызов main.jsp из сервлета в данном случае производится методом forward() интерфейса RequestDispatcher.
RequestDispatcher getRequestDispatcher() класса ServletContext - возвращает объект RequestDispatcher. Этот метод в качестве аргумента берет URL запрашиваемого ресурса.
2011 © EPAM Systems, RD Dep.
Слайд 87
Взаимодействие сервлета и JSP
URL ресурса должен быть доступным
на сервере, на котором запущен сервлет в момент обращения.
Если ресурс недоступен, или у сервера не реализован объект RequestDispatcher для ресурса данного типа, этот метод вернет значение null. Сервлет должен быть готов к таким ситуациям.
2011 © EPAM Systems, RD Dep.
Слайд 88
Взаимодействие сервлета и JSP
Обладая объектом RequestDispatcher, Вы можете
дать возможность ассоциированному с ним ресурсу отвечать на запрос
клиента, т.е. делать перенаправление.
2011 © EPAM Systems, RD Dep.
public class BookStoreServlet extends HttpServlet {
public void service (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher;
dispatcher = request.getRequestDispatcher("jsp/main.jsp");
dispatcher.forward(request, response);
...
}
}
Перенаправление очень полезно, например, когда сервлет производит запрос, и ответ носит общий характер, так что он может быть передан другому ресурсу. Сервлет может, например, заведовать информацией кредитных карт, когда пользователь размещает заказ, и потом отправлять запрос клиента к заказу, который возвращает страницу "Спасибо за заказ".
Слайд 89
Взаимодействие сервлета и JSP
void forward (ServletRequest request, ServletResponse response) должен
быть использован тогда, когда необходимо отдать другому ресурсу возможность
отвечать пользователю.
Если Вы уже начали отвечать пользователю, используя объекты PrintWriter или ServletOutputStream, Вам необходимо использовать метод void include (ServletRequest request, ServletResponse response).
2011 © EPAM Systems, RD Dep.
Слайд 90
Взаимодействие сервлета и JSP. Example 03
Метод void include(ServletRequest request,
ServletResponse response) интерфейса RequestDispatcher позволяет вызываемому сервлету отвечать клиенту и
использовать в качестве части ответа ресурс, ассоциированный с объектом RequestDispatcher.
2011 © EPAM Systems, RD Dep.
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
if (request.getParameter("command").equals("forward"))
{
response.getWriter().println("xa-xa-xa");
RequestDispatcher dispatcher;
dispatcher = request.getRequestDispatcher("jsp/main.jsp");
if (dispatcher != null) {
dispatcher.include(request, response);
} } }}
Слайд 91
Взаимодействие сервлета и JSP. Example 03
2011 © EPAM
Systems, RD Dep.
Слайд 92
Взаимодействие сервлета и JSP
Вызов сервлетов из сервлетов
Чтобы Ваш
сервлет вызвал другой сервлет, Вы можете:
либо дать сервлету сделать
HTTP запрос к другому сервлету.
либо сервлет может вызвать общедоступные методы другого сервлета напрямую, если оба сервлета запущены на одном и том же сервере.
Далее обсуждается второй из вышеуказанных пунктов. Чтобы вызвать общедоступный метод другого сервлета напрямую, Вам надо:
2011 © EPAM Systems, RD Dep.
Слайд 93
Взаимодействие сервлета и JSP
Надо:
Знать имя сервлета, метод которого
Вы хотите вызвать.
Получить доступ к объекту сервлета Servlet.
Вызвать
общедоступный метод.
Servlet getServlet(String name) класса ServletContext - возвращает доступ к объекту Servlet.
Как только Вы получили объект сервлета, Вы можете вызывать любой общедоступный метод этого сервлета.
2011 © EPAM Systems, RD Dep.
Слайд 94
Взаимодействие сервлета и JSP
Потоковый вывод
Сервлеты HTTP, как правило,
поддерживают обработку нескольких клиентов одновременно. Если методы в вашем
сервлете, работающие на клиента, используют общие ресурсы, то Вы должны, согласовать управление, создав сервлет, который обслуживает только одного клиента в определенный момент времени.
Чтобы сервлет обслуживал только одного клиента в определенный момент времени, Вам надо реализовать интерфейс SingleThreadModel в добавление к наследованию класса HttpServlet .
2011 © EPAM Systems, RD Dep.
Слайд 95
СЕССИИ
2011 © EPAM Systems, RD Dep.
Слайд 96
Сессии
Отслеживание сессии
Для поддержки статуса между сериями запросов от
одного и того же пользователя используется механизм отслеживания сессии.
Сессии
используются разными сервлетами для доступа к одному клиенту. Это удобно для приложений построенных на нескольких сервлетах.
Чтобы использовать отслеживание сессии:
Создайте для пользователя сессию (объект HttpSession).
Сохраняйте или читайте данные из объекта HttpSession.
Уничтожьте сессию (необязательно).
2011 © EPAM Systems, RD Dep.
Слайд 97
Сессии
Получение сессии
HttpSession getSession(bool) объекта HttpServletRequest возвращает сессию пользователя.
Когда метод вызывается со значением true, реализация при необходимости
создает сессию. Значение false возвратит null, если обнаружена сессия.
Чтобы правильно организовать сессию, Вам надо вызвать метод getSession прежде чем будет запущен выходной поток ответа.
2011 © EPAM Systems, RD Dep.
public class SessionServlet extends HttpServlet {
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(true);
out = response.getWriter();
...
}}
Слайд 98
Сессии
Сохранение и получение данных сессии
Интерфейс HttpSession предоставляет методы,
которые сохраняют и возвращают данные:
Стандартные свойства сессии, такие как
идентификатор сессии.
Данные приложения, которые сохраняются в виде пары с именным ключом, когда имя это строка (String) и величина - объект Java.
2011 © EPAM Systems, RD Dep.
Слайд 99
Сессии
Чтобы сохранить значения переменной в текущем сеансе, используется
метод setAttribute() класса HttpSession, прочесть – getAttribute(), удалить –
removeAttribute(). Список имен всех переменных, сохраненных в текущем сеансе, можно получить, используя метод Enumeration getAttributeNames(), работающий так же, как и соответствующий метод интерфейса HttpServletRequest.
Метод String getId() возвращает уникальный идентификатор, который получает каждый сеанс при создании. Метод isNew() возвращает false для уже существующего сеанса и true – для только что созданного.
2011 © EPAM Systems, RD Dep.
Слайд 100
Сессии
Завершение сессии
Сессия пользователя может быть завершена вручную или,
в зависимости от того, где запущен сервлет, автоматически. (Например,
Java Web Server автоматически завершает сессию, когда в течение определенного времени не происходит запросов, по умолчанию 30 минут.) Завершить сессию означает удаление объекта HttpSession и его величин из системы.
Чтобы вручную завершить сессию, используйте метод сессии invalidate.
Этот метод выдает InvalidStateException если вызывается для сессии, которая была завершена. Перед тем как завершить сессию, контейнер освободит все объекты, связанные с ней. Метод valueUnbound() будет вызван для всех сессионных атрибутов, которые реализуют интерфейс HttpSessionBindingListener.
2011 © EPAM Systems, RD Dep.
Слайд 101
Сессии
Превышение времени ожидания сессии
Дескриптор размещения можно использовать для
установки промежутка времени для сессии. Если клиент не активизировался
в течение этого промежутка времени, сессия автоматически завершается.
Элемент
определяет интервал времени ожидания сессии по умолчанию (в минутах) для всех сессий, созданных в веб-приложении. Отрицательное или нулевое значение приводит к тому, что сессия никогда не завершается.
2011 © EPAM Systems, RD Dep.
Слайд 102
Сессии
Следующая настройка в дескрипторе размещения приводит к установке
времени ожидания сессии на 10 минут:
10
Вы также можете
программно установить интервал времени ожидания сессии. Следующий метод, предоставляемый интерфейсом HttpSession, может использоваться для установки времени ожидания для текущей сессии (в секундах):
public void setMaxInactiveInterval(int seconds)
Если этому методу придано отрицательное значение, время ожидания сессии никогда не истечет.
2011 © EPAM Systems, RD Dep.
Слайд 103
Сессии
Перезапись URL
Сессии становятся доступными при помощи обмена уникальными
метками, которые называются идентификаторами сессии (session id), между клиентом,
осуществляющим запрос, и сервером. Если в браузере клиента разрешены cookies, идентификатор сессии будет внесен в файл cookie, отправляемый с HTTP-запросом/ответом.
Для браузеров, не поддерживающих cookies, для того, чтобы сделать возможной обработку сессий, используется способ перезаписи URL. Если используется перезапись URL, идентификатор сессии должен быть прибавлен к URL, включая гиперссылки, которым необходим доступ к сессии, а также ответы сервера.
2011 © EPAM Systems, RD Dep.
Слайд 104
Сессии
Методы HttpServletResponse, которые поддерживают перезапись URL:
public String encodeURL(String
url)
public String encodeRedirectURL(String url)
Метод encodeURL() кодирует заданный URL, добавляя
в него идентификатор сессии, или, если кодирование не требуется, возвращает исходный URL.
Метод encodeRedirectURL() кодирует заданный URL для использования в методе sendRedirect() HttpServletResponse. Этот метод тоже возвращает неизмененный URL, если кодирование не требуется.
Перезапись URL должна использоваться так, чтобы обеспечивалась поддержка клиентов, которые не поддерживают или не принимают cookies, чтобы не допустить потери сессионной информации.
2011 © EPAM Systems, RD Dep.
Слайд 105
Сессии. Example 04
2011 © EPAM Systems, RD Dep.
package
_java._ee._01.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public
class SessionDemo extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { performTask(request, response); }
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { performTask(request, response); }
private void performTask(HttpServletRequest req, HttpServletResponse resp)
throws ServletException {
SessionLogic.printToBrowser(resp, req);
}
}
Слайд 106
Сессии. Example 04
2011 © EPAM Systems, RD Dep.
class
SessionLogic {
public static void printToBrowser(HttpServletResponse resp,
HttpServletRequest req) {
try {
HttpSession
session = req.getSession(true);
PrintWriter out = resp.getWriter();
StringBuffer url = req.getRequestURL();
session.setAttribute("URL", url);
out.write("My session counter: ");
out.write(String.valueOf(prepareSessionCounter(session)));
out.write("
Creation Time : "
+ new Date(session.getCreationTime()));
out.write("
Time of last access : "
+ new Date(session.getLastAccessedTime()));
out.write("
session ID : " + session.getId());
out.write("
Your URL: " + url);
int timeLive = 60 * 30;
session.setMaxInactiveInterval(timeLive);
out.write("
Set max inactive interval : " + timeLive + "sec");
out.flush();out.close(); }
Слайд 107
Сессии. Example 04
2011 © EPAM Systems, RD Dep.
catch
(IOException e) {
e.printStackTrace();
throw new RuntimeException("Failed : " + e);
}
}
private
static int prepareSessionCounter(HttpSession session) {
Integer counter = (Integer) session.getAttribute("counter");
if (counter == null) {
session.setAttribute("counter", 1);
return 1;
} else {
counter++;
session.setAttribute("counter", counter);
return counter;
}
}
}
Слайд 108
Сессии. Example 04
2011 © EPAM Systems, RD Dep.
Слайд 109
COOKIES
2011 © EPAM Systems, RD Dep.
Слайд 110
Cookies
Использование Cookie
Закладки (сookies) используются для хранения части информации
на машине клиента.
Закладки передаются клиенту в коде ответа
в HTTP.
Клиенты автоматически возвращают закладки, добавляя код в запросы в HTTP заголовках.
Каждый заголовок HTTP запроса и ответа именован и имеет единственное значение.
Множественные закладки могут иметь одно и тоже имя.
2011 © EPAM Systems, RD Dep.
Слайд 111
Cookies
Сервер может обеспечить одну или более закладок для
клиента. Предполагается, что программа клиента, как web браузер, должна
поддерживать 20 закладок на хост, как минимум четыре килобайта каждая.
Закладки, которые клиент сохранил для сервера, возвращаются клиентом только этому серверу. Сервер может включать множество сервлетов. Потому как закладки возвращаются серверу, сервлеты работающие на этом сервере совместно используют эти закладки.
2011 © EPAM Systems, RD Dep.
Слайд 112
Cookies
Использование Cookie
Чтобы отправить закладку:
Создайте объект Cookie
Установите любые атрибуты
Отправьте закладку
Чтобы извлечь информацию из закладки:
Запросите все закладки
из пользовательского запроса
Найдите закладку или закладки с именем, которое Вас интересует, используя стандартные программные операции
Получите значения закладок, которые были найдены
2011 © EPAM Systems, RD Dep.
Слайд 113
Cookies
Создание Cookie
Конструктор класса javax.servlet.http.Cookie создает закладу с начальным
именем и значением. Вы можете изменить значение закладки позже,
вызвав метод setValue.
Если сервлет возвращает ответ пользователю, используя Writer, создавайте закладку, прежде чем обратитесь к Writer.
2011 © EPAM Systems, RD Dep.
public void doGet (HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
String bookId = request.getParameter("Buy");
if (bookId != null) {
Cookie getBook = new Cookie("Buy", bookId);
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("" + "
Book Catalog <br> " + ...);
...
}
Слайд 114
Cookies
Установка атрибутов закладки
2011 © EPAM Systems, RD Dep.
public
void doGet (HttpServletRequest request, HttpServletResponse
response)
throws ServletException,
IOException {
String bookId = request.getParameter("Remove");
if (bookId != null) {
thisCookie.setMaxAge(0);
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(" " + "Your Shopping <br> Cart" + ...);
...
}
Слайд 115
Cookies
Отправка закладки
Закладки отправляются как заголовки ответа клиенту; они
добавляются с помощью метода addCookie класса HttpServletResponse.
Закладки отправляются
как заголовки ответа клиенту; они добавляются с помощью метода addCookie класса HttpServletResponse. если Вы используете Writer для отправки закладки пользователю, Вы должны использовать метод addCookie, прежде чем вызвать метод getWriter класса HttpServletResponse.
2011 © EPAM Systems, RD Dep.
Слайд 116
Cookies
2011 © EPAM Systems, RD Dep.
public void doGet
(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
if (values != null) {
bookId = values[0];
Cookie getBook = new Cookie("Buy", bookId);
getBook.setComment("User has indicated a desire " +
"to buy this book from the bookstore.");
response.addCookie(getBook);
}
...
}
Слайд 117
Cookies
Запрашивание закладок
Клиенты возвращают закладки как поля, добавленные в
HTTP заголовок запроса.
Cookie[] getCookies() из класса HttpServletRequest –
возвращает все закладки ассоциированные к данному хосту.
2011 © EPAM Systems, RD Dep.
public void doGet (HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
String bookId = request.getParameter("Remove");
if (bookId != null) {
Cookie[] cookies = request.getCookies();
thisCookie.setMaxAge(0);
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(" " + "
Your Shopping Cart" + ...);
...
}
Слайд 118
Cookies
Получение значения закладки
String getValue() - возвращает значение закладки.
2011 © EPAM Systems, RD Dep.
public void doGet (HttpServletRequest
request, HttpServletResponse
response)
throws ServletException, IOException {
String bookId = request.getParameter("Remove");
if (bookId != null) {
Cookie[] cookies = request.getCookies();
for(i=0; i thisCookie.getValue().equals(bookId); i++) {
thisCookie.setMaxAge(0);
}
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(" " + "Your Shopping Cart" + ...);
...
}
Слайд 119
Cookies. Example 05
2011 © EPAM Systems, RD Dep.
package
_java._ee._01.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class
CookieDemo extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
perfomTask(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
perfomTask(request, response);
}
protected void perfomTask(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
CookieLogic.seCookie(request, response);
CookieLogic.doLogic(request, response);
}}
Слайд 120
Cookies. Example 05
2011 © EPAM Systems, RD Dep.
class
CookieLogic {
private static int index = 0;
public static void
doLogic(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
out.print("Number cookies :" + cookies.length + "
");
for (int i = 0; i < cookies.length; i++) {
Cookie c = cookies[i];
out.print("Secure :" + c.getSecure() + "
");
out.print(c.getName() + " = " + c.getValue() + "
");
}
}
out.write("My Cookie counter: ");
out.write(String.valueOf(prepareCookieCounter(request, response)));
out.print("");
out.close();
}
Слайд 121
Cookies. Example 05
2011 © EPAM Systems, RD Dep.
public
static void seCookie(HttpServletRequest request,
HttpServletResponse response) {
String key = "key"
+ index;
String value = "value" + index;
Cookie c = new Cookie(key, value);
c.setMaxAge(3600);
response.addCookie(c);
index++;
}
Слайд 122
Cookies. Example 05
2011 © EPAM Systems, RD Dep.
private
static int prepareCookieCounter(HttpServletRequest request,
HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
Cookie
counterCookie;
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if ("counter".equals(cookies[i].getName())) {
String counterStr = cookies[i].getValue();
int counterValue;
try {
counterValue = Integer.parseInt(counterStr);
} catch (NumberFormatException e) {
counterValue = 0;
}
counterValue++;
counterCookie = new Cookie("counter", String.valueOf(counterValue));
counterCookie.setMaxAge(3600);
response.addCookie(counterCookie);
return counterValue;
}}
}
counterCookie = new Cookie("counter", "1");
counterCookie.setMaxAge(3600);
response.addCookie(counterCookie);
return 1;
}}
Слайд 123
Cookies. Example 05
2011 © EPAM Systems, RD Dep.
Слайд 124
СОВМЕСТНОЕ ИСПОЛЬЗОВАНИЕ РЕСУРСОВ
2011 © EPAM Systems, RD Dep.
Слайд 125
Совместное использование ресурсов
Сервлеты выполняемые на одном сервере иногда
совместно используют ресурсы.
Это справедливо для сервлетов, которые являются
компонентами одного приложения.
Сервлеты исполняемые на одном сервере могут совместно использовать ресурсы с помощью методов интерфейса ServletContext для манипулирования атрибутами: setAttribute, getAttribute, и removeAttribute.
Все сервлеты в контексте совместно используют атрибуты, находящиеся в интерфейсе ServletContext.
Чтобы избежать столкновений имен атрибутов, имена их используют те же правила что и имена пакетов.
2011 © EPAM Systems, RD Dep.
Слайд 126
Совместное использование ресурсов
Пример названия атрибута
examples.bookstore.database.BookDBFrontEnd.
Имена, начинающиеся
с префиксов java.*, javax.*, и sun.* зарезервированы.
2011 © EPAM
Systems, RD Dep.
Слайд 127
Совместное использование ресурсов
Интерфейс ServletContext
Интерфейс ServletContext используется для взаимодействия
с контейнером сервлетов.
Сервлеты исполняемые на одном сервере могут
совместно использовать ресурсы с помощью методов интерфейса ServletContext для манипулирования атрибутами:
void setAttribute(String name, Object object) – добавляет атрибут и его значение в контекст; обычно это производится во время инициализации.
2011 © EPAM Systems, RD Dep.
Слайд 128
Совместное использование ресурсов
Когда у Вас несколько сервлетов используют
атрибут, каждый должен проинициализировать этот атрибут. А раз так,
каждый сервлет должен проверить значение атрибута, и устанавливать его только в том случае если предыдущий сервлет не сделал этого.
2011 © EPAM Systems, RD Dep.
Слайд 129
Совместное использование ресурсов
ServletContext
Object getAttribute(String name) – возвращает совместный
ресурс.
Enumeration getAttributeNames() – получает список имен атрибутов;
void removeAttribute(String name)
– удаляет совместный ресурс.
ServletContext getContext(String uripath) – позволяет получить доступ к контексту других ресурсов данного контейнера сервлетов;
String getServletContextName() – возвращает имя сервлета, которому принадлежит данный объект интерфейса ServletContext.
String getCharacterEncoding() – определение символьной кодировки запроса.
2011 © EPAM Systems, RD Dep.
Слайд 130
Совместное использование ресурсов
Интерфейс ServletConfig
Представляет собой конфигурацию сервлета, используется
в основном на этапе инициализации. Все параметры для инициализации
устанавливаются в web.xml
Некоторые методы:
String getServletName() – определение имени сервлета;
Enumeration getInitParameterNames() – определение имен параметров инициализации сервлета из дескрипторного файда web.xml;
String getInitParameter(String name) – определение значения конкретного параметра по его имени.
2011 © EPAM Systems, RD Dep.
Слайд 131
Совместное использование ресурсов. Example 06
2011 © EPAM Systems,
RD Dep.
package _java._ee._01.servlet;
+import java.io.IOException;..
public class Servlet1 extends HttpServlet {
private ServletConfig config;
public void init (ServletConfig config) throws ServletException
{
this.config = config;
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
String param = (String) config.getServletContext().getAttribute("myparam");
if (param == null){
config.getServletContext().setAttribute("myparam", "servlet1");
response.getWriter().println("myparam = servlet1 set first
");
}
response.getWriter().println("From Servlet1 - " + config.getServletContext().getAttribute("myparam"));
}
}
Слайд 132
Совместное использование ресурсов. Example 06
2011 © EPAM Systems,
RD Dep.
package _java._ee._01.servlet;
+import java.io.IOException;..
public class Servlet2 extends HttpServlet {
private ServletConfig config;
public void init (ServletConfig config) throws ServletException
{
this.config = config;
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
String param = (String) config.getServletContext().getAttribute("myparam");
if (param == null){
config.getServletContext().setAttribute("myparam", "servlet2");
response.getWriter().println("myparam = servlet2 set first
");
}
response.getWriter().println("From Servlet2 - " + config.getServletContext().getAttribute("myparam"));
}
}
Слайд 133
Совместное использование ресурсов. Example 06
2011 © EPAM Systems,
RD Dep.
Слайд 134
СОБЫТИЯ
2011 © EPAM Systems, RD Dep.
Слайд 135
События
Существует несколько интерфейсов, которые позволяют следить за событиями,
связанными с сеансом, контекстом и запросом сервлета, генерируемыми во
время жизненного цикла Web-приложения:
javax.servlet.ServletContextListener – обрабатывает события создания/удаления контекста сервлета;
javax.servlet.http.HttpSessionListener – обрабатывает события создания/удаления HTTP-сессии;
javax.servlet.ServletContextAttributeListener – обрабатывает события создания/удаления/модификации атрибутов контекста сервлета;
javax.servlet.http.HttpSessionAttributeListener – обрабатывает события создания/удаления/модификации атрибутов HTTP-сессии;
javax.servlet.http.HttpSessionBindingListener – обрабатывает события привязывания/разъединения объекта с атрибутом HTTP-сессии;
javax.servlet.http.HttpSessionActivationListener – обрабатывает события связанные с активацией/дезактивацией HTTP-сессии;
javax.servlet.ServletRequestListener – обрабатывает события создания/удаления запроса;
javax.servlet.ServletRequestAttributeListener – обрабатывает события создания/удаления/модификации атрибутов запроса сервлета.
2011 © EPAM Systems, RD Dep.
Слайд 136
События
2011 © EPAM Systems, RD Dep.
Слайд 137
События
2011 © EPAM Systems, RD Dep.
Слайд 138
События. Example 07
2011 © EPAM Systems, RD Dep.
package
_java._ee._01.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public
class ListenerExample extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
response.setContentType("text/html");
HttpSession session = request.getSession(true);
PrintWriter out = response.getWriter();
StringBuffer url = request.getRequestURL();
session.setAttribute("URL", url);
out.write(String.valueOf(prepareSessionCounter(session)));
out.write("
Creation Time : “
+ new Date(session.getCreationTime()));
out.write("
Time of last access : “
+ new Date(session.getLastAccessedTime()));
Слайд 139
События. Example 07
2011 © EPAM Systems, RD Dep.
out.write("
session ID : " + session.getId());
out.write("
Your URL: "
+ url);
int timeLive = 60 * 30;
session.setMaxInactiveInterval(timeLive);
out.write("
Set max inactive interval : " + timeLive + "sec");
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Failed : " + e);
}
}
private static int prepareSessionCounter(HttpSession session) {
Integer counter = (Integer) session.getAttribute("counter");
if (counter == null) {
session.setAttribute("counter", 1);
return 1;
} else {
counter++;
session.setAttribute("counter", counter);
return counter;
}
}
}
Слайд 140
События. Example 07
2011 © EPAM Systems, RD Dep.
package
_java._ee._01._listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyAttributeListener implements HttpSessionAttributeListener {
private
String counterAttr = "counter";
public void attributeAdded(HttpSessionBindingEvent ev) {
String currentAttributeName = ev.getName();
String urlAttr = "URL";
if (currentAttributeName.equals(counterAttr)) {
Integer currentValueInt = (Integer) ev.getValue();
System.out.println("Counter added in Session=“
+ currentValueInt);
} else if (currentAttributeName.equals(urlAttr)) {
StringBuffer currentValueStr = (StringBuffer) ev.getValue();
System.out.println("URL added in Session =“
+ currentValueStr);
} else
System.out.println("new attribute added");
}
Слайд 141
События. Example 07
2011 © EPAM Systems, RD Dep.
public
void attributeRemoved(HttpSessionBindingEvent ev) {
}
public void attributeReplaced(HttpSessionBindingEvent ev)
{
String currentAttributeName = ev.getName();
if (currentAttributeName.equals(counterAttr)) {
Integer currentValueInt = (Integer) ev.getValue();
System.out.println("counter changed in Session = “
+ currentValueInt);
}
}
}
Слайд 142
События. Example 07
2011 © EPAM Systems, RD Dep.
package
_java._ee._01._listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class MyRequestListener implements ServletRequestListener
{
private static int reqCount;
public void requestInitialized(ServletRequestEvent e) {
ServletRequest req = e.getServletRequest();
String name = "";
name = ((HttpServletRequest) req).getRequestURI();
System.out.println("Request for " + name + "; Count=" + ++reqCount);
}
public void requestDestroyed(ServletRequestEvent e) {
System.out.println("Request deleted");
}
}
Слайд 143
События. Example 07
2011 © EPAM Systems, RD Dep.
version="1.0" encoding="UTF-8"?>
Java_EE_01_6
…
_java._ee._01._listener.MyAttributeListener
_java._ee._01._listener.MyRequestListener
ListenerExample
ListenerExample
_java._ee._01.servlet.ListenerExample
ListenerExample
/ListenerExample
Слайд 144
События. Example 07
2011 © EPAM Systems, RD Dep.
Слайд 145
ФИЛЬТРЫ
2011 © EPAM Systems, RD Dep.
Слайд 146
Фильтры
Реализация интерфейса Filter позволяет создать объект, который может
трансформировать заголовок и содержимое запроса клиента или ответа сервера.
Фильтры не создают запрос или ответ, а только модифицируют его. Фильтр выполняет предварительную обработку запроса, прежде чем тот попадает в сервлет, с последующей (если необходимо) обработкой ответа, исходящего из сервлета.
Фильтр может взаимодействовать с разными типами ресурсов, в частности и с сервлетами, и с JSP-страницами.
2011 © EPAM Systems, RD Dep.
Слайд 147
Фильтры
Основные действия, которые может выполнить фильтр:
перехват инициализации сервлета
и определение содержания запроса, прежде чем сервлет будет инициализирован;
блокировка
дальнейшего прохождения пары request-response;
изменение заголовка и данных запроса и ответа;
взаимодействие с внешними ресурсами;
построение цепочек фильтров;
фильтрация более одного сервлета.
2011 © EPAM Systems, RD Dep.
Слайд 148
Фильтры
При программировании фильтров следует обратить внимание на интерфейсы
Filter, FilterChain и FilterConfig из пакета javax.servlet. Сам фильтр
определяется реализацией интерфейса Filter. Основным методом этого интерфейса является метод
void doFilter(ServletRequest req, ServletResponse res, FilterChain chain),
которому передаются объекты запроса, ответа и цепочки фильтров. Он вызывается каждый раз, когда запрос/ответ проходит через список фильтров FilterChain. В данный метод помещается реализация задач, обозначенных выше.
2011 © EPAM Systems, RD Dep.
Слайд 149
Фильтры
Кроме того, необходимо реализовать метод void init(FilterConfig config),
который принимает параметры инициализации и настраивает конфигурационный объект фильтра
FilterConfig. Метод destroy() вызывается при завершении работы фильтра, в тело которого помещаются команды освобождения используемых ресурсов.
Жизненный цикл фильтра начинается с однократного вызова метода init(), затем контейнер вызывает метод doFilter() столько раз, сколько запросов будет сделано непосредственно к данному фильтру. При отключении фильтра вызывается метод destroy().
2011 © EPAM Systems, RD Dep.
Слайд 150
Фильтры
С помощью метода doFilter() каждый фильтр получает текущий
запрос и ответ, а также список фильтров FilterChain, предназначенных
для обработки. Если в FilterChain не осталось необработанных фильтров, то продолжается передача запроса/ответа. Затем фильтр вызывает chain.doFilter() для передачи управления следующему фильтру.
2011 © EPAM Systems, RD Dep.
Слайд 151
Фильтры. Example 08
2011 © EPAM Systems, RD Dep.
package
_java._ee._01.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FilterDemo
extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println( "Encoding response: " + response.getCharacterEncoding() );
out.println("
");
out.println("Encoding request: " + request.getCharacterEncoding());
out.println(request.getParameter("mytext"));
out.flush();
out.close();
}
}
Слайд 152
Фильтры. Example 08
2011 © EPAM Systems, RD Dep.
package
_java._ee._01._filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class
CharsetFilter implements Filter {
private String encoding;
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter("requestEncoding");
if (encoding == null)
encoding = "utf-8";
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain next) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
System.out.println("I am here");
next.doFilter(request, response);
}
public void destroy() {
}
}
Слайд 153
Фильтры. Example 08
2011 © EPAM Systems, RD Dep.
package
_java._ee._01._filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class
AnotherFilter implements Filter{
private String message;
public void init(FilterConfig config) throws ServletException
{
message = "Another Filter";
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
throws IOException, ServletException
{
response.getWriter().println(message);
System.out.println(message);
next.doFilter(request, response);
}
public void destroy(){}
}
Слайд 154
Фильтры. Example 08
2011 © EPAM Systems, RD Dep.
version="1.0" encoding="UTF-8"?>
Java_EE_01_7
…
FilterDemo
_java._ee._01.servlet.FilterDemo
FilterDemo
/FilterDemo
setCharFilter
_java._ee._01._filter.CharsetFilter
setCharFilter
/FilterDemo
setAnotherFilter
_java._ee._01._filter.AnotherFilter
setAnotherFilter
/FilterDemo
Слайд 155
Фильтры. Example 08
index.jsp
2011 © EPAM Systems, RD Dep.
page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Insert title here
Слайд 156
Фильтры. Example 08
2011 © EPAM Systems, RD Dep.