Главная » Java, Web » Интерфейс сервлетов

1

Для создания сервлетов используется интерфейс servlet. Существуют два стандартных класса, имплементирующих этот интерфейс. Это классы

GenericServiet и HttpServiet. В большинстве случаев для разработки сервлетов используется класс HttpServiet.

Методы обработки запросов

Базовый интерфейс servlet определяет метод service, в котором происходит обработка клиентских запросов. Этот метод вызывается для каждого запроса, поступившего к объекту сервлета. Как правило, сервлет разрабатывается таким образом, чтобы была возможность осуществлять одновременную обработку нескольких запросов. При этом сервлет должен поддерживать многопоточность. Контейнер сервлета обрабатывает одновременно поступающие запросы путем последовательного вызова методы service в соответствующие моменты времени.

Методы обработки HTTP-запросов

Абстрактный класс HttpServiet содержит дополнительные методы обработки запросов в дополнение к методам интерфейса servlet, которые автоматически вызываются при обращении к методу service класса HttpServiet и которые предназначены для обработки HTTP-запросов. Перечислим эти методы.

?     doGet

Метод обработки HTTP-запросов типа get.

?     doPost

Метод обработки HTTP-запросов типа post.

?     doPut

Метод обработки HTTP-запросов типа put.

?     doDelete

Метод обработки HTTP-запросов типа delete.

?     doHead

Метод обработки HTTP-запросов типа head.

?     doOptions

Метод обработки HTTP-запросов типа options.

?     doTrace

Метод обработки HTTP-запросов типа trace.

При разработке сервлетов разработчик, как правило, использует методы doGet и doPost. Прочие методы нужны в том случае, когда разработчик использует возможности, предоставляемые протоколом HTTP. Методы doPut и doDelete позволяют использовать возможности протокола НТТР/1.1. Метод doHead класса HttpServlet — это специальный случай метода doGet, который предназначен для возвращения заголовков, создаваемых методом doGet. Сервлеты поддерживают также метод doOptions. Метод doTrace генерирует ответ, который содержит все элементы заголовка, посланного в запросе trace.

Поддержка условного выполнения метода GET

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

Количество экземпляров сервлета

Если сервлет описан в дескрипторе размещения, то дескриптор содержит информацию о том, как контейнер сервлета осуществляет создание экземпляров сервлета. Если сервлет размещен не в распределенном окружении, контейнер должен использовать только один экземпляр сервлета. Однако если сервлет имплементирует интерфейс singieThreadModei, то контейнер сервлета может создать несколько объектов сервлета, что может быть следствием большой загрузки сервера, когда запросы будут распределяться между несколькими объектами сервлета. Если сервлет размещается в составе приложения, которое помечено в качестве распределенного приложения, то может существовать только один объект сервлета на одной виртуальной машине Java. Если же сервлет в составе распределенного приложения создан на основе интерфейса singieThreadModei, тогда контейнер может инициализировать несколько объектов этого сервлета.

Однопоточный сервлет

Если сервлет создан на основе интерфейса singieThreadModei, то такой сервлет может выполнять только один вызов метода service () для каждого момента времени. Это справедливо для каждого экземпляра сервлета в отдельности. Контейнер, тем не менее, может создать несколько объектов такого сервлета.

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

Жизненный цикл сервлета строго определен, задан способ загрузки сервлета, создание и инициализация экземпляра сервлета, методы обработки запросов, методы вывода сервлета из работы. Жизненный цикл сервлета определяется методами init, service, destroy интерфейса javax.servlet.Servlet. Эти методы должны быть имплементированы либо явно либо опосредованно через классы GenericServlet ИЛИ HttpServlet.

Загрузка сервлета

Загрузка сервлета производится контейнером сервлетов. Загрузка сервлетов происходит во время запуска контейнера или тогда, когда контейнер обнаружит необходимость обращения к сервлету, когда появится необходимость обработать запрос. Контейнер загружает класс сервлета, используя обычную процедуру загрузки Java-класс а, используемую в Java. Загрузка может быть осуществлена как из локальной файловой системы, так и с использованием сети. После загрузки класса контейнер создает экземпляр этого класса.

Инициализация сервлета

