что такое java servlet

Что такое сервлет и зачем нужен портлет?

Интро

Servlet

Это класс, расширяющий HttpServlet, у которого есть два главных метода
void doGet(HttpServletRequest request, HttpServletResponse response)<>
void doPost(HttpServletRequest request, HttpServletResponse response)<>
Не секрет, что браузер может инициировать два вида запроса к серверу: пост (POST) и гет (GET).
Как вы уже догадались, первый метод сработает при запросе GET к сервлету, второй — при запросе POST.
Можно переопределить третий главный метод
void processRequest(HttpServletRequest request, HttpServletResponse response)<>
Он будет обрабатывать и геты и посты, приходящие к сервлету.

Если интересно, о картах и прочих вкусностях Java SE мы можем поговорить отдельно.
Значениями параметров реквеста могут быть только строки (String), которые можно привести к нужному типу. Очевидно, значение age лучше превратить в целое число (int или Integer).

Посмотрим на метод:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException <
response.setContentType(«text/html;charset=UTF-8»);
PrintWriter out = response.getWriter();
try <
out.println(«»);
out.println(«»);
out.println(«Servlet MyServlet»);
out.println(«»);
out.println(«»);
out.println(«

Servlet MyServlet at » + request.getContextPath () + «

«);
out.println(«»);
out.println(«»);
> finally <
out.close();
>
>

Берём респонс, пихаем в него html и отправляем пользователю.

