lec-ServletLifeCycle-part2-v001
.pdf2.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)
}