Главная » Java, Web, XML » Сервлеты

0

Сервлетом (servlet) формально называется всякий класс, реализующий интерфейс Servlet из пакета javax.servlet. Основу сервлета составляют метод                выполняющий начальные действия сервлета, метод destroy о, завершающий работу сервлета, и метод service о , в котором заключена вся работа сервлета. Основная особенность сервлета в том, что он работает не сам по себе, а в составе Web-сервера.

Когда от клиента приходит запрос к сервлету, Web-сервер, а точнее один из его модулей, называемый Web-контейнером, загружает сервлет и обращается сначала к его методу init (), а затем к методу service (). Метод init () выполняется только один раз, при загрузке сервлета, при следующих запросах к сервлету сразу выполняется метод service о . Это очень похоже на работу апплета в браузере, откуда и произошло слово "сервлет".

У метода service () два аргумента, его заголовок выглядит так:

public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException;

Первый аргумент req — это ссылка на объект типа ServletRequest, созданный Web-контейнером при получении запроса от клиента, еще до обращения к методу service (). Объект содержит в себе запрос клиента, различные параметры и атрибуты которого сервлет может получить несколькими методами вида                                             name),                                       name). Для получения содержимого запроса интерфейс предоставляет два входных потока: байтовый поток класса и обычный символьный поток класса Buf feredReader из пакета java. io.

Второй аргумент resp — это ссылка на пустой объект типа servletResponse, тоже созданный Web-контейнером. Метод service о разбирает запрос, заключенный в объект req, методами интерфейса ServietRequest, обрабатывает его, и результат обработки заносит в объект resp методами интерфейса ServletResponse. Для этого интерфейс ServletResponse предоставляет байтовый выходной поток класса Servlet Output Stream И СИМВОЛЬНЫЙ ЕЫХОДЦСЙ ПОТОК класса PrintWriter.

После заполнения объекта resp сервлет заканчивает работу. Web-контейнер анализирует содержимое объекта resp, формирует ответ, и пересылает его клиенту через Web-сервер, в котором работает Web-контейнер.

В пакете                       есть абстрактный класс                                реализую-

все методы интерфейса                           за исключением метода service о.

Как правило, сервлеты, обрабатывающие произвольные Web-запросы, расширяют класс GenericServiet, реализуя метод service () .

В листинге 6.5 дан пример простого сервлета, отправляющего обратно содержимое полученного запроса.

1 Листинг 6.5. Простой сервлет

import j avax.servlet.*; import j ava.io.*;

public class EchoServlet extends GenericServiet{

public void service(ServletRequest req,

ServletResponse resp) throws ServletException, IOException{

Servietinputstream sis = req.getlnputstream(); ServletOutputStream sos =

int b = 0;

while ((b = sis. read О ) != -1) sos .write (b) ;

sis.close(); sos.close ();

}

}

Класс EchoServlet компилируется обычным образом и устанавливается в Web-контейнер. Установка (deployment) сервлета в контейнер — это процедура, в результате которой Web-контейнер "узнает" о существовании сервлета, может найти его и загрузить. В процессе установки можно задать начальные параметры сервлета. При создании экземпляра сервлета эти начальные параметры заносятся в объект типа Servletconfig, из которого их можно получить методами getinitParameter(string). Еще один метод интерфейса ServletConfig — метод getServletContext () — позволяет ПСЛу- чить контекст, в котором выполняются все сервлеты Web-приложения, в виде объекта типа

Процедура установки зависит от конкретного Web-контейнера. Обычно надо поместить сервлет в какой-нибудь каталог Web-контейнера и записать путь к нему в определенный конфигурационный файл. Многие Web- контейнеры предлагают утилиты установки, например, у J2EE-cepeepa, входящего в состав J2EE, есть утилита

Интерфейс Servlet и класс GenericServiet ничего не знают о протоколе, по которому прислан запрос. Они не учитывают особенности протокола. Ввиду особой важности протокола HTTP для Web-приложений, для обработки HTTP-запросов создан абстрактный класс HttpServlet — расширение класса GenericServiet. В класс HttpServiet введены специализированные методы обработки различных HTTP-методов передачи данных:

