Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lec-ServletLifeCycle-part2-v001

.pdf
Скачиваний:
22
Добавлен:
18.03.2015
Размер:
1.4 Mб
Скачать

2.2

Жизненный цикл сервлета

ОБСУЖДАЕМЫЕ ВОПРОСЫ

1.Жизненный цикл сервлета

2.Интерфейсы и классы, необходимые для создания сервлета ( interface Servlet, class

GenericServlet, class HTTPServlet)

3.Краткое описание структуры запросов и ответов

(ServletResponse, ServletRequest)

4.Отправка кода статуса (setStatus, sendError)

5.Перенаправление запроса

6.Создание экземпляра сервлета и его инициализация

7.Инициализация приложения и контекст приложения

1. ЖИЗНЕННЫЙ ЦИКЛ СЕРВЛЕТА

Любой сервлет является классом, который обеспечивает специальный программный интерфейс Servlet, с помощью которого контейнер управляет жизненным циклом сервлета:

Контейнер сервлетов

Создание:

 

Разрушение:

Обработка

destroy()

init()

запросов:

 

 

 

 

service(…)

 

«Рождение»

 

 

«Смерть»

«Жизнь»

2. ИНТЕРФЕЙСЫ И КЛАССЫ, НЕОБХОДИМЫЕ

ДЛЯ СОЗДАНИЯ СЕРВЛЕТА

Любой сервлет является классом, который обеспечивает специальный программный интерфейс Servlet, с помощью которого контейнер управляет жизненным циклом сервлета:

void init( ServletConfig config ) throws ServletExceptionCalled Вызывается контейнером сразу же после

создания экземпляра сервлета. Если вызов метода выбрасывает

исключение или работает слишком долго (за пределами заданного в

контейнере таймаута), сервлет не cможет отвечать на запросы.

ServletConfig getServletConfig() – вернуть текущие инициализационные и стартовые параметры этого сервлета.

String getServletInfo() - информация об авторе, версии и

копирайте.

void service(ServletRequest,ServletResponse) throws

ServletException, java.io.IOException – основной метод генерации ответов на запросы.

void destroy() - Вызывается контейнером в момент завершения

сервлета.

КЛАССЫ РЕАЛИЗУЮЩИЕ

INTERFACE SERVLET

Класс GenericServlet реализует интерфейс Servlet, а порождѐнный абстрактный класс HttpServlet extends GenericServlet, в свою очередь,

предназначен для расширения, т.е. для сервлетов web-приложения:

java.lang.Object

+-- javax.servlet.GenericServlet

|

implements Servlet, ServletConfig, Serializable

|

Некоторые дополнительные методы:

|

public ServletContext getServletContext()

|

public void init() throws ServletException

|

public void log( String msg )

|

public void log( String message, Throwable t )

|

 

+-- javax.servlet.http.HttpServlet

implements Servlet, ServletConfig, Serializable

В зависимости от конфигурации, экземпляр сервлета может создаваться, либо при запуске контейнера сервлетов, либо при первом обращении. В любом случае, при создании экземпляра выполняется метод init(), так что в него обычно включается код, необходимый для начальной установки сервлета.

ОБРАБОТКА ЗАПРОСОВ СЕРВЛЕТОМ:

МЕТОД SERVICE()

После создания объекта сервлета, для ответов на пользовательские запросы, порождается отдельный поток, который вызывает метод service() данного экземпляра. В результате нескольких параллельных запросов метод service() может вызываться одновременно несколькими потоками. Необходима синхронизация для правильного разделения переменных и ресурсов между потоками.

Если сервлет реализует интерфейс SingleThreadModel, то только один поток запрос одномоментно получит доступ к экземпляру сервлета, что обычно организуется очередью запросов или пулом экземпляров. Модель SingleThreadModel считается устаревшей.

Из метода service() вызываются методы doXxx(), из которых наиболее часто используются методы doGet() и doPost(), в зависимости от типа полученного HTTP запроса.

Когда же сервер выгружает сервлет, выполняется его метод destroy().

3. КРАТКОЕ ОПИСАНИЕ СТРУКТУРЫ ЗАПРОСОВ И ОТВЕТОВ

Метод public void service( ServletRequest req, ServletResponse res );

класса GenericServlet содержит типизированные запрос ServletRequest и

ответ ServletResponse:

Interface javax.servlet.ServletRequest {

java.util.Enumeration getParameterNames() – Возвращает объект для доступа к списку параметров переданных в запросе.

String getParameter( String paramName ) – Возвращает параметр web-запроса по указанному имени

String[] getParameterValues( String paramName ) – Возвращает набор значений для мульти-параметров

}

3.2. HTTP-ЗАПРОСЫ

Рассмотрим HttpServletRequest потомок предыдущего интерфейса для случая html-запросов:

Interface javax.servlet.http.HttpServletRequest { java.util.Enumeration getHeaderNames() – Возвращает все

названия всех заголовков html-запроса

java.util.Enumeration getHeaders(java.lang.String name)

Возвращает все значения параметра web-запроса по указанному имени java.lang.String getHeader(java.lang.String name) – Возвращает

значение некоторого именованного элемента заголовка запроса

int getIntHeader(java.lang.String name) – то же в виде целого long getDateHeader(java.lang.String name) – в виде даты

HttpSession getSession( boolean create ) – Возвращает обект текущей сессии запроса

Cookie[] getCookies() – Возвращает массив Cookie[], который получен после синтаксической разборки содержимого заголовка

Cookies

java.lang.String getAuthType()– Возвращает название схемы аутентификации, используемой для защиты сервлета

3.3. HTTP-ЗАПРОСЫ (ПРОДОЛЖЕНИЕ)

Interface javax.servlet.http.HttpServletRequest {

String getMethod() – возвращает основной метод выполнения запроса (обычно GET, POST или HEAD и т.п.) , то есть способ передачи HTTP данных

String getRequestURL() – возвращает часть URL, которая находится после имени хоста и порта, до данных формы

String getProtocol() – возвращает строку вида “HTTP/1.0” или “HTTP/1.0”, что позволяет проверить, с какой версией протокола работает клиент.

}

Объект типа HttpServletRequest содержит информацию запроса, в первую очередь, заголовки и параметры запроса.

Примеры заголовков, возвращаемых методом getHeaders(): Accept-Encoding, Accept-Language, Accept-Charset User-Agent, Content-Length, Content-Type, Content-Transfer-Encoding, ContentEncoding, Content-Base, Content-Language, Content-Location

3.4. HTTP-ОТВЕТЫ

Объект, содержащий информацию ответа, также основан на интерфейсе ServletResponse:

Interface javax.servlet.ServletResponse {

String getContentType()– MIME тип контента ответа, например, «text/html; charset=UTF-8» или «application/octet-stream»

java.io.PrintWriter getWriter() throws java.io.IOException и

ServletOutputStream getOutputStream() throws java.io.IOException – возвращают потоки для формирования ответов (текстовых или бинарных).

void setCharacterEncoding(String charset)– задать MIME-тип данных ответа в выходных потоках, например, «UTF-8»

void setContentLength(int len)

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]