Ваш путь постижения дзена JavaEE не сможет пройти мимо сервлетов Java и их контейнеров. И чем раньше вы разберётесь с тем, как они взаимодействуют – тем легче будет проходить погружение в более тяжеловесные фрэймворки. Предлагаю познакомиться с контейнером под названием Tomcat, посмотрим как он устанавливается, запускается и работает с приложениями, а заодно напишем маленький сервлет для демонстрации идеи их использования.
Tomcat реализует спецификацию сервлетов и является веб сервером. Он умеет «на лету» подхватывать приложения. Начнём с самого начала. А для этого нам его необходимо скачать. Apache предлагают версии сервера как для 32х, так и для 64-разрядных машин. Также можно выбрать для загрузки либо инсталлятор, ло архив с потрохами сервера. Мы выберем второй вариант и разворачивать будем в среде windows. Качаем архив и распаковываем его в папку, желательно поближе к корню диска(c:\Tomcat). Перед запуском необходимо прописать переменные среды CATALINA_HOME и JAVA_HOME. Для этого идём Панель управления->Система->->Дополнительные параметры системы
->Переменные среды
Создаёте новую системную переменную с именем CATALINA_HOME и указываете для неё путь куда вы распаковали tomcat(у меня c:\tomcat). Также, если у вас не было, аналогичным образом создаёте ещё одну переменную JAVA_HOME и указываете где у вас лежит JDK (например C:\ProgramFiles\Java\jdk1.8.0_05). После этого рекомендую перезагрузить систему, иначе tomcat может отказываться запускаться без каких либо видимых причин. После всех манипуляций открываете командную строку, переходите в каталог с tomcat в папку bin, там есть два файла, startup.bat и shutdown.bat. Первый включает, второй выключает наш сервер. Запускаете startup.bat, после чего в отдельном окне должен начаться запуск сервера.
Теперь идём в браузер и открываем адрес localhost:8080 Если всё нормально, вы увидите страницу tomcat’а, на которой есть ссылки на примеры простых сервлетов, туториалы и т.д.
Конфигурация сервера производится с помощью *.xml файлов, находящихся в папке conf в корневом каталоге tomcat. Подробная документация по каждому тэгу есть на сайте Apache. Итак, сервер работает, а что же дальше? Как ему скормить наши страницы?
В корне tomcat есть папка webapps, которая ждёт-не дождётся пока ей кто ни будь не закинет файл с расширением war. war файлы – это специальные, так называемые web archives. Архивы, которые содержат в себе определённую структуру папок и файлов, которая подходит tomcat’у для запуска. Но перед созданием первого рабочего сервлета давайте подключим к IDEA наш сервер. Для этого открываем настройки, находим ApplicationServers, нажимаем + и выбираем сервер Tomcat.
Указываем директории, если IDEсама их не прописала
Жмём ок, apply и создаём новый проект. Не забываем установить галочку WebApplication
Далее даём имя нашему проекту, пусть это будет TestWebProject и видим что IDE уже приготовила для нас необходимую иерархию папок и даже что то набросала в файлы web.xml и index.jsp Файл web.xml является дескриптором проекта, в нём находятся инструкции для сервера о том как правильно его разворачивать. Index.jsp по умолчанию стартовая страница проекта, давайте попробуем что-нибудь написать в неё и запустить.
Хорошо, а теперь давайте напишем наш первый сервлет, добавляющий жизни нашей пробной страничке. Создаём jsp страницу redirect, которая направляет запрос на наш будущий сервлет
Перед тегом <html> пишем <jsp:forward page=”/redirect”></jsp:forward>
Теперь нужно создать класс Redirect, который унаследовавшись от класса javax.servlet.http.HttpServlet и станет нашим сервлетом, в котором можно будет получать и отправлять HTTPзапросы
package info.javaway.web.servlets; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; import java.util.Random; public class Redirect extends HttpServlet{ private static int count = 0; private static int size = 0; private static Random rand = new Random(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { count++; size = rand.nextInt(10); Date date = new Date(); req.setAttribute("current_count", count); req.setAttribute("date", date.toString()); req.setAttribute("size", size); req.getRequestDispatcher("index.jsp").forward(req, resp); } }
В классе для демонстрации, используя метод setAttribute() класса HttpServletRequest добавляем в запрос счётчик обращений к странице(count), дату в текстовом формате и переменную size, которая при каждом обращении будет менять размер шрифта.
Следующим шагом необходимо в файле web.xml прописать так называемые servlet-mapping’и. Это необходимо для того, что бы контейнер «увидел» связь между строкой адреса браузера и страницами нашего проекта. Добавляем следующие строчки перед закрывающим тегом </web-app>
<servlet> <servlet-name>Redirect</servlet-name> <servlet-class>info.javaway.web.servlets.Redirect</servlet-class> </servlet> <servlet-mapping> <servlet-name>Redirect</servlet-name> <url-pattern>/redirect</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>redirect.jsp</welcome-file> </welcome-file-list>
<welcome-file-list> указывает стартовую страницу. Итого мы получили то что запрос приходит на redirect.jsp, от туда перенаправляется в наш сервлет Direct, где к нему добавляются атрибуты(там же можно получить и данные о запросе, протокол, заголовок и т.д.) и перенаправляется на index.jsp
Осталось только оформить вывод отображения. В файле index.jsp видно как с помощью тега <%=%> можно получить данные из запроса и встроить их в html.
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title></title> </head> <body> <div> <p> <table> <tr> <td><font size="<%=request.getAttribute("size")%>">посещений </font></td> <td><font size="<%=request.getAttribute("size")%>"><%=request.getAttribute("current_count")%></font></td> </tr> <tr> <td><font size="<%=request.getAttribute("size")%>">Дата</font></td> <td><font size="<%=request.getAttribute("size")%>"><%=request.getAttribute("date")%></font></td> </tr> </table> </p> </div> </body> </html>
Для демонстрации работы приложения осталось запустить проект и открыть localhost:8080/redirect в браузере. Мы видим что при каждом обновлении страницы информация на ней динамически обновляется.
Давайте теперь соберём проект средствами IDE(согласен – не кошерно. Но Maven будет в следующей статье). В результате получим TestWebProject_war exploded.war, переименуем его в TestWebProject.war и подложим в папку webapps, которую упоминали в начале. Теперь при старте Tomcat развернёт проект и при обращении по ссылке http://localhost:8080/testwebproject/ мы увидим что сервер отлично справляется с возложенной на него задачей. Можно в рантайме подсовывать ему приложения, он примерно раз в 30 секунд проверяет, не лежит ли чего свеженького в папке webapps.
Надеюсь что вы поняли основные концепции работы Tomcatс сервлетами java. Успехов в освоении!=)
Добрый день. Пытаюсь установить томкэт по этой инструкции. При запуске startup.bat что-то очень быстро мелькает в открывшемся окне и пропадает, так что я не успеваю прочитать. ХЗ, отработало оно как надо или нет. Но открыть после этого в браузере localhost:8080 не удается («Попытка соединения не удалась»). Можете подсказать, куда глянуть, что проверить?
Добрый день, извините что задержался с ответом… вы startup.bat запустите не двойным кликом, а из командной строки. Тогда ничего не закроется и вы сможете узнать что за ошибка. Возможно некорректно прописаны переменные окружения.
Спасибо большое, самый простой и понятный пример, который помог понять как работают сервлеты.
Рад что это кому-то пригодилось, спасибо!
Очень задним числом, но вдруг кому-то пригодится. Еще в проект нужно добавить библиотеку servlet-api.jar что идет с томкатом
Ну и где следующая статья про мавен и кошерную сборку?!?