Статьи

Основы о сервлетах

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

Понимание моделей сервлетов Java

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

В основном, веб-приложения должны быть приложениями, размещенными где-то в сети, и к ним можно получить доступ через сеть. Если вам нужна дополнительная информация и более точное определение «Что такое веб-приложение», вы можете перейти по следующей ссылке: Веб-приложение .

Если мы хотим создать веб-приложение, у нас должен быть веб-сервер, это может быть HTTP-сервер любого типа с включенным веб-контейнером, такой как Tomcat. HTTP-сервер взимает плату за обработку клиентских запросов, безопасность, обслуживание контента для клиента и т. Д., Но HTTP-сервер не может динамически создавать ответ клиенту, он может обслуживать статический контент. Решением этой проблемы является веб-контейнер. Контейнер может размещать веб-приложение, HTTP-сервер передает запрос веб-контейнеру, который позаботится о запросе. Обычно на сервере есть только один контейнер. И все веб-приложения на сервере обслуживаются этим контейнером.

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

Структура приложения войны

По спецификации Java веб-приложение упаковано в пакет war.
Пакет War аналогичен пакету jar, но когда веб-контейнер найдет файл war в папке deploy, он будет считать, что это веб-приложение, и попытается запустить его.

Внутри пакета war у нас есть один специальный каталог, который называется WEB-INF.

Содержимое этой папки напрямую не передается пользователю. Эта папка содержит папки классов и lib, в которые мы можем поместить класс, используемый приложением (папка классов) и дополнительные файлы jar (папка lib). Содержимое этих папок будет автоматически прочитано загрузчиком классов без каких-либо дополнительных настроек пути к классам. Также эта папка содержит файл web.xml, который называется описанием развертывания. Этот файл не требуется, если веб-приложение содержит только страницы jsp, но если приложению нужны сервлеты или фильтры, этот файл должен быть определен.

Жизненный цикл сервлета

За время своего существования сервлет проходит пять жизненных циклов:

  • погрузка
  • конкретизации
  • инициализация
  • порция
  • разрушающий

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

После загрузки веб-контейнер попытается создать экземпляр класса (т.е. создать новый экземпляр класса). Обычно каждый веб-компонент создается только один раз, но это зависит от поведения веб-контейнера, в некоторых случаях веб-контейнер можно настроить для создания большего количества экземпляров класса компонента в пуле и для обслуживания запроса одним из экземпляров из пула. Когда веб-контейнер создает новый экземпляр сервлета, он использует конструктор по умолчанию.
Инициализация — это фаза жизненного цикла, на которой инициализируется сервлет. На этом этапе предполагается, что сервлет читает некоторые значения и выполняет некоторые дополнительные действия и шаги, прежде чем сервлет сможет обслуживать клиентский запрос.
Фаза обслуживания — это цикл в жизни сервлета, в котором сервлет, обслуживающий клиентов, запрашивает.
Фаза уничтожения — это последняя фаза в жизни сервлета, и это происходит, когда сервлет удален из службы.

Интерфейс сервлета

Если мы хотим создать сервлет, все, что нужно сделать, это реализовать интерфейс сервлета.
Этот интерфейс предоставляет следующие три метода, которые вызываются контейнером:

  • init (ServletConfig config), вызывается во время инициализации
  • сервис (запрос ServletRequest, ответ ServletResponse), вызываемый во время обслуживания запроса
  • destroy (), вызывается при удалении сервлета из службы.

Также этот интерфейс обеспечивает два вспомогательных
методы:

  • ServletConfig getServletConfig ()
  • Строка getServletInfo ()

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

Также во время метода обслуживания можно получить ServletException или UnavailableException. Это исключение может быть временным или постоянным. В случае временного исключения сервер на некоторое время заблокирует вызов метода сервиса, но в случае постоянного исключения будет вызван метод destroy, и сервлет будет готов к сборщику мусора, и каждый последующий вызов этого сервлета приведет к ответу 404.

GenericServlet Class

Класс GenericServlet является частью пакета javax.servlet. Это абстрактный класс, который реализует интерфейс Servlet и создает базовую реализацию, которая не зависит от платформы.
Этот класс вводит один новый метод:

  • init (), вызывается методом init (ServletConfig config) во время фазы инициализации
  • ServletContext getServletContext (), предоставить доступ к ServletContex
  • String getInitParameter (String name), получить значение параметра конфигурации сервлета, определенного в дескрипторе приложения для указанного имени
  • Перечисление getInitParameterNames (), возвращает перечисление всех параметров инициализации сервлета.
  • Строка getServletName (), возвращает имя сервлета.

Если мы расширяем класс GenericServlet вместо реализации интерфейса Servlet, то единственное, что нам нужно сделать, — это реализовать метод сервиса, все остальные методы уже реализованы абстрактным классом.

Класс HttpServlet

