Что такое java servlet
Перейти к содержимому

Что такое java servlet

  • автор:

Сервлеты

Сервлет представляет специальный тип классов Java, который выполняется на веб-сервере и который обрабатывает запросы и возвращает результат обработки.

Создадим первый сервлет. Определим где-нибудь на жестком диске файл HelloServlet.java со следующим кодом:

import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet < protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < response.setContentType("text/html"); PrintWriter writer = response.getWriter(); try < writer.println("

Hello from HelloServlet

"); > finally < writer.close(); >> >

Класс сервлета наследуется от класса HttpServlet . Перед определением класса указана аннотация WebServlet , которая указывает, с какой конечной точкой будет сопоставляться данный сервлет. То есть данный сервлет будет обрабатывать запросы по адресу «/hello».

Для обработки GET-запросов (например, при обращении к сервлету из адресной строки браузера) сервлет должен переопределить метод doGet . То есть, к примеру, в данном случае get-запрос по адресу /hello будет обрабатываться методом doGet.

Этот метод принимает два параметра. Параметр типа HttpServletRequest инкапсулирует всю информацию о запросе. А параметр типа HttpServletResponse позволяет управлять ответом. В частности, с помощью вызова response.setContentType(«text/html») устанавливается тип ответа (в данном случае, мы говорим, что ответ представляет код html). А с помощью метода getWriter() объекта HttpServletResponse мы можем получить объект PrintWriter, через который можно отправить какой-то определенный ответ пользователю. В данном случае через метод println() пользователю отправляет простейший html-код. По завершению использования объекта HttpServletResponse его необходимо закрыть с помощью метода close() .

Для запуска сервлета воспользуемся опять же контейнером сервлетов Apache Tomcat. В каталоге Tomcat в папке webapps создадим каталог для нового приложения, который назовем helloapp .

В папке приложения классы сервлетов должны размещаться в папке WEB-INF/classes . Создадим в каталоге helloapp папку WEB-INF, а в ней папку classes. И в папку helloapp/WEB-INF/classes поместим файл HelloServlet.java.

Сервлет в Apache Tomcat

Но нам нужен не код сервлета, а скомпилированный класс сервлета. Поэтому скомпилируем сервлет. Для этого нам нужно использовать специальную утилиту servlet-api.jar , которая находится в каталоге Tomcata в папке lib.

В начале в командной строке/терминале перейдем с помощью команды cd к папке helloapp/WEB-INF/classes , где расположен код сервлета.

Потом для компиляции сервлета выполним следующую команду:

javac -cp .;"C:\Program Files\Apache Software Foundation\Tomcat 9.0\lib\servlet-api.jar" HelloServlet.java

В моем случае предполагается, что Tomcat размещен в каталоге C:\Program Files\Apache Software Foundation\Tomcat 9.0.

Компиляция сервлета для Apache Tomcat

После этого в папке helloapp/WEB-INF/classes должен появиться класс сервлета. Перезапустим Tomcat и обратимся к нашему сервлету в браузере:

Создание сервлета на Java

Поскольку с помощью аннотации WebServlet в классе сервлета была указана точка «/hello», то при обращении к сервлету после домена и порта идет название приложения (helloapp) и конечная точка (hello).

Сервлет

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

В языке есть Java Servlet API — он описывает работу с запросами и ответами на них. Чтобы части приложения могли обмениваться информацией, разработчик создает сервлет — подпрограмму, которая управляет этим обменом.

Освойте профессию «Java-разработчик»

Для чего нужны сервлеты

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

  • создавать динамические страницы — те, на которые контент подгружается «на лету»;
  • запрашивать информацию у базы данных и получать ответ;
  • собирать сведения от пользователей через формы для записей;
  • выводить сообщения в ответ на запрос и делать многое другое.

В Java есть и другие механизмы для общения между клиентом и сервером, но ими пользуются реже. Сервлеты — более стандартное решение, и любой разработчик на Java должен уметь с ними работать.

Профессия / 14 месяцев
Java-разработчик

Освойте востребованный язык

Group 1321314345 (4)

Как работает сервлет

Типичное веб-приложение состоит из клиентской и серверной части. Клиентская часть — это та, через которую работает пользователь. Серверная — та, где хранится информация и выполняются вычисления. Она скрыта от пользователя: он получает доступ к сведениям оттуда через клиент.

Чтобы приложение работало как следует, нужно, чтобы клиент и сервер сообщались друг с другом. Обычно для этого используют механику «запрос-ответ»: клиент запрашивает у сервера что-то, тот обрабатывает запрос и выдает на него нужный ответ. Именно эту механику реализуют сервлеты.

image-5038867

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

Что нужно, чтобы сервлеты функционировали

Сервлет — это просто код, в котором описано, как сервер будет отвечать на запросы. Чтобы он работал, нужно специальное программное обеспечение. Оно называется контейнером сервлетов. Это оно занимается созданием экземпляров и их удалением.

Контейнер устанавливается на сервере. Он может работать как полноценный веб-сервер или как надстройка к нему — зависит от реализации. Его основная задача — поддерживать работу сервлетов: получать их, запускать, следить за исполнением, а при необходимости уничтожать. Он же помогает сервлету обмениваться данными с клиентом: устанавливает соединение, запускает среду для выполнения кода и делает многое другое.

image-8406013

Для понимания можно представить сервлет как узкого специалиста, который выполняет специфическую задачу, а контейнер — как менеджера, организующего его работу.

Популярный контейнер для работы с сервлетами — Apache Tomcat. Он работает с веб-сервером Apache, одним из самых распространенных в мире. Большинство примеров и туториалов по сервлетам написаны именно под Tomcat.

Как контейнер работает с сервлетом

Контейнер получает сервлет и загружает его. Сервлет выглядит как класс: блок кода, который описывает объект, но еще им не является. Класс похож на схему, по которой нужно «собрать» объект. Именно это делает контейнер: после загрузки сервлета он создает его работающий экземпляр.

Для предварительной настройки, или инициализации, экземпляра контейнер вызывает специальный метод init(). Он стандартный и отвечает за приведение сервлета в рабочее состояние: открытие дополнительных файлов, соединение с нужными сервисами и так далее. Что именно входит в эту настройку, прописывает разработчик в специальном объекте ServletConfig.

После выполнения метода init() сервлет готов к работе. Теперь если он получит какой-нибудь запрос, то сможет его обработать. Этим экземпляр и занимается все то время, в течение которого работает.

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

image-4029351

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить

Как обрабатываются запросы

Когда сервлету приходит новый запрос, контейнер вызывает для него специальный метод service(). Внутри этого метода определяется, к какому типу относится запрос, а значит, на какой метод сервлета его нужно перенаправить. Дальше все зависит от того, умеет ли сервлет обрабатывать этот тип.

  • Если у сервлета есть метод для такого запроса, он выполняется — программа делает то, что должна.
  • Если разработчик не прописал метод для этого типа запроса, сервлет пользуется стандартным — тем, который для таких запросов описан в родительском классе. Чаще всего после этого он возвращает ошибку исполнения.

Сервлеты работают многопоточно. Для каждого запроса создается свой поток — отдельно выполняющаяся последовательность действий. Потоки независимы друг от друга и разделены на уровне системы. Такой подход позволяет серверу работать быстрее и обрабатывать несколько запросов одновременно. Иначе приходилось бы ждать, пока сервер завершит работу с предыдущим запросом, и все бы постоянно «зависало».

image-1813067

Что такое портлеты

Есть еще одна похожая технология — портлеты. Для них есть свои контейнеры, они тоже размещаются на сервере и выполняют определенные задачи. Более того: портлеты основаны на сервлетах и расширяют их возможности.

Основное отличие — портлетов на одной странице может быть несколько, и каждый из них отвечает за свою задачу. А сервлет на странице всегда один. Это происходит, потому что сервлет должен работать с веб-документом целиком, а портлет — только с его частью. Поэтому портлеты можно представить как «кирпичики», из которых складывается функциональность страницы.

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

Как создать свой первый сервлет

Мы не будем углубляться в технические подробности, просто коротко расскажем о процессе создания сервлета, чтобы вы представляли, как это делается в теории.

Установить ПО. Сначала нужно установить на своей рабочей машине нужное ПО, то есть контейнер сервлетов. Самый популярный из них — Tomcat, он есть в свободном доступе, и его можно скачать с официального сайта. Кроме того, вам понадобится сборщик проектов Maven и среда разработки. Стандартно для Java используется Intellij IDEA, но для веб-приложений понадобится ее Ultimate Edition, она платная. Впрочем, есть бесплатная версия в раннем доступе, а также 30-дневная пробная версия стабильного выпуска.

Создать проект в Maven. Maven — это инструмент, который собирает проекты на Java в единую систему. Без него работать с языком очень сложно. Он помогает автоматически создавать структуру проекта, сам подключает нужные библиотеки и зависимости, делает многое другое. Проект с сервлетами рекомендуют создавать с его помощью.

Прописать зависимости. Для создания сервлетов нужно подключить к коду компонент, который их описывает, — Java Servlet API. В проектах на Maven это делается в отдельном файле pom.xml. Кроме того, понадобится подключить архивацию WAR — это формат архива для веб-приложений.

Написать код сервлета. В отдельном файле нужно написать класс, который относится к интерфейсу сервлета. Это только звучит страшно: на самом деле достаточно прописать в качестве «родителя» класса стандартный HttpServlet. Внутри этого класса будет код сервлета.

Перед классом понадобится прописать аннотацию @WebServlet(), а в скобках указать адрес для сервлета. Например, так: @WebServlet(«/firstservlet») — название может быть любым. Это называется маппингом — с его помощью сервер поймет, по какому адресу обращаться к нужному сервлету.

Внутри класса создаются методы — действия, которые программа будет выполнять, если получит определенную команду. В методах сервлета прописывается, как он будет реагировать на тот или иной тип запроса. Для каждого типа запроса нужен свой метод.

Вообще-то у стандартного класса HttpServlet уже есть такие методы: к ним сервлет обратится, если разработчик не напишет свой код для обработки. Но мы уже говорили: такое обращение обычно завершается ошибкой и в любом случае не делает ничего полезного. Поэтому, чтобы код выполнял нужные вам действия, методы нужно переопределить.

Написанный код нужно скомпилировать и поместить в архив WAR. В этом поможет Maven.

Создать конфигурацию контейнера. Когда сервлет будет готов, понадобится сконфигурировать контейнер. Это можно сделать через среду разработки: в меню есть список доступных компонентов, понадобится выбрать там нужный сервер и создать его экземпляр. Для тестирования сервер можно запустить на собственном компьютере через localhost — так в сетевых технологиях называется локальное устройство.

Еще при создании конфигурации нужно выбрать сервлет, который будет выполняться на сервере. Для этого нужно собрать файл, где вы писали код, в архив — это можно сделать через Maven, — а потом выбрать его из списка. В Intellij IDEA это делается с помощью кнопки Fix.

Запустить и протестировать код. Понадобится указать URL, по которому будет доступен сервлет. Обычно он такой: ключевое слово localhost, номер порта для доступа через двоеточие, а затем после слэша / — маппинг, который вы указали при создании сервлета. Пример адреса — http://localhost:8080/firstservlet.

Затем можно нажать кнопку запуска в среде разработки и посмотреть, выполнится ли код. Если маппинг указан неправильно, браузер покажет ошибку 404, потому что сервер не найдет сервлет по нужному адресу. Но если все хорошо, экземпляр сервлета создастся и запустится.

IT-специалист с нуля

Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.

Сервлеты — Java: Веб-технологии

Javalin — это не единственный фреймворк на Java, вместе со Spring Boot их десятки. Несмотря на это многообразие, все они базируются на механизме сервлетов (servlets). В этом уроке мы обсудим, что это такое и почему об этом нужно знать.

Клей между фреймворками и веб-серверами

Любой веб-фреймворк работает не сам по себе. Для запуска написанного на нем приложения нужен веб-сервер. Такой веб-сервер загружает приложение внутрь себя и запускает. Из этого следует два вывода:

  • Такой веб-сервер должен быть написан на том же языке — например, в Java среди основных веб-серверов выделяют Tomcat и Jetty
  • Веб-сервер и фреймворк должны знать друг о друге, чтобы они могли работать совместно

Теперь представьте, что у нас есть десятки фреймворков и десятки веб-серверов. Как им всем знать друг о друге? В худшем случае нам пришлось бы писать код для совместимости каждого с каждым. Это было бы пустой тратой ресурсов команд разработчиков, а создание нового фреймворка было бы очень затруднено.

К счастью, эта проблема решилась еще в конце девяностых, когда появилась спецификация сервлетов. С тех пор все веб-сервера ориентируются только на сервлеты, а фреймворки, используют сервлеты для своей работы «под капотом». Все, что мы писали на Javalin, внутри фреймворка превращается в сервлеты:

Эта спецификация описывает способ написания универсального веб-приложения под Java, в котором код состоит из сервлетов.

Каждый сервлет – это класс, отвечающий за определенный маршрут. Во время работы веб-сервер принимает входящие запросы и передает их сервлетам, отвечающим за запрошенные адреса. Затем сервлеты возвращают ответы, которые отправляются клиентам.

Можно ли сделать вид, что для работы с фреймворками мы не обязаны ничего знать про сервлеты? С одной стороны, да, ведь сервлеты существуют только где-то внутри. На каком-то уровне их можно не замечать. С другой стороны, игнорировать сервлеты не стоит. Они встречаются везде: то в выводах в логах, то в настройках. Даже в Spring Boot настройки часто работают с механизмом сервлетов напрямую. Кроме того, о них могут спросить на собеседовании.

Первый сервлет

Рассмотрим создание полноценного приложения с помощью сервлетов на примере репозитория java-servlet-gradle . Начнем с класса сервлета:

package io.hexlet.servlet; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet(name = "MainServlet", urlPatterns = "/about") public class MainServlet extends HttpServlet  @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException  res.setContentType("text/plain"); res.getWriter().write("Hello, Simple Servlet!"); > > 

Здесь мы видим переопределенный метод doGet() . Он вызывается на Get-запрос по адресу /about, указанному в аннотации. Внутри есть доступ к объектам запроса и ответа. В нашем примере данные запроса не используются, а вот в ответе отдается строчка текста. Перечислим моменты, на которые нужно обратить внимание:

  • Jakarta (Jakarta EE) — это набор спецификаций и компонентов, предоставляющих решения для различных прикладных приложений. Туда входят и сервлеты и многое другое, что встречается в реальных проектах
  • Сервлет наследуется от класса HttpServlet , импортированного из Jakarta
  • Сервлет нужно пометить аннотацией @WebServlet с указанием имени и маршрута, за который этот сервлет отвечает

Так можно добавить любое количество сервлетов:

Чтобы запустить веб-сервер с нашим приложением, понадобится кое-что еще установить и настроить. Ниже урезанная версия файла build.gradle.kts :

plugins  id("java") // Плагин, который устанавливает и автоматически настраивает веб-сервер id("org.gretty") version "4.1.0" // И другие плагины > dependencies  // Необходимые классы implementation("jakarta.servlet:jakarta.servlet-api:6.0.0") > gretty  // Эта настройка веб-сервера указывает, что нужно работать от корня // По умолчанию базовый путь равен названию проекта contextPath = '/' > 

После этого можно запустить приложение:

; built: 2023-04-11T18:37:53.775Z; git: 5bc5e562c8d05c5862505aebe5cf83a61bdbcb96; jvm 20.0.2+9-78 2023-08-19 21:03:52.224:INFO :oejs.AbstractConnector:main: Started ServerConnector@7af1cd63HTTP/1.1, (http/1.1)>0.0.0.0:8080> 2023-08-19 21:03:52.243:INFO :oejs.Server:main: Started Server@5cf8edcfSTARTING>[11.0.15,sto=0] @1461ms 2023-08-19 21:03:52.639:INFO :oejss.DefaultSessionIdManager:main: Session workerName=node0 2023-08-19 21:03:52.664:INFO :oejsh.ContextHandler:main: Started o.a.g.JettyWebAppContext@186cb891/,/,file:///Users/kirillmokevnin/repos/java-servlet-gradle/build/inplaceWebapp/,AVAILABLE> 2023-08-19 21:03:52.673:INFO :oag.JettyConfigurerImpl:main: Jetty 11.0.15 started and listening on port 8080 2023-08-19 21:03:52.689:INFO :oag.JettyConfigurerImpl:main: runs at: 2023-08-19 21:03:52.690:INFO :oag.JettyConfigurerImpl:main: http://localhost:8080/ > Task :appRun Press any key to stop the server. ===========--> 87% EXECUTING [25s] > :appRun 

После этого приложение станет доступно в браузере по адресу http://localhost:8080 . Если открыть страницу https://localhost:8080/about , то мы увидим текст Hello, Simple Servlet!.

Шаблонизатор Java Server Pages (JSP)

Кроме сервлетов, Jakarta содержит в себе JSP. Это простой шаблонизатор, который можно использовать для генерации HTML-страниц на сервере. Для примера создадим другой сервлет и посмотрим, как использовать JSP:

package io.hexlet.servlet; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet(name = "UsersServlet", urlPatterns = "/users") public class UsersServlet extends HttpServlet  @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException  String message = "Hello from Jakarta Servlet!"; String[] users = "Mike", "Nina">; req.setAttribute("message", message); req.setAttribute("users", users); req.getRequestDispatcher("/WEB-INF/users.jsp").forward(req, resp); > > 

Общая структура сервлета не поменялась, но добавилось несколько деталей:

  • Данные, которые мы хотим передать в шаблон, нужно записывать в объект запроса через метод setAttribute()
  • Нужно явно указать, какой шаблон использовать

Для хранения шаблонов используется стандартная директория src/main/resources/webapp/WEB-INF:

%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> %@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>    JSP Example  

%= request.getAttribute("message") %>

items="$" var="user"> $

В шаблоне можно отметить четыре важных элемента:

  • Первой строчкой идет c:forEach — директива для работы JSP-тегов (они начинаются с префикса c )
  • Запрос и ответ доступны в шаблоне напрямую через переменные request и response
  • Для вывода данных используется синтаксис , внутри которого можно вызывать Java-код
  • Для управляющих конструкций используется синтаксис на нестандартных тегах, которые превращаются в обычный HTML после обработки

Для работы JSP нужно добавить несколько зависимостей:

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Сервлеты Servlets

Servlet — это java-программа, которая выполняется на серверной стороне Web-приложения. Точно так же, как апплеты динамически расширяют функциональные возможности Web-браузера, сервлеты динамически расширяют функциональные возможности Web-сервера.

Работу servlet‘а можно описать следующим образом: при приходе запроса от клиента Web-сервер с помощью специального конфигурационного файла может определить, какой сервлет необходимо выполнить. После этого Web-сервер запускает JVM, которая в свою очередь выполняет сервлет. Servlet обрабатывает запрос и передает содержимое Web-серверу (возможно в виде HTML-страницы). Web-сервер отправляет клиенту ответ (сформированную сервлетом HTML-страницу).

WEB-сервер по сути является неким контейнером, который загружает servlet‘ы, выполняет их, и, получив от них результат, отправляет его клиенту.

Servlet в архитектуре Web-приложения

Из-за своей мощности и гибкости, servlet‘ы могут играть значительную роль в архитектуре системы. Они могут выполнять прикладные задачи, предназначенные для промежуточного уровня, работать как прокси-сервер для клиента и даже улучшать функциональность промежуточного уровня, добавляя поддержку новых протоколов и других функций. Промежуточный уровень выполняет функции сервера приложений в так называемой трехуровневой системе клиент-сервер и расположен между «легковесным» клиентом, таким как Web-браузер, и источником данных.

Servlet как прокси-сервер

Для поддержки апплетов сервлеты могут выполнять функции их прокси-серверов. Это может быть важно, поскольку система безопасности Java позволяет апплетам соединяться только с сервером, с которого они были загружены. Если апплет нуждается в соединении с сервером баз данных, расположенном на другой машине, servlet может создать это соединение для апплета.

Временные и постоянные servlet‘ы

Сервлеты могут запускаться и останавливаться для каждого клиентского запроса. Также они могут запускаться при старте Web-сервера и существовать до его остановки. Временные servlet‘ы загружаются по требованию и предлагают хороший способ сохранения ресурсов сервера для редко используемых функций. Постоянные сервлеты загружаются при старте Web-сервера и существуют до его остановки. Сервлеты устанавливаются как постоянные расширения для сервера в том случае, если затраты по их запуску очень велики (например, установка соединения с базой данных), если они предлагают постоянную функциональность на стороне сервера (например, служба RMI), или в случаях, когда они должны отвечать на запросы клиента как можно быстрее. Не существует специального кода для назначения servlet‘а постоянным или временным; это функция настройки Web-сервера.

Жизненный цикл сервлета, javax.servlet.Servlet

Сервлеты выполняются на платформе Web-сервера как часть того же процесса, что и сам Web-сервер. Web-сервер отвечает за инициализацию, вызов и уничтожение каждого экземпляра сервлета. Web-сервер взаимодействует с сервлетом через простой интерфейс: javax.servlet.Servlet.

Интерфейс javax.servlet.Servlet включает три главных методов:

и два вспомогательных методов:

  • getServletConfig()
  • getServletInfo()

Сходство между интерфейсами servlet‘а и апплета Java очевидны. Именно так и было спроектировано! Java сервлеты являются для Web-серверов тем же самым, чем являются апплеты для Web-браузеров. Апплет выполняется в Web-браузере, выполняя действия по его запросу через специальный интерфейс. Сервлет делает то же самое, работая на Web-сервере.

Инициализация сервлета, метод init()

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

Гарантируется, что метод init() закончится перед любым другим обращением к сервлету – таким как, например, вызов метода service(). Обратите внимание, что init() будет вызван только один раз; он не будет вызываться до тех пор, пока сервлет не будет выгружен и затем загружен сервером снова.

Метод init() принимает один аргумент – ссылку на объект ServletConfig, который содержит аргументы для инициализации сервлета. Этот объект имеет метод getServletContext(), возвращающий объект ServletContext, который содержит информацию об окружении сервлета.

Ядро сервлета, метод service()

Метод service() является сердцем сервлета. Каждый запрос от клиента приводит к одному вызову метода service(). Этот метод читает запрос и формирует ответное сообщение при помощи своих двух аргументов ServletRequest и ServletResponse :

  • Объект ServletRequest содержит данные от клиента. Данные состоят из пар имя/значение и InputStream. Существует несколько методов, возвращающих информацию о параметрах клиента. InputStream может быть получен при помощи метода getInputStream(). Этот метод возвращает объект ServletInputStream, который можно использовать для получения дополнительных данных от клиента. Если необходима выполнить обработку символьных данных, а не двоичных, то можно получить объект BufferedReader при помощи метода getReader().
  • Объект ServletResponse содержит ответ сервлета клиенту. Во время подготовки ответа прежде всего вызывается метод setContentType() для установки типа MIME ответа. Затем могут быть использованы методы getOutputStream() или getWriter() для получения объектов и ServletOutputStream или PrintWriter соответственно для передачи данных обратно клиенту.

Таким образом, существуют два способа передачи информации от клиента к сервлету. Первый – через передачу значений в параметрах запроса. Значения параметров могут быть вставлены в URL. Второй способ передачи информации от клиента к сервлету осуществляется через InputStream (или Reader).

Работа метода service() по существу проста – он создает ответ на каждый клиентский запрос, переданный ему с сервера. Однако необходимо помнить, что могут существовать несколько параллельных запросов, обрабатываемых в одно и то же время. Если метод service() требует каких-либо внешних ресурсов, таких как файлы, базы данных, то необходимо гарантировать, чтобы доступ к ресурсам являлся потокозащищенным.

Выгрузка сервлета, метод destroy()

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

Важно оформить метод destroy() таким образом, чтобы избежать закрытия необходимых ресурсов до тех пор, пока все вызовы service() не завершатся.

Конфигурация сервлета, метод getServletConfig()

Метод getServletConfig() возвращает ссылку на объект, который реализует интерфейс ServletConfig. Данный объект предоставляет доступ к информации о конфигурации сервлета, т.е. доступ к параметрам инициализации сервлета и объекту контектса сервлета ServletContext, который дает доступ к сервлету и его окружению.

Информация о сервлете, метод getServletInfo()

Метод getServletInfo() определяется программистом, создающим сервлет, для возврата строки, содержащую информацию о сервлете, например: автор и версия сервлета.

Интерфейс ServletRequest

ServletRequest предоставляет клиентскую информацию о параметрах HTTP запроса сервлету, т.е. обеспечивает данные включая название параметра и значения, атрибуты, и входной поток. Эта информация передается в метод service().

Следующий servlet пример показывает, как получить информацию из параметра request метода service():

BufferedReader reader; String param1; String param2; public void service(ServletRequest request, ServletResponse response)

Дополнительная информация о запросе доступна сервлету через методы, основные из которых приведены в следующей таблице:

getAttribute () Возвращает значение указанного атрибута этого запроса.
getContentLength () Размер запроса, если известен.
getContentType () Возвращает тип MIME тела запроса.
getInputStream () Возвращает InputStream для чтения двоичных данных из тела запроса.
GetParameterNames () Возвращает массив строк с именами всех параметров.
getParameterValues () Возвращает массив значений для указанного параметра.
getProtocol () Возвращает протокол и версию для запроса как строку вида /..
getReader () Возвращает BufferedReader для получения текста из тела запроса.
getRealPath () Возвращает реальный путь для указанного виртуального пути.
getRemoteAddr () IP-адрес клиента, пославшего данный запрос.
getRemoteHost () Имя хоста клиентской машины, пославшего данный запрос.
getScheme () Возвращает схему, используемую в URL этого запроса (например, https, http, ftp, и т.д.).
getServerName () Имя хоста сервера, принявшего данный запрос.
getServerPort () Возвращает номер порта, используемого для приема этого запроса.

Интерфейс ServletResponse

Интерфейс ServletResponse — это инструмент для отправки данных клиенту. Все методы данного инструмента служат именно для решения этой задачи :

public java.lang.String getCharacterEncoding() public void setLocale(java.util.Locale loc) public java.util.Locale getLocale()

Первый метод возвращает MIME тип кодировки (к примеру — UTF8), в которой будет выдаваться информация. Вторые два метода тоже работают с charset. Они указывают на язык используемый в документе (например — русский).

public ServletOutputStream getOutputStream() throws java.io.IOException

Метод getOutputStream возвращает поток вывода данных для сервлета. Этот поток используется, к примеру, для вывода бинарных файлов. Текстовые данные можно выводить с помощью java.io.Writer:

public java.io.PrintWriter getWriter() throws java.io.IOException

Метод getWriter() автоматически конвертирует строки в тот charset, что указан в методе getCharacterEncoding() и getLocale().

public void setContentLength(int len)

Методом setContentLength устанавливается значение поля HTTP заголовка «Content-Length»

public void setContentType(String type)

Метод setContentType используется для отправки MIME типа содержимого документа. Поле HTTP заголовка «Content-Type».

Поток вывода данных является буфферизованным. Это означает, что порция данных будет выдана клиенту только после заполнения буфера.

public void setBufferSize(int size) public int getBufferSize() public void flushBuffer() throws java.io.IOException public void resetBuffer()

Приведенные выше 4 метода позволяют, соответственно, установить размер буффера отправки, получить его размер, инициализировать отправку содержимое буффера клиенту, не дожидаясь его заполнения, а так же очистить этот буффер от данных.

public boolean isCommitted()

Методом isCommitted можно получить флаг, начата ли уже отправка данных клиенту. Флаг будет положительным, если HTTP заголовок ответа был уже отправлен.

public void reset()

Если HTTP заголовок ещё не отправлен, то метод reset «сбрасывает» HTTP заголовок к значениям «по умолчанию».

Диаграммы JFreeChart в сервлетах

Графическая библиотека JFreeChart может быть использована в сервлетах для создания диаграмм и их отображения на страницах сайтов в виде изображений. Подробности описания и примеры использования JFreeChart в сервлетах представлены здесь.

Сервлет с графической библиотекой Chart.js

Скриптовая библиотека Chart.js позволяет создавать диаграммы с всплывающей подсказкой и анимационными эффектами на WEB-странице. Пример использования Chart.js в сервлетах представлен здесь.

JNI в сервлете

В ряде случаев может потребоваться использование JNI в WEB-приложении. Пример использования JNI в сервлетах представлен здесь.

JMS сообщения в сервлете

Сервлет может быть использован для обмена JMS сообщениями между приложениями. Пример использования сервлета для отправки и чтения JMS сообщений в контейнере JBoss представлен здесь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *