Автор оригинала: Pankaj Kumar.
Добро пожаловать в учебник по сервлетам Java. В предыдущей статье мы узнали о веб-приложении Java и рассмотрели основные концепции веб-приложений, таких как Веб-сервер , Веб-клиент , HTTP и HTML , Веб-контейнер и как мы можем использовать Сервлеты и JSP для создания веб-приложения. Мы также создали наш первый сервлет и веб-приложение JSP и запустили его на сервере tomcat.
Учебник по сервлетам
Учебник по сервлету направлен на предоставление более подробной информации о сервлете java, основных интерфейсах в API сервлета Java, аннотациях сервлета 3.0, жизненном цикле сервлета, и в конце мы создадим простое приложение для примера сервлета входа.
- Учебник по сервлетам – Обзор
- Общий интерфейс шлюза (CGI)
- CGI против сервлета
- Иерархия API сервлетов
- Интерфейс Сервлета
- Интерфейс ServletConfig
- Интерфейс ServletContext
- Интерфейс ServletRequest
- Интерфейс ответа сервлету
- Интерфейс диспетчера запросов
- Класс GenericServlet
- Класс HttpServlet
- Атрибуты Сервлета
- Аннотации в сервлете 3
- Пример входа в сервлет Java
Учебник по сервлетам – Обзор
Сервлет-это управляемая сервером Java EE технология для создания веб-приложений на java. Пакеты
javax.servlet
иjavax.servlet.http
предоставляют интерфейсы и классы для написания наших собственных сервлетов.Все сервлеты должны реализовывать
javax.сервлет.Интерфейс Servlet
, который определяет методы жизненного цикла сервлета. При реализации универсальной службы мы можем расширить классGenericServlet
, предоставляемый API сервлетов Java. КлассHttpServlet
предоставляет методы, такие какdoGet()
иdoPost()
, для обработки служб, специфичных для HTTP.В большинстве случаев доступ к веб-приложениям осуществляется по протоколу HTTP, и именно поэтому мы в основном расширяем класс HttpServlet.
Общий интерфейс шлюза (CGI)
До внедрения Java Servlet API технология CGI использовалась для создания динамических веб – приложений. Технология CGI имеет множество недостатков, таких как создание отдельного процесса для каждого запроса, код, зависящий от платформы (C, C++), высокое использование памяти и низкая производительность.
CGI против сервлета
Технология сервлетов Java была внедрена для преодоления недостатков технологии CGI.
- Сервлеты обеспечивают лучшую производительность, чем CGI, с точки зрения времени обработки, использования памяти, поскольку сервлеты используют преимущества многопоточности, и для каждого запроса создается новый поток, что быстрее, чем загрузка, создание нового объекта для каждого запроса с помощью CGI.
- Сервлеты и независимо от платформы и системы, веб-приложение, разработанное с помощью сервлета, может быть запущено на любом стандартном веб-контейнере, таком как серверы Tomcat, JBoss, Glassfish, а также в операционных системах, таких как Windows, Linux, Unix, Solaris, Mac и т.д.
- Сервлеты надежны, потому что контейнер заботится о жизненном цикле сервлета, и нам не нужно беспокоиться об утечках памяти, безопасности, сборе мусора и т.д.
- Сервлеты можно обслуживать, а кривая обучения невелика, потому что все, о чем нам нужно позаботиться, – это бизнес-логика для нашего приложения.
Иерархия API сервлетов
javax.сервлет.Сервлет
является базовым интерфейсом API сервлета. Существуют некоторые другие интерфейсы и классы, о которых мы должны знать при работе с сервлетами. Также в спецификациях Servlet 3.0 API servlet ввел использование аннотаций, а не всю конфигурацию сервлета в дескрипторе развертывания. В этом разделе мы рассмотрим важные интерфейсы API сервлетов, классы и аннотации, которые мы будем использовать в дальнейшем при разработке нашего приложения. На приведенной ниже диаграмме показана иерархия API сервлетов.Интерфейс Сервлета
javax.сервлет.Сервлет
является базовым интерфейсом Java Servlet API . Интерфейс сервлета объявляет методы жизненного цикла сервлета. Для реализации этого интерфейса требуются все классы сервлетов. Методы, объявленные в этом интерфейсе, являются:- public abstract void init(ServletConfig paramServletConfig) вызывает исключение ServletException – Это очень важный метод, который вызывается контейнером сервлета для инициализации параметров сервлета и ServletConfig. Сервлет не готов обрабатывать запрос клиента до тех пор, пока метод init() не завершит выполнение. Этот метод вызывается только один раз в жизненном цикле сервлета и делает класс сервлета отличным от обычных объектов java. Мы можем расширить этот метод в наших классах сервлетов для инициализации ресурсов, таких как подключение к БД, подключение к сокету и т.д.
- общедоступный абстрактный ServletConfig getServletConfig() – Этот метод возвращает объект конфигурации сервлета, который содержит любые параметры инициализации и конфигурацию запуска для этого сервлета. Мы можем использовать этот метод для получения параметров инициализации сервлета, определенных в дескрипторе развертывания (web.xml) или через аннотацию в сервлете 3. Позже мы рассмотрим интерфейс ServletConfig.
- общедоступная абстрактная служба аннулирования(ServletRequest req, ServletResponse res) вызывает исключение ServletException, исключение IOException – Этот метод отвечает за обработку запроса клиента. Всякий раз, когда контейнер сервлета получает какой-либо запрос, он создает новый поток и выполняет метод
service ()
, передавая запрос и ответ в качестве аргумента. Сервлеты обычно выполняются в многопоточной среде, поэтому разработчик несет ответственность за обеспечение потокобезопасности общих ресурсов с помощью синхронизации . - общедоступная абстрактная строка getServletInfo() – Этот метод возвращает строку, содержащую информацию о сервлете, такую как его автор, версия и авторские права. Возвращаемая строка должна быть обычным текстом и не может содержать наценок.
- public abstract void destroy() – Этот метод можно вызвать только один раз в жизненном цикле сервлета и использовать для закрытия любых открытых ресурсов. Это похоже на метод finalize класса java.
Интерфейс ServletConfig
javax.сервлет.ServletConfig
используется для передачи информации о конфигурации сервлету. Каждый сервлет имеет свой собственный объект ServletConfig, и контейнер сервлета отвечает за создание экземпляра этого объекта. Мы можем предоставить параметры инициализации сервлета в web.xml файл или с помощьюWebInitParam
аннотации. Мы можем использовать метод getServletConfig() для получения объекта ServletConfig сервлета.Важными методами интерфейса ServletConfig являются:
- общедоступный абстрактный ServletContext getServletContext() – Этот метод возвращает объект ServletContext для сервлета. Мы рассмотрим интерфейс ServletContext в следующем разделе.
- публичное абстрактное перечисление<Строка> getInitParameterNames() – Этот метод возвращает перечисление<Строка> имени параметров инициализации, определенных для сервлета. Если параметры инициализации не определены, этот метод возвращает пустое перечисление.
- общедоступная абстрактная строка getInitParameter(строка paramString) – Этот метод можно использовать для получения определенного значения параметра инициализации по имени. Если параметр отсутствует с именем, он возвращает значение null.
Интерфейс ServletContext
javax.сервлет.Интерфейс ServletContext
предоставляет сервлету доступ к переменным веб-приложения. ServletContext является уникальным объектом и доступен для всех сервлетов в веб-приложении. Если мы хотим, чтобы некоторые параметры инициализации были доступны нескольким или всем сервлетам в веб-приложении, мы можем использовать объект ServletContext и определить параметры в web.xml используя <контекст-параметр> элемент. Мы можем получить объект ServletContext с помощью метода getServletContext() ServletConfig. Механизмы сервлетов также могут предоставлять объекты контекста, уникальные для группы сервлетов и привязанные к определенной части пространства имен URL-адресов хоста.Некоторые из важных методов ServletContext являются:
- общедоступный абстрактный ServletContext getContext(строка uripath) – Этот метод возвращает объект ServletContext для определенного uripath или null, если он недоступен или не виден сервлету.
- общедоступный абстрактный URL-адрес getResource(путь к строке) вызывает исключение MalformedURLException – Этот метод возвращает объект URL, позволяющий получить доступ к любому запрошенному ресурсу содержимого. Мы можем получить доступ к элементам, независимо от того, находятся ли они в локальной файловой системе, удаленной файловой системе, базе данных или на удаленном сетевом сайте, не зная конкретных деталей того, как получить ресурсы.
- общедоступный абстрактный входной поток getResourceAsStream(строковый путь) – Этот метод возвращает входной поток по заданному пути к ресурсу или нулю, если он не найден.
- общедоступный абстрактный RequestDispatcher getRequestDispatcher(строковый url – путь) – Этот метод в основном используется для получения ссылки на другой сервлет. После получения RequestDispatcher программист сервлета перенаправляет запрос целевому компоненту или включает в него содержимое.
- публичный абстрактный пустой журнал(строка msg) – Этот метод используется для записи заданной строки сообщения в файл журнала сервлета.
- общедоступный абстрактный объект getAttribute(имя строки) – Возвращает атрибут объекта для данного имени. Мы можем получить перечисление всех атрибутов, используя общедоступное абстрактное перечисление<Строка> getAttributeNames() метод.
- атрибут public abstract void setAttribute(строка paramString, объект paramObject) – Этот метод используется для задания атрибута с областью применения. Атрибут будет доступен всем другим сервлетам, имеющим доступ к этому ServletContext. Мы можем удалить атрибут, используя public abstract void removeAttribute(строка paramString) метод.
- Строка getInitParameter(имя строки) – Этот метод возвращает строковое значение для параметра init, определенного с именем в web.xml, возвращает значение null, если имя параметра не существует. Мы можем использовать Перечисление<Строка> getInitParameterNames() для получения перечисления всех имен параметров инициализации.
- логический параметр setInitParameter(Строка paramString1, Строка paramString2) – Мы можем использовать этот метод для задания параметров инициализации приложения.
Примечание : В идеале имя этого интерфейса должно быть ApplicationContext, потому что оно предназначено для приложения и не относится к какому-либо сервлету. Также не путайте его с контекстом сервлета, переданным в URL-адресе для доступа к веб-приложению.
Интерфейс ServletRequest
Интерфейс ServletRequest используется для предоставления информации о запросе клиента сервлету. Контейнер сервлета создает объект ServletRequest из запроса клиента и передает его методу servlet service() для обработки.
Некоторые из важных методов интерфейса ServletRequest являются:
- Объект getAttribute(имя строки) – Этот метод возвращает значение именованного атрибута как объект и значение null, если его нет. Мы можем использовать метод
getAttributeNames()
для получения перечисления имен атрибутов для запроса. Этот интерфейс также предоставляет методы для установки и удаления атрибутов. - String getParameter(имя строки) – Этот метод возвращает параметр запроса в виде строки. Мы можем использовать метод
getParameterNames()
для получения перечисления имен параметров для запроса. - Строка getServerName() – возвращает имя хоста сервера.
- int getServerPort() – возвращает номер порта сервера, на котором он прослушивается.
Дочерний интерфейс
ServletRequest
являетсяHttpServletRequest
, который содержит некоторые другие методы управления сеансами, файлы cookie и авторизацию запроса.- Объект getAttribute(имя строки) – Этот метод возвращает значение именованного атрибута как объект и значение null, если его нет. Мы можем использовать метод
Интерфейс ответа сервлету
Интерфейс ServletResponse используется сервлетом при отправке ответа клиенту. Контейнер сервлета создает объект ServletResponse и передает его методу servlet service (), а затем использует объект response для создания HTML-ответа для клиента.
Некоторые из важных методов в HttpServletResponse являются:
- аннулировать addCookie(Cookie cookie) – Используется для добавления cookie в ответ.
- void AddHeader(имя строки, строковое значение) – используется для добавления заголовка ответа с заданным именем и значением.
- Кодировка строк(java.lang.Строковый URL) – кодирует указанный URL-адрес, включая в него идентификатор сеанса, или, если кодировка не требуется, возвращает URL-адрес без изменений.
- Заголовок строки(имя строки) – возвращает значение для указанного заголовка или значение null, если этот заголовок не был задан.
- void sendRedirect(расположение строки) – используется для отправки временного ответа на перенаправление клиенту с использованием указанного URL-адреса расположения перенаправления.
- void setStatus(int sc) – используется для установки кода состояния для ответа.
Интерфейс диспетчера запросов
Интерфейс RequestDispatcher используется для пересылки запроса на другой ресурс, который может быть HTML, JSP или другим сервлетом в том же контексте. Мы также можем использовать это для включения содержимого другого ресурса в ответ. Этот интерфейс используется для связи сервлетов в том же контексте.
В этом интерфейсе определены два метода:
- недействительная пересылка(запрос ServletRequest, ответ ServletResponse) – перенаправляет запрос от сервлета на другой ресурс (сервлет, файл JSP или файл HTML) на сервере.
- void включает(запрос ServletRequest, ответ ServletResponse) – включает содержимое ресурса (сервлета, страницы JSP, HTML-файла) в ответ.
Мы можем получить RequestDispatcher в сервлете, используя ServletContext getRequestDispatcher(путь к строке) метод. Путь должен начинаться с/и интерпретироваться как относительно текущего корневого контекста.
Класс GenericServlet
GenericServlet-это абстрактный класс , реализующий сервлет, ServletConfig и сериализуемый интерфейс. GenericServlet обеспечивает реализацию по умолчанию всех методов жизненного цикла сервлета и методов ServletConfig и облегчает нашу жизнь.Когда мы расширяем этот класс, нам нужно переопределить только те методы, которые мы хотим, а с остальными мы можем работать с реализацией по умолчанию. Большинство методов, определенных в этом классе, предназначены только для легкого доступа к общим методам, определенным в интерфейсах Servlet и ServletConfig.
Одним из важных методов в классе GenericServlet является метод без аргумента init (), и мы должны переопределить этот метод в нашей программе сервлета, если нам нужно инициализировать некоторые ресурсы перед обработкой любого запроса от сервлета.
Класс HttpServlet
HttpServlet-это абстрактный класс, который расширяет GenericServlet и обеспечивает основу для создания веб-приложений на основе HTTP. Существуют методы, определенные для переопределения подклассами для различных методов HTTP.
- сделайте Get(), для запросов HTTP GET
- doPost(), для запросов HTTP POST
- doPut(), для HTTP-запросов PUT
- doDelete(), для HTTP-запросов на УДАЛЕНИЕ
Атрибуты Сервлета
Атрибуты сервлета используются для взаимодействия между сервлетами, мы можем устанавливать, получать и удалять атрибуты в веб-приложении. Существует три области для атрибутов сервлета – область запроса , область сеанса и область приложения .
ServletRequest , HttpSession и ServletContext интерфейсы предоставляют методы для получения/установки/удаления атрибутов из запроса, сеанса и области применения соответственно.
Атрибуты сервлета отличаются от параметров инициализации, определенных в web.xml для ServletConfig или ServletContext.
Аннотации в сервлете 3
До сервлета 3 все отображение сервлета и его параметры инициализации использовались для определения в web.xml, это было неудобно и более подвержено ошибкам, когда в приложении огромное количество сервлетов.
Сервлет 3 представил использование аннотаций java для определения сервлета, фильтра и прослушивателя сервлетов и параметров инициализации.
Некоторые из важных аннотаций сервлета являются:
- WebServlet – Мы можем использовать эту аннотацию с классами сервлетов для определения параметров инициализации, значения loadOnStartup, описания и шаблонов URL и т.д. По крайней мере один шаблон URL-адреса ДОЛЖЕН быть объявлен либо в атрибуте value, либо в атрибуте urlPattern аннотации, но не в обоих. Класс, в котором объявлена эта аннотация, ДОЛЖЕН расширять HttpServlet.
- WebInitParam – Эта аннотация используется для определения параметров инициализации для сервлета или фильтра, она содержит имя, пару значений, а также мы можем предоставить описание. Эту аннотацию можно использовать в веб-фильтре или аннотации веб-сервлета.
- WebFilter – Эта аннотация используется для объявления фильтра сервлета. Эта аннотация обрабатывается контейнером во время развертывания, класс фильтра, в котором она найдена, будет создан в соответствии с конфигурацией и применен к шаблонам URL, сервлетам и типам диспетчеризации. Аннотированный класс ДОЛЖЕН реализовывать javax.servlet.Интерфейс фильтра.
- WebListener – Аннотация, используемая для объявления прослушивателя для различных типов событий в данном контексте веб-приложения.
Примечание: Мы рассмотрим фильтры и прослушиватели сервлетов в будущих статьях, в этой статье мы сосредоточимся на изучении базовых интерфейсов и классов API сервлетов.
Пример входа в сервлет Java
Теперь мы готовы создать наш пример сервлета входа в систему, в этом примере я буду использовать простой HTML, JSP и сервлет, который будет проверять подлинность учетных данных пользователя. Мы также увидим использование параметров инициализации ServletContext, атрибутов, параметров инициализации ServletConfig и функции RequestDispatcher, включая() и использование функции sendRedirect ().
Наш окончательный Динамический веб-проект будет выглядеть так, как показано на рисунке ниже. Я использую Eclipse и Tomcat для приложения, процесс создания динамического веб-проекта представлен в Веб-приложениях Java учебник.
Вот наша HTML-страница входа в систему, мы поместим ее в список файлов приветствия в web.xml так что, когда мы запустим приложение, оно откроет страницу входа в систему.
Если вход в систему будет успешным, пользователю будет представлена новая страница JSP с сообщением об успешном входе в систему. Код страницы JSP выглядит так, как показано ниже.
Вот это web.xml файл дескриптора развертывания, в котором мы определили параметры инициализации servletcontext и страницу приветствия.
Вот наш последний класс сервлета для аутентификации учетных данных пользователя, обратите внимание на использование аннотаций для конфигурации сервлета и параметров инициализации ServletConfig.
Ниже на скриншотах показаны различные страницы нашего примера проекта сервлета, основанные на комбинациях паролей пользователей для успешного входа в систему и неудачных входов в систему.
Это все для руководства по сервлетам для начинающих, в следующем уроке мы рассмотрим Управление сеансами, фильтры сервлетов и прослушиватели.
Обновление: Ознакомьтесь со следующей статьей в серии, Управление сеансами в Java .