protected void doDelete (HttpServletRequest req,

HttpservletResponse resp) ; protected void doGet (HttpServletRequest req,

HttpservletResponse resp) ; protected void doHead (HttpServletRequest req,

HttpservletResponse resp) ; protected void doOptions (HttpServletRequest req,

HttpservletResponse resp) ; protected void doPost (HttpServletRequest req,

HttpservletResponse resp) ; protected void doPut (HttpServletRequest req,

HttpservletResponse resp) ; protected void doTrace (HttpServletRequest req,

HttpservletResponse resp) ;

Как видно из сигнатур этих методов, тип их аргументов тоже изменен. В интерфейс HttpServletRequest, расширяющий интерфейс ServletRequest, введены методы getxxx() получения различных частей адреса URL, полей HTTP-заголовка и cookie. В интерфейс HttpServletResponse, расширяющий интерфейс                                      введены аналогичные методы формирующие заголовок HTTP-ответа и cookie.

После загрузки сервлета класса HttpServlet, Web-контейнер, как обычно, обращается последовательно к его методам inito и service о. Метод service о реализован в классе HttpServiet как диспетчер. Он только определяет HTTP-метод передачи данных и обращается к соответствующему методу doXxx () обработки данного HTTP-метода. Разработчику не надо переопределять метод service (), достаточно определить методы doXxx (), чаще всего определяются два метода: doGet () и doPost ().

В листинге 6.6 приведен пример сервлета, принимающего HTTP-запрос вида GET /servlet/HttpEch0Servlet?name=MBaH0B&age=27 HTTP/1.1

пришедший по методу GET или POST, и отправляющий его обратно в виде страницы HTML.

ЬЛистинг 6.6. Сервлет, работающий по протоколу HTTP

import javax.servlet .*; import javax.servlet.http.*;

import

public class EchoHttpServlet extends HttpServlet{

public void doGet(HttpServletRequest req,

resp)

throws ServletException, IOException{

doPost(req, resp); }

public void doPost (HttpServletRequest req, HttpservietResponse resp) throws ServletException, IOException{

req.setCharacterEncoding("windows-1251");

String name = req.getParameter("name");

String age = req.getParameter ("age");

resp.setContentType("text/html;charset=windows-1251");

=

pw.println ("<htmlxhead><title>Echo</titlex/head>") ; pw.println("<Ьсх1уХ112>Результаты запроса:</h2>") ; pw.println("Имя: " + name + "<br/>");

pw.println("Возраст: " + age + "<br/>");

;

pw.flush(); pw.close ();

}

}

Класс Http Serviet шесте С интерфейсами Http Servlet Request, HttpServietResponse и сопутствующими интерфейсами и классами, составляет пакет j avax .servlet. http.

В технологии Java естественно оформлять Web-службы в виде сервлетов. Если Web-служба будет работать только по протоколу HTTP, то удобно создавать сервлеты, расширяющие класс Http Serviet. Если Web-служба должна работать по нескольким протоколам, то лучше расширить класс GenericServlet ИЛИ прямо реализовать интерфейс Servlet.

И в том, и в другом случае сервлету приходится самому оформлять ответ в виде SOAP-послания, явно выписывая все его элементы XML. Даже теги странички HTML, как видно из предыдущего примера, надо записывать в методах print ().

Для того чтобы облегчить создание сервлетов, принимающих и отправляющих SOAP-послания, в пакете j avax. xml. messaging приведено одно расширение класса Http Serviet. Это абстрактный класс JAXMServiet. Он предназначен для получения, обработки и отправки SOAP-посланий, оформленных средствами JAXM.

Литература:

Хабибуллин И. Ш. Разработка Web-служб средствами Java. — СПб.: БХВ-Петербург, 2003. — 400 с: ил.

По теме:

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