Что такое 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).

The Java EE 5 Tutorial

A servlet is a Java programming language class that is used to extend the capabilities of servers that host applications accessed by means of a request-response programming model. Although servlets can respond to any type of request, they are commonly used to extend the applications hosted by web servers. For such applications, Java Servlet technology defines HTTP-specific servlet classes.

The javax.servlet and javax.servlet.http packages provide interfaces and classes for writing servlets. All servlets must implement the Servlet interface, which defines life-cycle methods. When implementing a generic service, you can use or extend the GenericServlet class provided with the Java Servlet API. The HttpServlet class provides methods, such as doGet and doPost, for handling HTTP-specific services.

This chapter focuses on writing servlets that generate responses to HTTP requests.

Copyright © 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices

Сервлеты — 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 студентов

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

Сервлет

Сервлет — это специальный интерфейс в языке программирования 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 — выберите подходящую и сразу освойте ее.

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

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