Ремарка:
Спасибо zer0access за то, что поправил меня. Пройдя по ссылке java.sun.com/javaee/5/docs/api/javax/servlet/http/HttpServlet.html вы увидите, что есть ещё методы, кроме doGet и doPost.
Метод processRequest генерируется рядом IDE, например NetBeans 6.1 Делается это следующим образом:
/**
* Handles the HTTP GET method.
* param request servlet request
* param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException <
processRequest(request, response);
>

/**
* Handles the HTTP POST method.
* param request servlet request
* param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException <
processRequest(request, response);
>

т.е. описав метод processRequest, ваши doPost и doGet отработают единообразно. Если есть разница при вызове doPost или doGet, то использовать processRequest врядли придётся.
Метод service первым принимает запрос, после запрос переправляется нужному doXxx. В service можно сделать какие-то общие операции, например сделать запись в БД, что такой-то пользователь обратился к такому-то сервлету, затем запрос передается на обработку нужному методу сервлета.
zer0access, спасибо тебе.

Всем сервлеты хороши, но только один сервлет может быть на странице. Два сервлета не влезут — слишком важные персоны.
Как же быть, если очень хочется на одну страницу поместить сервлет-калькулятор и сервлет-переводчик?

Portlet

Очень просто — написать два портлета, один будет считать, второй — переводить. Два, три, много портлетов можно поселить на одной странице. Классический портлет в редакции Sun имеет три режима: view, edit, help. Первый — основной, его видит пользователь. В случае калькулятора, в режиме view (просмотр) будут доступны кнопки. В режиме edit (настройки), например, можно задавать тип калькулятора: обычный или научный, с синусами, косинусами и прочими мудрёными вещами. В режиме help (справка)? как вы уже догадались, будет справка по калькулятору.
Режимы view, edit, help отображаются при помощи jsp (java server pages). Они очень-очень похожи на php-страницы:

Вывод в столбик чисел от 1 до 10 включительно.

можно заменить на (как тут пхпшный код-то писать?) и разницы не будет (за исключением того, что Джава требует определения типов переменных).
С режимом view и help все понятно, а зачем нужен режим edit? Допустим, У нас на портале есть две группы пользователей: первая — бухгалтеры, вторая — мы с вами, программисты. Бухгалтерам достаточно обычного калькулятора, где есть +,-,*,/, а нам нужно складывать двоичные числа. В этом случае администратор портала для группы бухгалтеров настроит портлет, как обычный калькулятор, а для нашей группы, как научный.

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

Источник

Как создать Servlet? Полное руководство

Если вы решили создать web проект на Java EE, то вам не обойтись без Servlet-ов. В этом уроке я продемонстрирую работу с Servlets, а также расскажу о их особенностях.

Шаг 0. Введение

Servlet – в первую очередь это простой Java интерфейс, реализация которого расширяет функциональные возможности сервера.

Сервлет взаимодействует с клиентами посредством принципа запрос-ответ. Хотя сервлеты могут обслуживать любые запросы, они обычно используются для расширения веб-серверов. Для таких приложений технология Java Servlet определяет HTTP-специфичные сервлет классы.

Шаг 1. Создание и конфигурирование проекта

Заходим в нами всеми любимую IDE Intellij IDEA и создаем Maven Project. Структура проекта простая и не сложная, один класс и стандартная структура Maven проекта.

Теперь откройте pom.xml и добавьте туда зависимость, которая позволит нам использовать Servlet-ы.

Обратите внимание, что мы используем Servlet версии 3.1 они присутствуют в Java EE7.

Шаг 2. Создание сервлета

Теперь создаем класс MainServlet.java как показано на скриншоте структуры выше, дальше наследуем его от HttpServlet и переопределяем два метода void doGet(…) и void doPost(…):

Теперь разберем что да как. Как вы уже заметили мы унаследовались от HttpServlet это абстрактный класс GenericServlet который в свою очередь реализует интерфейс Servlet.

HttpServlet предназначен для написания сервлетов по типу общения клиент-сервер, а именно используя HTTP протокол.

Вспоминаем что такое HTTP протокол. Wiki говорит следующее:

HTTP (HyperText Transfer Protocol — «протокол передачи гипертекста») — протокол прикладного уровня передачи данных (изначально — в виде гипертекстовых документов в формате HTML, в настоящий момент используется для передачи произвольных данных).

Читайте также:  что делать если одолели тараканы

Известно, что HTTP протокол имеет 7 методов передачи данных:

– DELETE
– HEAD
– GET
– OPTIONS
– POST
– PUT
– TRACE

Но только два из них пользуются особой популярностью, а именно GET и POST. Метод GET вызвать легко, достаточно ввести в браузере ссылку и перейти по ней, а вот POST не так просто выполнить, один из простых способов используя form тег указать ему action. Но нам все это не потребуется.

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

Но чаще всего используются методы GET и POST. Именно их мы и разберем на примере.

Шаг 3. Hello World Servlet

Для того чтобы создать наш первый Hello World нам нужно реализовать метод doGet:

Разберем пример. Как видите метод doGet принимает два параметра:

HttpServletRequest req – это запрос, который пришел к сервлету;

HttpServletResponse resp – это ответ который даст сервлет.

Теперь создаем папку src/main/webapp/WEB-INF, а там создаем файл web.xml в этом файле мы зарегистрируем наш сервлет и замапим его на URL.

Вот содержимое web.xml:

Мы описали два тега servlet и servlet-mapping и которые и заставят наш сервлет показаться в браузере по URL – /

В строке 8 мы указываем имя сервлета (оно может быть любое) это имя является идентификатором, и должно быть уникальным.

В строке 9 мы указываем полный пакетный путь к севрлету. После чего мы можем к нему обращаться по его name (идентификатору).

В строке 13 мы указываем имя сервлета (идентификатор) который хотим замапить на определенный URL.

Строка 14 говорит на какой URL мапить сервлет. Так как у нас стоит / – это значит что зайдя в корень проекта http://localhost:8080/servletexam/ мы получим сервлет, а именно то что в методе doGet.

Теперь собираем проект:

Теперь запускаем, как это сделать рассказано тут Intellij IDEA деплой на Tomcat.

После запуска перейдите по ссылке http://localhost:8080/servletexam/. Вы увидите следующее:

Дальше мы рассмотрим более правильный способ использования Servlets в веб-проектах.

Шаг 4. Используем JSP

Не совсем красиво выводить все HTML теги по средством response. Поэтому давайте прикрутим к сервлету jsp страничку.

Для этого создаем mypage.jsp в webapp:

И содержимое этого файла:

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

Дальше редактируем метод doGet в нашем MainServlet:

В 15-й строке мы с запроса получаем Request Dispatcher (Диспетчер Запросов) и указываем ему jsp страницу которая будет отображаться при обращении к данному методуGET. Метод forward(req, resp) перенаправляет наш запрос на jsp страницу.

Теперь если пересобрать приложение Maven-ом и запустить, то получим уже вывод на страницу в браузере содержимого mypage.jsp.

Шаг 5. Передаем данные с Servlet на JSP

Для того чтобы передать какие либо дынные на JSP нам нужно в сервлете в request добавить атрибут.

Чтобы добавить атрибут в request нужно вызвать метод setAttribute(String key, Object value), где

key – это ключ по которому вы получите доступ к данным на JSP;

value – данные которые мы передаем.

Как видите в строке 15 я передаю имя с ключем (name) и значением (Devcolibri).

Теперь чтобы принять эти данные на JSP нужно обратится к ключу по определенной конструкции $<key>

Давайте на нашей mypage.jsp примем данные с сервлета:

Теперь пересобираем проект с помощью Maven и запускаем. Мы увидим следующий результат:

Вот видим результат, где вместо World выводится Devcolibri.

Шаг 6. Улучшаем сервлет и удаляем web.xml

Согласитесь не совсем удобно регистрировать наш сервлет в web.xml, особенно если у нас будет не один-два сервлета, а 100+, тогда это будет неудобно 🙂 Но в этом есть и плюс, когда все сервлеты зарегистрированы в одном месте, а именно web. xml мы можем удобно их перемапить на другой URL.

Я больше предпочитаю способ регистрации сервлетов, который опишу ниже.

Для начало проаннотируем сервлет аннотацией @WebServlet:

Данная аннотация регистрирует сервлет в контексте приложения, это тоже самое что мы делали в web.xml:

Аннотация принимает как параметр строку, именно эта строка соответствует тегу url-pattern, тоесть это URL по которому будет доступен сервлет.

Вы возможно зададите вопрос, – Зачем тогда этот web.xml? В нашем случае он уже не надо, поэтому смело его удаляем вместе с папкой WEB-INF.

Но если на этом этапе собрать проект и задеплоить, то он у нас не задеплоится, и будет ругаться на отсутствие web.xml. Для того чтобы это исправить идем в pom.xml и в maven-war-plugin добавляем свойство которое делает не обязательным web.xml:

Именно этот Maven плагин отвечает за сборку war архива, который мы потом деплоим на сервер приложений.

Конечная структура проекта выглядит так:

Теперь пересобираем проект вызвав в Maven фазу Install и деплоим на сервер приложений. Напоминаю как это делать со студии Intellij IDEA можно глянуть тут. И мы получим тот же результат, но без лишних файлов и с аннотацией:

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

Также читайте серию статей «Spring Data JPA. Работа с БД»: часть 1, часть 2 и часть 3

Источник

Читайте также:  можно ли содержать ужа в домашних условиях

Сервлет в вопросах и ответах

Что такое сервлет?

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

Контейнер сервлетов

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

Самые распространенные реализации контейнеров сервлетов : Apache Tomcat, GlassFish, Jetty, JBoss, IBM WebSphere, Oracle Weblogic.

GenericServlet и HttpServlet

Java Servlet API, кроме собственно интерфейсов, также содержит несколько классов сервлетов, которые могут служить основой. Базовым для всех этих классов является абстрактный класс javax.servlet.GenericServlet.

Как видно из определения класс GenericServlet включает все методы интерфейсов Servlet и ServletConfig. Не реализованным методом остается лишь абстрактный метод service. Метод service вызывается при каждом обращении к сервлету.

Пример сервлета First, наследующего свойства GenericServlet

Класс javax.servlet.http.HttpServlet наследует свойства GenericServlet.

HttpServlet предоставляет ещё больше удобств для программиста и имеет много полезных методов :

Интерфейсы ServletRequest и HttpServletRequest

Запрос от браузера поступает серверу в виде объекта типа HttpServletRequest. Этот интерфейс наследует свойства интерфейса ServletRequest. Методы интерфейса ServletRequest позволяют получать дополнительную информацию, в том числе и о сервлете и деталях протокола HTTP запроса :

При вызове сервлета (обращении к серверу), как правило, передаются параметры и их значения. Для разбора параметров и извлечения их значений применяются методы, описанные на странице Класс HttpServlet.

Интерфейсы ServletResponse и HttpServletResponse

Интерфейс ServletResponse предназначен для формирования и отправки данных клиенту. Все методы ServletResponse инструмента служат именно этой цели. Следующие методы позволяют получить ссылки на потоки вывода :

Если метод getOutputStream() уже был вызван для этого ответа, то генерируется IllegalStateException.

Интерфейс HttpServletResponse наследует интерфейс ServletResponse и включает еще несколько полезных методов, которые описаны на странице Класс HttpServlet. На этой же странице представлен пример использования HttpServletResponse для формирования ответа клиенту.

Запуск сервлета

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

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

Сервлетный фильтр

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

Сервлетный фильтр должен реализовывать интерфейс javax.servlet.Filter, который определяет три метода :

В методе init() настраивается конфигурация фильтра. Метод doFilter выполняет основные функции фильтра. Контейнер сервлетов вызывает init() один раз, чтобы подготовить фильтр к работе, и вызывает doFilter() при поступлении запросов пользователя/браузера, которые фильтр должен перехватить. После того, как приложение заканчивает свою работу, вызывается метод destroy().

Сервлетный фильтр можно использовать для :

Сервлетный фильтр подключается в дескрипторе приложения web.xml. В следующем листинге определяется сервлетный фильтр hello, который может быть вызван при прямом обращении к нему. Пример использования данного фильтра можно посмотреть на странице Пример сервлета, hello!

Сервлетный фильтр может быть сконфигурирован так, что он будет работать с одним сервлетом, группой сервлетов или с определенной группой страниц. В следующем листинге дискриптора приложения web.xml фильтр FilterName подключается к сервлету ServletName и к страницам *.html.

Конфигурация сервлета, ServletConfig

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

В следующем листинге в методе инициализации init в консоль выводятся параметры name и mname, определенные в дескрипторе приложения (см. пример выше).

Контекст сервлета, ServletContext

Для доступа из сервлета к параметрам WEB-приложения необходимо использовать интерфейс javax.servlet.ServletContext. Объект ServletContext является уникальным и доступен всем сервлетам.

ServletContext позволяет получить доступ к параметрам WEB-приложения, определенным в дескрипторе web.xml тегом :

Объект ServletContext можно получить с помощью метода getServletContext() интерфейса ServletConfig.

Интерфейс ServletContext определяет доступ к следующим функциям для работы с аттрибутами :

Роль аттрибутов может выполнять объект любого класса. Цель данных функций связана с пересылкой между несвязанными друг с другом сервлетами разных объектов.

Отличия ServletConfig и ServletContext

Интерфейс RequestDispatcher

Интерфейс RequestDispatcher используется для работы с дополнительными ресурсами, к которым относятся другой сервлет, страница JSP или документ HTML. Как правило, данный интерфейс используется для внутренней коммуникации между сервлетами в одном контексте. Доступ к RequestDispatcher можно получить с помощью метода getRequestDispatcher(String url) интерфейса ServletContext.

RequestDispatcher реализует два метода :

Отличия методов forward() и sendRedirect()

Метод forward() интерфейса RequestDispatcher используется для передачи запроса другому ресурсу внутри сервлета. То есть действие выполняется в один шаг. Метод sendRedirect() интерфейса ServletResponse является двухшаговым. В этом методе WEB-приложение возвращает ответ клиенту со статусом кода 302 (redirect) и с ссылкой для отправки запроса. Браузер отправляет полностью новый запрос по полученной ссылке. То есть, forward() обрабатывается внутри контейнера, а sendRedirect() обрабатывается в браузере.

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

При использовании метода forward() адрес URL в строке остается прежним, т.к. браузер не знает о фактически обрабатываемом ресурсе. В методе sendRedirect() адрес URL изменяется на пробрасываемый ресурс.

Читайте также:  что такое anas barbariaelium

Пример использования методов forward() и sendRedirect() в сервлете представлен здесь.

Источник

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Сервлет (Java)

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

Работу сервлета можно описать следующим образом:

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

Сервлеты это модули расширения для запрос-ответ ориентированных серверов, таких как web-сервера с поддержкой Java. Например, сервлет ответственный за передачу информации из HTML форм для обновления базы данных компании.

Сервлет для сервера то же самое, что апплет для броузера. Но в отличие от апплета сервлеты не имеют графического интерфейса.

Сервлеты могут быть встроены в различные сервера, потому как интерфейс, который используется для написания сервлетов, не знает ничего о среде сервера или протоколе. Сервлеты становятся одними из самых распространенных среди HTTP-серверов; много web-серверов поддерживают интерфейс сервлетов.

Поскольку сервлеты предоставляют великолепное решение для программной поддержки на стороне сервера, они являются одним из наиболее популярных причин перехода на Java. Не только потому, что они предоставляют рабочую среду, которая заменяет CGI программирование, но весь ваш код приобретает портируемость между платформами, получаемую от использования Java, и вы приобретаете доступ ко всему Java API (за исключением, конечно, того, которое производит GUI, такого, как Swing).

Содержание

Общая информация

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

Основная ответственность метода service( ) состоит во взаимодействии с HTTP запросом, который посылает клиент, и в построении HTTP ответа, основываясь на атрибутах, содержащихся в запросе. ServletsRule манипулирует только объектом ответа, не обращая внимания на то, что посылает клиент.

Когда вы запустите программу, вы увидите, что значение i сохраняется между запросами к сервлету. Это важное свойство сервлетов: так как только один сервлет определенного класса загружается в контейнер, и он никогда не выгружается (до тех пор, пока контейнер не завершит свою работу, что обычно случается только при перезагрузке серверного компьютера), любые поля сервлета этого класса действительно становятся постоянными объектами. Это значит, что вы можете без усилий сохранять значения между запросами к сервлету, в то время, как в CGI вы должны записывать значения на диск, чтобы сохранить их, что требует большого количества дурацкого окружения для правильного их получения, а в результате получаем не кроссплатформенное решение.

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

Сервлеты и многопоточность (multithreading)

Обработка сессий с помощью сервлетов

HTTP является сессионным протоколом, так что вы не можете общаться из одного обращения к серверу с другим обращением, не зависимо от того, одна и та же персона опрашивает ваш сайт, или это полностью разные персоны. Большое усилие было вложено в механизм, который позволяет Web-разработчику отслеживать сессии. Компании не смогли бы заниматься электронной коммерцией без отслеживания клиента и элементов, которые он положил в свою корзину покупок, например.

Есть несколько методов отслеживания сессии, но наиболее общим методом состоит в постоянстве «cookies», которые являются внутренней частью стандарта Интернет. HTTP Working Group of the Internet Engineering Task Force вписала cookies в официальный стандарт RFC 2109.

Cookie

API сервлета (версия 2.0 и следующие) обеспечивают класс Cookie. Этот класс встроен во все детали HTTP заголовков и позволяет устанавливать различные атрибуты cookie. Использование cookie достаточно просто: необходимо позаботиться о добавлении его в объект ответа. Конструктор принимает имя cookie в качестве первого аргумента и значение в качестве второго. Cookie добавляются в объект ответа прежде, чем вы посылаете какое либо содержимое.

Затем вы можете вызвать getValue( ) для каждого cookie, чтобы получить стоку содержимого cookie. В приведенном выше примере метод getValue («TIJava») произведет строку, содержащую «2002».

Класс Session

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

Класс Session API сервлета использует класс Cookie, чтобы выполнить эту работу. Однако все объекты Session нуждаются в уникальном идентификаторе определенного рода, хранящемся у клиента и передающемся на сервер. Web-сайты могут также использовать другие типы отслеживания сессии, но этот механизм будет более сложным для реализации, так как он не встроен в API сервлета (то есть, вы должны написать его руками, обработав ситуации, когда клиент отключает cookies).

Вот пример, который реализует отслеживание сессии с помощью API сервлета:

Источник

Строительный портал