Что такое java servlet
Создание сервлетов для чайников. Пошаговое руководство
Когда начинающий разработчик сталкивается с сервлетами, ему бывает очень сложно понять, как он работает и от чего зависит эта работа. Всё потому, что все примеры и видеоуроки рассчитаны на людей, понимающих природу сервлетов и что за чем следует. Поэтому я решил написать руководство по созданию самых простых сервлетов. Возможно, эта статья кому-нибудь поможет.
Предположим, что Вы уже где-то скачали пример с применением maven и Вам удалось задеплоить Ваш код на Tomcat (с этого обычно начинается познание сервлетов) любым способом (WAR-архивом или прямо из среды разработки). Вы имеете структуру приложения, в которой присутствует файл web.xml. C него и надо начинать создание страниц.
Первое и самое важное: машина не видит прямой связи между куском адресной строки и одноимённой страницей в Вашем проекте. localhost:8080/имя_WAR/test и test.jsp — не одно и то же. /test — это «url-метка» сервлета. По которой машина находит нужный Java-файл и тот уже указывает на test.jsp.
Путь от чтения кода машиной и до отображения страницы в браузере выглядит так:
Да, пока ничего не понятно, но мы ещё вернёмся к этой схеме. Если описать её простыми человеческими словами, то это будет выглядеть так:
Из файла web.xml через сервлет машина получает путь к Java-классу, который, в свою очередь, направляет машину на искомую страницу.
Это было лирическое отступление, переходим к коду.
Итак, мы имеем задеплоенный на Tomcat проект, главная страница которого открывается по вызову localhost:8080/имя_WAR (если мы деплоили WAR-файл).
Открываем web.xml. Этот файл сканируется Tomcat’ом в первую очередь. Здесь мы и зададим начало пути. Вот код нашего web.xml:
Сервлет связывает ссылку из адресной строки и Java-класс. Java-класс, в нашем случае, открывает JSP-страницу. Сервлет состоит из 2 составляющих:
Класс надо унаследовать от HttpServlet и переопределить метод doGet(); В переопределённом методе мы пишем название строки, на которую будет осуществлён переход (в нашем случае, это «/test.jsp».
Теперь, когда пользователь допишет /test к изначальному адресу, выполнится алгоритм, описанный в начале статьи (помните, я обещал к ней вернуться?) и браузер покажет содержимое файла test.jsp. Также, можно, например, написать в стартовом файле (например, index.html) ссылку:
И произойдёт вышеописанная цепь событий, которая вызовет, в итоге, страницу test.jsp.
Надеюсь, эта статья поможет барахтающимся в поисках здравого смысла начинающим разработчикам написать первый сервлет, а уже в дальнейшем к этому пониманию постепенно будет присоединяться всё остальное (как это обычно бывает).
Что такое сервлет и зачем нужен портлет?
Интро
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 минут настроить сервер приложений, контейнер для портлетов и как отлаживаться на всем этом хозяйстве нажатием одной кнопки.
Часть 5. Сервлеты, Java servlet API. Пишем простое веб-приложение
Что такое сервлет
Что нужно для создания веб-приложения
Создаем первое веб-приложение
В pom.xml добавим зависимость javax.servlet-api и установим packaging war:
Класс простого сервлета:
Для запуска приложения нужно создать Tomcat-конфигурацию:
Далее указываем, какую версию Tomcat мы будем использовать, URL, по которому можно обращаться к серверу и порт. У тебя должно получиться примерно так:
Осталось указать артефакт (собранный проект в jar-архив), который развернется в контейнере. Можно нажать кнопку Fix и выбрать war exploded : это значит, что после пересборки проекта артефакт будет автоматически помещаться в контейнер сервлетов.
Зачем нам лишний текст? Удалим ненужное. Теперь адрес приложения у нас такой: http://localhost:8080.
Нажимаем ОК. Видим, что у нас появилась возможность запуска приложения:
Обращаемся к нему по адресу http://localhost:8080/hello, и получаем ожидаемый ответ — строку “Hello”!
Национальная библиотека им. Н. Э. Баумана
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 сервлета:
Сервлеты и JSP в Java
Web – это система интернет-серверов, которая поддерживает форматированные документы. Документы форматируются с использованием языка разметки, называемого HTML (HyperText Markup Language), который поддерживает ссылки на другие документы, такие как графические, аудио- и видеофайлы и т. д.
HTTP (протокол передачи гипертекста)
HTTP используется клиентами и серверами для общения в сети. Он считается протоколом без сохранения состояния, поскольку поддерживает только один запрос на соединение. С помощью HTTP клиенты подключаются к серверу для отправки одного запроса, а затем отключаются. И этот механизм позволяет большему количеству пользователей подключаться к данному серверу в течение определенного периода времени. Здесь клиент отправляет HTTP-запрос, а сервер отвечает клиенту с помощью HTML-страницы, используя HTTP.
Введение в сервлеты
Сервлет – это программный модуль Java на стороне сервера, который обрабатывает запросы клиентов и реализует интерфейс сервлета. Могут отвечать на любые запросы, и они обычно используются для расширения приложений, размещаемых на веб-серверах.
Жизненный цикл
Весь жизненный цикл сервлета управляется контейнером сервлета, который использует интерфейс javax.servlet.Servlet для понимания объекта сервлета и управления им.
Жизненный цикл сервлета проходит в основном четыре этапа:
Загрузка
Когда сервер запускается, контейнер сервлета развертывается и загружает все сервлеты.
Инициализация
Затем сервлет инициализируется путем вызова метода init(). Метод Servlet.init() вызывается контейнером Servlet для уведомления о том, что этот экземпляр Servlet успешно создан и готов к запуску.
Обработка запросов
Затем сервлет вызывает метод service() для обработки запроса клиента и вызывается для информирования сервлета о клиентских запросах.
Уничтожение
Наконец, сервлет завершается вызовом destroy(). Метод запускается только один раз за время существования сервлета и сообщает об окончании экземпляра сервлета.
Методы init() и destroy() вызываются только один раз. Наконец, сервлет – это сборщик мусора сборщиком мусора JVM. Итак, на этом завершается жизненный цикл сервлета.
Шаги по созданию
Чтобы создать сервлет, нам нужно выполнить несколько шагов по порядку. Они заключаются в следующем:
Теперь, основываясь на вышеописанных шагах, давайте создадим программу, чтобы лучше понять, как работает сервлет.
Для запуска программы сервлета у нас должен быть установлен и настроен сервер Apache Tomcat. Eclipse для Java EE предоставляет встроенный Apache Tomcat. Как только сервер настроен, вы можете начать с вашей программы. Следует отметить один важный момент – для любой программы сервлета вам нужно 3 файла – файл index.html, файл классов Java и файл web.xml. Самый первый шаг – создать динамический веб-проект, а затем продолжить.
Теперь давайте рассмотрим пример, в котором будем создавать простой сервлет входа в систему и отображать вывод в браузере.
Сначала создадим файл index.html.
Далее закодируем файл класса Java.
В приведенном выше коде установили условие – если имя пользователя и пароль равны edureka, только тогда он будет отображаться успешно вошли в систему, в противном случае вход будет отказано. После написания файла класса Java последний шаг – добавить сопоставления в файл web.xml. Давайте посмотрим, как это сделать.
Файл web.xml будет присутствовать в папке WEB-INF вашего веб-контента. Если его нет, вы можете щелкнуть по дескриптору развертывания и нажать «Создать заглушку дескриптора развертывания». Как только вы подготовите файл web.xml, нужно добавить в него сопоставления. Давайте посмотрим, как выполняется сопоставление на следующем примере:
Универсальные
Это независимый от протокола сервлет, который должен переопределять метод service() для обработки клиентского запроса. Метод service() принимает два аргумента: объект ServletRequest и объект ServletResponse. Работа объекта запроса состоит в том, чтобы информировать сервлет о запросе, сделанном клиентом, в то время как объект ответа возвращает ответ клиенту. GenericServlet является абстрактным классом, и у него есть только один абстрактный метод – service(). В этом вся концепция, когда мы создаем универсальный сервлет путем расширения класса GenericServlet, мы должны переопределить метод service().
Теперь давайте посмотрим, как создать и вызвать универсальный сервлет. Будем кодировать 3 файла, как показано ниже:
HTML-файл
Мы создаем файл HTML, который будет вызывать сервлет, как только нажмем на ссылку на веб-странице. Создайте этот файл в папке WebContent. Путь к этому файлу должен выглядеть следующим образом: WebContent / index.html
Файл класса Java
Здесь мы будем создавать универсальный сервлет, расширяя класс GenericServlet. При создании GenericServlet необходимо переопределить метод service(). Щелкните правой кнопкой мыши на папке src и создайте новый файл класса и назовите файл как общий. Путь к файлу должен выглядеть следующим образом: Java Resouces / src / default package / generic.java
web.xml
Этот файл можно найти по этому пути. WebContent / WEB-INF / web.xml. В этом файле мы сопоставим сервлет с конкретным URL. Поскольку вызываем страницу приветствия после нажатия на ссылку в index.html, она отобразит страницу приветствия в класс Servlet, который уже создали выше.
После этого запустите сервер Tomcat и запустите сервлет. Вы получите желаемый результат. Так что это все о универсальных сервлетов. Теперь давайте двигаться дальше и понять концепцию отслеживания сеансов.
Отслеживание сеансов
Сессия просто означает определенный интервал времени. Отслеживание сеанса – это метод поддержания состояния (данных) пользователя, также известный как управление сеансом в сервлете. Таким образом, каждый раз, когда пользователь запрашивает сервер, сервер обрабатывает запрос как новый запрос.
Чтобы распознать конкретного пользователя, нам нужно отслеживать сеанс.
Файлы cookie
Файл cookie – это небольшой фрагмент информации, который сохраняется между несколькими клиентскими запросами. Имеет имя, одно значение и дополнительные атрибуты, такие как комментарий, путь и квалификаторы домена, максимальный возраст и номер версии.
Как работает Cookie?
Поскольку это метод отслеживания сеансов, по умолчанию каждый запрос рассматривается как новый запрос.
Теперь, когда вы поняли, как работают файлы cookie, давайте рассмотрим небольшой пример, иллюстрирующий использование файлов cookie.
Давайте посмотрим пример создания файла cookie, добавления ответа и получения результатов.
Пример
Теперь давайте создадим простую HTML-форму для файлов cookie.
Теперь последний шаг – создать файл XML и добавить в него все сопоставления.
Теперь вы готовы к казни. Вы можете запустить код и получить желаемый результат. Вот как работает cookie.
Страницы сервера Java
JSP или Java Server Pages – это технология, которая используется для создания веб-приложений точно так же, как технология сервлетов. Это расширение Servlet – поскольку оно предоставляет больше функциональных возможностей, чем сервлет, такой как язык выражений, JSTL и т. Д. Страница JSP состоит из тегов HTML и тегов JSP. Страницы JSP легче поддерживать, чем сервлет, потому что мы можем разделить проектирование и разработку.
Элементы сценариев
Элементы сценариев предоставляют возможность вставлять Java-код в JSP. Существует три типа элементов сценариев:
Тег скриптлета
Используется для выполнения исходного кода Java в JSP.
В этом примере мы создали два файла index.html и welcome.jsp. Файл index.html получает имя пользователя от пользователя, а файл welcome.jsp печатает имя пользователя с приветственным сообщением. Теперь давайте посмотрим на код.
Тег выражения
Код, помещенный в тег выражения JSP, записывается в выходной поток ответа. Поэтому вам не нужно записывать out.print() для записи данных. Он в основном используется для печати значений переменной или метода.
Теперь давайте возьмем небольшой пример отображения текущего времени. Чтобы отобразить текущее время, мы использовали метод getTime() класса Calendar. GetTime() является методом экземпляра класса Calendar, поэтому мы вызвали его после получения экземпляра класса Calendar методом getInstance().
Тег объявления
Используется для объявления полей и методов. Код, написанный внутри тега объявления JSP, размещается вне метода service() автоматически сгенерированного сервлета. Так что он не получает память при каждом запросе.
В приведенном ниже примере тега объявления JSP мы определяем метод, который возвращает куб с заданным числом, и вызываем этот метод из тега выражения JSP. Но мы также можем использовать тег скриптлета JSP для вызова объявленного метода. Посмотрим как. Файл: index.jsp
Объекты запросов и ответов
Запрос JSP – это неявный объект типа HttpServletRequest, который создается для каждого запроса JSP веб-контейнером. Он может использоваться для получения информации запроса, такой как параметр, информация заголовка, удаленный адрес, имя сервера, порт сервера, тип содержимого, кодировка символов и т. Д. Он также может использоваться для установки, получения и удаления атрибутов из области запроса JSP.
Пример неявного объекта запроса JSP
Неявный объект ответа JSP
В JSP ответ является неявным объектом типа HttpServletResponse. Экземпляр HttpServletResponse создается веб-контейнером для каждого запроса JSP. Он может использоваться для добавления или манипулирования ответами, такими как перенаправление ответа на другой ресурс, ошибка отправки и т. д.
Пример ответа неявного объекта
1 комментарий к “Сервлеты и JSP в Java”
Понимаю все. Только что такое есть создать структуру каталогов? Какая она?