Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 411

Ильдар Шаукатович Хабибуллин

Получить байтовый поток из запроса req можно методом

public ServletInputStream getInputStream();

Второй поток — символьный — это поток класса BufferedReader, который мы рассмотрели в главе 23. Получить его можно методом

public BufferedReader getReader();

В пакете javax.servlet есть прямая реализация интерфейса ServletRequest — класс ServletRequestWrapper. Объект этого класса создается конструктором

public ServletRequestWrapper(ServletRequest req);

и обладает всеми методами интерфейса ServletRequest. Разработчики, желающие расширить возможности объекта, содержащего запрос, или создать фильтр, могут расширить класс ServletRequestWrapper.

Интерфейс ServletResponse

Результаты своей работы метод service ( ) заносит в объект типа ServletResponse, ссылка на который предоставлена вторым аргументом метода service ().

Методы setContentType (String) и setLocale(Locale) устанавливают в заголовок ответа MIME-тип и локаль тела ответа, а метод setContentLength(int) записывает длину тела ответа. Если надо установить только кодировку символов в ответе, то можно воспользоваться методом setCharacterEncoding(String).

Тело ответа передается контейнеру через байтовый или символьный выходной поток. Байтовый поток специально разработанного класса ServletOutputStream возвращает метод

public ServletOutputStream getOutputStream();

Абстрактный класс ServletOutputStream расширяет класс OutputStream, добавляя к нему методы print (xxx) для вывода типов boolean, char, int, long, float, double, String и методы println(xxx) для тех же типов, добавляющие к выводимым данным символы "\r\n". Еще один метод println() без аргументов просто заносит в выходной поток символы "\r\n".

Символьный поток можно получить методом

public PrintWriter getWriter();

Именно он использован в листинге 26.2.

В пакете javax.servlet есть прямая реализация интерфейса ServletResponse — класс ServletResponseWrapper. Объект этого класса создается конструктором

public ServletResponseWrapper(ServletResponse resp);

и обладает всеми методами интерфейса ServletResponse. Разработчики, желающие расширить возможности объекта, содержащего ответ, например для создания фильтра, могут расширить класс ServletResponseWrapper.

Цикл работы сервлета

Сервлет загружается контейнером, как правило, при первом запросе к нему или во время запуска контейнера. После выполнения запроса сервлет может быть оставлен в спящем состоянии, ожидая следующего запроса, или выгружен, предварительно выполнив метод destroy (). Это зависит от реализации контейнера сервлетов.

Работа сервлета начинается с метода init(), затем выполняется метод service(), который может создавать объекты, обращаться к их методам, связываться с базами данных и удаленными объектами, выполняя обычную работу обычного класса Java. При этом надо учитывать, что сервлету может быть направлено сразу несколько запросов. Число одновременных запросов в промышленных системах достигает сотен и тысяч. Для обработки каждого запроса контейнер создает новый подпроцесс (thread), выполняющий метод service (). Поэтому выполняйте следующие правила: