Сервлет является интерфейсом Java, реализация которого расширяет функциональные возможности сервера. Сервлет взаимодействует с клиентами посредством принципа запрос-ответ.
Хотя сервлеты могут обслуживать любые запросы, они обычно используются для расширения веб-серверов. Для таких приложений технология Java Servlet определяет HTTP-специфичные сервлет классы.
Пакеты javax.servlet
и javax.servlet.http
обеспечивают интерфейсы и классы для создания сервлетов.
Первая спецификация сервлетов была создана в Sun Microsystems (версия 1.0 была закончена в июне 1997). Начиная с версии 2.3 спецификация сервлетов разрабатывалась под руководством Java Community Process. Стандарт JSR 53 определял как Servlet 2.3, так и спецификацию JavaServer Page 1.2. JSR 154 включает в себя спецификации Servlet 2.4 и 2.5. Текущая спецификация на 2 марта 2021 года — Servlet 4.0 (описана в JSR-369).
Хронология Servlet API
Хронология Servlet API
Servlet API версия |
Релиз |
Платформа |
Важнейшие изменения
|
Servlet 4.0
|
Сентябрь 2017
|
JavaEE 8
|
HTTP/2, Server Push
|
Servlet 3.1 |
Май 2013 (англ.) |
JavaEE 7, JavaSE 7 |
Неблокирующий ввод-вывод, поддержка нестандартных протоколов поверх HTTP
|
Servlet 3.0 |
Декабрь 2009 Архивная копия от 6 августа 2011 на Wayback Machine |
JavaEE 6, JavaSE 6 |
Pluggability, простота разработки, асинхронные сервлеты, безопасность, загрузка файлов
|
Servlet 2.5 |
Сентябрь 2005 Архивная копия от 9 июня 2008 на Wayback Machine |
JavaEE 5 , J2SE 5.0 |
Требует J2SE 5.0, поддержка аннотаций
|
Servlet 2.4 |
Ноябрь 2003 Архивная копия от 9 июня 2008 на Wayback Machine |
J2EE 1.4, J2SE 1.3 |
web.xml использует XML Schema
|
Servlet 2.3 |
Август 2001 Архивная копия от 16 мая 2008 на Wayback Machine |
J2EE 1.3, J2SE 1.2 |
Появление Filter
|
Servlet 2.2 |
Август 1999 Архивная копия от 11 июня 2008 на Wayback Machine |
J2EE 1.2, J2SE 1.2 |
Становится частью J2EE, предлагает независимые веб-приложения в .war файлах
|
Servlet 2.1 |
Ноябрь 1998 Архивная копия от 11 июня 2008 на Wayback Machine |
не оговорено |
Первая официальная спецификация, добавлены RequestDispatcher , ServletContext
|
Servlet 2.0 |
|
JDK 1.1 |
Часть Java Servlet Development Kit 2.0
|
Servlet 1.0 |
Июнь 1997 |
|
|
Жизненный цикл сервлета
Жизненный цикл сервлета состоит из следующих шагов:
- В случае отсутствия сервлета в контейнере.
- Класс сервлета загружается контейнером.
- Контейнер создаёт экземпляр класса сервлета.
- Контейнер вызывает метод
init()
. Этот метод инициализирует сервлет и вызывается в первую очередь, до того, как сервлет сможет обслуживать запросы. За весь жизненный цикл метод init()
вызывается только один раз.
- Обслуживание клиентского запроса. Каждый запрос обрабатывается в своём отдельном потоке. Контейнер вызывает метод
service()
для каждого запроса. Этот метод определяет тип пришедшего запроса и распределяет его в соответствующий этому типу метод для обработки запроса. Разработчик сервлета должен предоставить реализацию для этих методов. Если поступил запрос, метод для которого не реализован, вызывается метод родительского класса и обычно завершается возвращением ошибки инициатору запроса.
- В случае если контейнеру необходимо удалить сервлет, он вызывает метод
destroy()
, который снимает сервлет из эксплуатации. Подобно методу init()
, этот метод тоже вызывается единожды за весь цикл сервлета.
Пример
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class NewServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Параметр
String parameter = request.getParameter("parameter");
// Старт HTTP сессии
HttpSession session = request.getSession(true);
session.setAttribute("parameter", parameter);
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Заголовок</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Пример сервлета"+parameter+"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
@Override
public String getServletInfo() {
return "Пример сервлета";
}
}
См. также
Ссылки
|
---|
Платформы | |
---|
Технологии Sun | |
---|
Основные сторонние технологии | |
---|
История | |
---|
Свойства языка | |
---|
Скриптовые языки | |
---|
Конференции Java | |
---|