- •Раздел 12. Веб-сервера
- •12.2. Стандарт cgi
- •Раздел 13. Технология Java Servlet
- •Пример сервлета
- •Компиляция сервлетов
- •Структура веб-модуля
- •Запуск сервлета
- •Архив веб-модуля
- •13.2. Структура и жизненный цикл сервлета
- •Работа сервлетов в многопоточной среде
- •13.3. Основные классы Servlet api Класс HttpServletRequest (запрос)
- •Класс HttpServletResponse (ответ)
- •Класс HttpServlet (сервлет)
- •Класс ServletContext (взаимодействие с сервлет-контейнером)
- •13.4. Cookies и сессии
- •13.5. Отладка сервлетов
- •Раздел 14. Технология JavaServer Pages
- •14.1. Введение в jsp
- •14.2. Жизненный цикл jsp-страниц
- •Действия
- •14.4. Язык выражений
- •Предопределенные объекты
- •14.5. Библиотеки тегов
- •Раздел 14. Технология JavaServer Pages
- •14.1. Введение в jsp
- •14.2. Жизненный цикл jsp-страниц
- •Действия
- •14.4. Язык выражений
- •Предопределенные объекты
- •14.5. Библиотеки тегов
13.2. Структура и жизненный цикл сервлета
Сервлет — это обычный класс, методы которого вызываются веб-сервером при поступлении запросов от клиентов. Вся логика веб-приложения может выполняться самими сервлетами или же быть вынесена в отдельные классы.
Жизненный цикл сервлета включает следующие три этапа:
-
Инициализация. Выполняется при первом обращении клиента к сервлету. Веб-сервер создает экземпляр сервлета и вызывает у него метод init(), в котором разработчик может предусмотреть необходимую инициализацию.
-
Обработка запросов клиентов. При каждом запросе клиента веб-сервер вызывает у сервлета метод service(HttpServletRequest, HttpServletResponse). Этот метод, в зависимости от используемого клиентом HTTP-метода, вызывает у сервлета метод doGet, doPost или doHead (другие HTTP-методы практически не применяются). В сервлетах обычно перекрываются именно методы doGet, doPost, doHead (последний реже), хотя можно перекрыть и сам метод service. С помощью объекта HttpServletRequest сервлеты могут получить исчерпывающую информацию о запросе, а с помощью объекта HttpServletResponse они отправляют ответ клиенту.
-
Завершение работы сервлета. Этот этап обычно происходит, когда сервлет-контейнер заканчивает работу. В этом случае он прекращает принимать новые запросы и вызывает у всех созданных сервлетов метод destroy(). В этом методе разработчики могут предусмотреть любые необходимые завершающие операции (например, сохранение данных на диск или закрытие соединения с СУБД).
Структура класса сервлета соответствует указанным этапам:
public class ServletTemplate extends HttpServlet {
public void init() throws ServletException {
// инициализация (вызывается один раз)
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
// обработка запроса типа GET
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
// обработка запроса типа POST
}
public void destroy() throws ServletException {
// завершение работы (вызывается один раз)
}
}
Сервлетами всегда реализуется, по крайней мере, один из методов doGet и doPost (реже service). Методы init и destroy реализуются в случае необходимости.
Пример сервлета, который просто возвращает HTML-код (всегда один и тот же) на HTTP-запрос методом GET:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html; charset=UTF-8");
PrintWriter out = res.getWriter();
out.println("<html><body><h1>Здравствуй, мир! </h1></body></html>");
}
}
Чтобы сервлет работал и с POST-запросами, следует реализовать метод doPost. Часто из метода doPost просто вызывают метод doGet, если должна быть реализована одинаковая обработка обоих HTTP-методов:
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doGet(req, res);
}