При создании экземпляра класса сервлета контейнер должен инициализировать этот объект, прежде чем объект получит клиентские запросы. Во время инициализации сервлет может читать данные, используемые для создания постоянных соединений, инициализировать соединения с ресурсами (например, с базами данных JDBC), производить другие одноразовые действия. Контейнер производит инициализацию объекта сервлета путем вызова функции init интерфейса servlet. При этом создается один объект интерфейса Servlet Con fig. Объект конфигурации позволяет сервлету осуществлять доступ к параметрам инициализации, представленным в виде пар имен и значений, задаваемым в описании конфигурации Web-приложения. Объект конфигурации также позволяет сервлету осуществлять доступ к объекту интерфейса servietcontext, который содержит информацию об окружении сервлета.

Ошибки инициализации

В процессе инициализации могут возникнуть ошибки UnavailableException и ServletException. При этом сервлет не сможет нормально работать, и должен быть удален из контейнера сервлетов. При этом метод destroy не может быть вызван. После ошибки инициализации контейнер может создать и инициализировать новый объект сервлета. Если возникает исключение UnavailableException с указанием минимального времени недоступности сервлета, то контейнер должен подождать в течение этого времени перед созданием и инициализацией нового экземпляра сервлета.

Обработка запросов

После того как сервлет будет благополучно создан и инициализирован, контейнер сервлета может использовать его для обработки клиентских запросов. Запросы представляются в виде объектов типа servietRequest. Сервлет создает ответ на запрос путем вызова методов объекта servietResponse. Эти два объекта передаются в виде параметров методу service, определенному в интерфейсе servlet. В случае HTTP-запроса в качестве объектов контейнер предоставляет объекты ТИПОВ HttpServletRequest И HttpServletResponse.

Экземпляр сервлета, созданного и инициализированного контейнером, может не обработать ни разу ни одного запроса. Контейнер сервлетов может одновременно послать несколько запросов методу service сервлета. Чтобы сервлет мог выполнять запросы параллельно, разработчик должен позаботиться о правильной работе одновременно выполняемых потоков, нескольких одновременно выполняемых методов service. Существует возможность создания однопотоковых сервлетов, для этого разработчик должен имплементировать интерфейс singieThreadModei. Контейнер сервлетов будет либо сериализовать запросы к сервлету, либо создаст несколько экземпляров сервлета. Если сервлет является частью Web-приложения, которое отмечено как распределенное, то контейнер сервлетов будет создавать пул объектов сервлетов на каждой виртуальной машине Java, которая участвует в работе распределенного приложения. Если сервлет не имплементирует интерфейс singieThreadModei и если метод service (или такие методы, как doGet или doPost, которые выполняются в составе метода service) определены внутри блока Synchronized, то контейнер сервлетов не сможет создать пул объектов сервлета, при этом он будет сериализовать запросы. Рекомендуется не синхронизовать метод service и методы, которые используются в нем, поскольку это существенным образом отражается на скорости выполнения приложения.

Исключения, возникающие во время обработки запросов

В процессе обработки запроса могут возникнуть исключения

ServletException И UnavailableException. Ошибка ServletException сообщает о наличии исключительной ситуации, появляющейся при обработке запроса. Контейнер должен предпринять соответсвующие действия для удаления запроса. Ошибка UnavaiiabieException сообщает о невозможности выполнить запрос временно или постоянно. Если запрос не может быть выполнен на постоянной основе, то контейнер должен удалить сервлет, выведя его из сервиса при помощи обращения к методу destroy. Все запросы, которые были удалены контейнером, должны привести к созданию ответа с кодом состояния sc_not_found (404). Если сервлет недоступен временно (ошибка unavaiiabieException), то контейнер отклоняет запрос и возвращает код состояния sc_service_unavailable (503), при этом посылается заголовок Retry-After, в котором указывается предполагаемое время, через которое сервлет станет доступен. Контейнер может игнорировать разницу между постоянным и временным состоянием недоступности сервлета, при этом вскоре возникновение ошибки unavaiiabieExceptions будет восприниматься как состояние, когда сервлет недоступен постоянно, следовательно, объект сервлета будет удаляться.

Прекращение работы сервлета

Контейнер сервлетов не должен хранить объекты сервлетов в течение определенного времени. Экземпляр сервлета может быть активен в течение нескольких миллисекунд или в течение всего времени работы контейнера (дни, месяцы, годы), а также в течение любого промежутка времени между этими двумя крайностями. После того как контейнер определяет, что экземпляр сервлета должен быть удален, контейнер вызывает метод destroy, описанный в интерфейсе servlet. Это может произойти, например, при необходимости высвободить ресурсы памяти или при выключении самого контейнера.

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

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии

1 комментарий

  1. jo says:

    ?- Чтобы браузер ‘увидел ‘ апплет, сервлет необходим соответствующий плагин (java)