Это также абстрактный класс, такой как GenericServlet, но этот класс не зависит от платформы. Он связан с протоколом HTML и вводит новый метод, который относится только к протоколу HTTP. Каждый из этих новых методов отвечает за обработку клиентского запроса для определенного метода HTTP.
Методы doXxx:

  • doGet (запрос HttpServletRequest, ответ HttpServletResponse), обработать запрос на получение
  • doPost (запрос HttpServletRequest, ответ HttpServletResponse), обрабатывать пост-запрос
  • doOptions (запрос HttpServletRequest, ответ HttpServletResponse), обрабатывает запрос параметров HTTP
  • doPut (запрос HttpServletRequest, ответ HttpServletResponse), обрабатывает HTTP-запрос на размещение
  • doDelete (запрос HttpServletRequest, ответ HttpServletResponse), обрабатывает запрос на удаление HTTP
  • doHead (запрос HttpServletRequest, ответ HttpServletResponse), обрабатывает запрос заголовка HTTP
  • doTrace (запрос HttpServletRequest, ответ HttpServletResponse), обрабатывает запрос трассировки HTTP.

ServletContext Интерфейс

Интерфейс ServletContext — это API, обеспечивающий доступ к информации о приложении. Каждое приложение выполняется внутри собственного контекста, поэтому этот интерфейс обеспечивает доступ к этой информации. Реализация этого интерфейса обеспечивается поставщиком сервера, и нас не должна интересовать конкретная реализация. Когда приложение развернуто, контейнер сначала создаст класс реализации ServletContext и заполнит его данными, предоставленными дескриптором приложения.
Методы внутри этого интерфейса мы можем разделить на несколько групп:

  1. Метод доступа к атрибуту контекста:
    • Объект getAttribute (String name), извлечение объекта из контекста
    • Перечисление getAttributeNames (), получение имен атрибутов
    • void removeAttribute (String name), удалить атрибут из контекста
    • void setAttribute (String name, Object value), добавить новый объект в контекст и связать его по указанному имени. Если объект с указанным именем уже существует, он будет отменен.
  2. Методы получения контекстной информации:
    • Строка getServletContextName (), получить значение, определенное <display-name> в дескрипторе приложения, если не существует, получить нуль.
    • String getRealPath (String path), относительный контекстный путь указанного ресурса, null, если приложение развернуто как WAR (если оно не взорвано в папке).
    • Установите getResourcesPaths (String path), получить файлы внутри указанного частичного пути, только один уровень
    • ServletContext getContext (String appURL), получить ServletContex другого приложения, развернутого на том же сервере. URL должен начинаться с ‘/’
  3. Методы доступа к статическим ресурсам:
    • URL getResource (String path), получить URL ресурса, указанного путем. Путь должен начинаться с ‘/’
    • InputStream getResourceAsStream (String path), получить InputStream указанного ресурса. Путь может быть контекстным.
    • String getMimeType (String path), возвращает тип ресурса mie.
  4. Способы получения запроса диспетчером:
    • RequestDispatcher getRequestDispatcher (String path), возвращает RequestDispatcher для указанного ресурса или ноль, если ресурс не существует.
    • RequestDispatcher getNamedDispatcher (String name), возвращает RequestDispatcher для именованного ресурса внутри дескриптора развертывания.
  5. Методы доступа к параметрам инициализации контекста:
    • String getInitParameter (String name), получить значение для указанного параметра, определенного в дескрипторе развертывания, или null, если он не существует.
    • Перечисление getInitParameterNames (), список имен параметров, определенных в дескрипторе развертывания приложений.

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

Интерфейс ServletConfig

Это API, который предоставляет методы для доступа к информации, определенной внутри дескриптора развертывания. бетон
объект создается контейнером сервлета и передается сервлету на этапе инициализации. Этот интерфейс определяет следующие методы:

  • String getInitParameter (String name), получить значение параметра init, определенного для сервлета с указанным именем, или null, если такого параметра нет.
  • Перечисление getInitParameterNames (), получение списка имен параметров инициализации сервлета.
  • ServletContext getServletContext (), получить контекст сервлета.
  • Строка getServletName (), получить имя сервлета, указанное в web.xml

Как вы можете видеть, ServletConfig предоставляет только методы для чтения параметра init, и нет способа изменить или добавить новый параметр init, потому что они не могут быть изменены или добавлены.

Описание развертывания сервлетов

Если мы хотим использовать сервлеты, нам нужно определить их внутри дескриптора развертывания.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<servlet>
 
<description>This is a servlet</description>
 
<display-name>First Servlet</display-name>
 
<servlet-name>FirstServlet</servlet-name>
 
<class>ba.codecentric.scwcd.FirstServlet</class>
 
<init-param>
 
<param-name>firstParam</param-name>
 
<param-value>value</param-value>
 
</init-param>
 
</servlet>
 
<servlet-mapping>
 
<servlet-name>FirstServlet</servlet-name>
 
<uri-pattern>/FirstServlet</uti-pattern>
 
</servlet-mapping>

Внутри тегов сервлета мы определили сервлет, внутри тега сервлета мы можем использовать тег init param для определения параметров инициализации, которые будут отправлены сервлету на этапе инициализации как часть объекта ServletConfig.

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

Также в этом уроке я говорил о ServletContext и упоминал параметры контекста. Эти параметры также определяются в описании развертывания с использованием тега context param.

1
2
3
4
5
6
7
<context-param>
 
 <param-name>contextParameter</param-name>
 
 <param-value>value</param-value>
 
</context-param>

Ссылка: Основы о сервлетах от нашего партнера по JCG Игоря Маджерика в блоге Игоря Маджерика .