Установка и настройка Apache Tomcat
Apache Tomcat — opensource-проект, который реализует спецификацию контейнера сервлетов и спецификацию JavaServer Pages (JSP). Используется в качестве самостоятельного сервера веб-приложений, в качестве сервера контента в связке с веб-сервером Apache, а также в качестве контейнера сервлетов в серверах приложений JBoss и GlassFish.
В лабораторной работе предполагается установка и настройка Tomcat в качестве сервера веб-приложений под управлением ОС OpenSuSE 12.2.
Цель работы: Установить и произвести базовую настройку Apache Tomcat в качестве сервера веб-приложений.
Задания к работе
- Установить Java-окружение из пакета OpenJDK.
- Установить Tomcat.
- Запустить Tomcat и проверить его работу по адресу http://localhost:8080.
- Написать JSP-страницу test.jsp, выводящую произвольную строку.
- Написать сервлет test, выводящий произвольную строку.
- Написать стартовую страницу index.html, содержащую ссылки на страницу test.jsp и сервлет test.
Установка Java и Tomcat
1. Установка Java Development Kit (JDK)
Для работы Tomcat требуется установленное окружение для разработки Java-приложений (Java Development Kit, JDK). Проверить, какая версия установлена в системе можно, например, так:
aag@stilo:~> zypper se java | grep 'runtime' -i // фильтрация избыточной информации i | java-1_7_0-openjdk | Java runtime environment based on OpenJDK 7 and IcedTea 7 | пакет | java-1_7_0-openjdk | Java runtime environment based on OpenJDK 7 and IcedTea 7 | пакет с исходным кодом
В приведенном примере в системе установлена (символ i(nstalled)) версия 1.7 OpenJDK - свободного комплекта разработки, полностью совместимого с Sun (Oracle) JDK.
Если ни один из доступных пакетов не установлен, то его следует установить:
aag@stilo:~> zypper in java-1_7_0-openjdk* .... // процесс установки
Проверить результаты установки можно так, как было указано выше.
Узнать путь, где размещается среда исполнения Java можно из переменной окружения $JAVA_HOME:
aag@stilo:~> echo $JAVA_HOME /usr/lib64/jvm/jre
А узнать номер установленной (и используемой) версии JDK можно так:
aag@stilo:~> java -version java version "1.7.0_09" OpenJDK Runtime Environment (IcedTea7 2.3.3) (suse-3.16.1-x86_64) OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)
2. Установка Tomcat
Установка Tomcat и связанных с ним пакетов из репозитария производится обычным образом:
aag@stilo:~> zypper in tomcat* Чтение установленных пакетов... // aag: список сокращен и может отличаться от приведенного Будут установлены следующие НОВЫЕ пакеты: jakarta-commons-dbcp-tomcat jakarta-commons-pool-tomcat5 tomcat tomcat-admin-webapps tomcat-docs-webapp tomcat-servlet-3_0-api tomcat-webapps ... Полный размер загрузки: 7,2 M. После операции будет использовано дополнительно 43,6 M. Продолжить? [да/нет]:
После подтверждения, необходимые пакеты будут загружены и установлены. При этом, в системе будут созданы следующие подкаталоги (дефолтная установка в OpenSuSE 12.2, фактическое размещение зависит от дистрибутива и версии ОС и версии самого Tomcat):
- /usr/share/tomcat/bin: управляющие скрипты;
- /etc/tomcat/conf: конфигурационные файлы (server.xml, web.xml, context.xml, tomcat-users.xml);
- /usr/share/java/tomcat/lib: jar-файлы, используемые всеми расширениями Tomcat и веб-приложениями;
- /var/log/tomcat: log-файлы;
- /srv/tomcat/webapps: каталог, содержащий веб-приложения (сервлеты и JSP);
- /var/cache/tomcat/work: рабочий каталог Tomcat, который используется, в первую очередь, при преобразовании JSP-страниц в сервлеты;
- /var/cache/tomcat/temp: временные файлы.
В каталоге /usr/share/tomcat будут, также, размещены симлинки на указанные каталоги. Путь к основному каталогу Tomcat можно записать в переменную окружения $CATALINA_HOME (export CATALINA_HOME='/usr/share/tomcat/'
).
3. Запуск и остановка сервера
Если установка прошла успешно, то можно попробовать запустить Tomcat:
aag@stylo:~> $CATALINA_HOME/bin/catalina.sh start
Скрипт catalina.sh используется для ручного запуска и остановки сервера Tomcat. Для автоматического запуска можно использовать скрипт service (service tomcat start|stop|restart
), предварительно следует указать уровни запуска, на которых будет стартовать демон tomcat (см. chkconfig)
Catalina – название компонента Tomcat, реализующего непосредственно функции контейнера сервлетов. Это название использовалось в ранних версиях (до Tomcat5) для всего продукта. Другими компонентами в составе системы являются Coyote, который осуществляющий поддержку транспорта по протоколу HTTP 1.1 и Jasper, предназначенный для обработки JSP (анализа JSP-файлов и компиляции их в Java-код, который затем передается для обработки с помощью Catalina).
Работающий сервер веб-приложений будет ожидать входящие подключения на порт 8080. Это можно проверить, если в адресной строке браузера набрать http://localhost:8080 (рис. 1).
Рис. 1. Дефолтная стартовая страница сервера Apache Tomcat
Остановить Tomcat, запущенный вручную, можно так:
aag@stylo:~> $CATALINA_HOME/bin/catalina.sh stop
Настройка сервера Tomcat
Для настройки сервера Tomcat используются следующие конфигурационные XML-файлы, размещенные в каталоге $CATALINA_HOME/conf/:
- server.xml: Общие настройки сервера (порты, виртуальные хосты и проч.).
- web.xml: Параметры, общие для ВСЕХ веб-приложений на текущем сервере. Настройки отдельных веб-приложений задаются в их собственных файлах /WEB-INF/web.xml (здесь можно провести аналогию с использованием файла .htaccess в Apache).
- context.xml: Общие настройки управления контентом.
- tomcat-users.xml: Список пользователей и групп (ролей).
Внимание: Прежде чем вносить какие-либо изменения в эти файлы, стоит сделать их резервные копии. Также следует обращать внимание на комментарии, которыми снабжены эти файлы.
conf/server.xml - Изменение номера порта
По умолчанию Tomcat использует для приема входящих подключений TCP-порт 8080, а также порты 8009 и 8005:
aag@stilo:~> netstat -tuaev --numeric-ports | grep tomcat tcp 0 0 localhost:8005 *:* LISTEN tomcat 20539 tcp 0 0 *:8009 *:* LISTEN tomcat 20533 tcp 0 0 *:8080 *:* LISTEN tomcat 20524
Эти порты могут быть изменены на другие, не используемые другими сетевыми сервисами, путем их изменения в файле conf/server.xml. Чтобы, например, заставить Tomcat работать на порту 8081, нужно найти в файле conf/server.xml указанную ниже строку и поменять значение атрибута port на требуемое (8081), затем перезапустить сервер:
... <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> ...
Для developer-сервера можно использовать любой непривилегированный порт. Для production-сервера стоит использовать порт 80, который является стандартным для HTTP-серверов.
conf/web.xml - Включение листинга каталогов
Для установки отображения списка файлов в каталогах (листинга), нужно поменять значение атрибута listings с ложного (false) на истинное (true) в блоке настроек сервлета по умолчанию ("default"-servlet) в файле conf/web.xml. Это бывает полезным при разработке и отладке веб-приложений, но не рекомендуется использовать на production-сервере по соображениям безопасности.
... <!-- The default servlet for all web applications, that serves static --> <!-- resources. It processes all requests that are not mapped to other --> <!-- servlets with servlet mappings. --> <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ...
conf/context.xml - Установка автоматической перезагрузки страниц
Имеется возможность заставить Tomcat выполнять автоматическую перезагрузку после изменения кода. Нужно добавить атрибут reloadable со значением "true" в элемент <Context> файла conf/context.xml. Это весьма полезно в процессе разработки и отладки сервлетов, но, опять же, не рекомендуется в готовом продукте.
<Context reloadable="true"> ... </Context>
conf/tomcat-users.xml - Управление пользователями и ролями
Для управления пользователями, которые могут управлять сервером Tomcat, предназначен файл conf/tomcat-users.xml. Чтобы создать, например, пользователя manager, который сможет управлять веб-приложениями через графическую оболочку (предопределенная роль manager-gui), нужно добавить в этот файл запись вида:
<tomcat-users> <role rolename="manager-gui"/> <user username="manager" password="somepassword" roles="manager-gui"/> </tomcat-users>
Разработка и распространение веб-приложений под управлением Tomcat
Рассмотрим несколько примеров использования Tomcat для разработки веб-приложений на Java. Здесь мы не будем акцентировать внимание на коды программ как таковые, поскольку этому посвящена отдельная дисциплина — «Объектно-ориентированное программирование на языке Java».
Создание структуры каталогов и размещение веб-страниц
Все веб-приложения размещаются в каталоге webapps (/srv/tomcat/webapps). Каждое приложение размещается в собственном, одноименном, каталоге с определенной вложенной структурой (webapps/youappname/WEB-INF/classes). Для нового веб-приложения (например, myapp) эту структуру можно создать, например, так:
// WEB-INF - предопределенное и регистрозависимое имя каталога aag@stilo:~> sudo mkdir -p /srv/tomcat/webapps/myapp/WEB-INF/classes
Назначение созданных каталогов следующее:
- myapp: Корневой каталог веб-приложения. Здесь размещаются HTML-страницы и прочие ресурсы (таблицы стилей (CSS), изображения, клиентские скрипты (javascript), JSP и т.п.), доступные веб-клиентам.
- myapp/WEB-INF: Этот каталог, недоступный веб-пользователям, содержит описание веб-приложения и его параметры в файле web.xml.
- myapp/WEB-INF/classes: В этом каталоге размещаются все файлы Java-классов сервлетов.
Поместим в корневой каталог создаваемого веб-приложения файл index.html следующего содержания:
<!-- Сохранить как /srv/tomcat/webapps/myapp/index.html --> <html> <head> <meta charset="utf-8" /> <title>Static HTML sample</title> </head> <body> <h1>Здравствуй, мир!</h1> </body> </html>
После перезапуска сервера к создаваемому веб-приложению можно будет обратиться по адресу http://localhost:8080/myapp/(рис. 2).
Рис. 2. Отображение статических страниц
Java Server Pages
Java Server Pages (JSP) - динамические веб-страницы, содержащие, помимо HTML-разметки, инструкции на языке Java (подобно PHP или ASP). Такие ресурсы размещаются и используются так же, как и статические ресурсы. Пример JSP приведен в листинге 1, а результат на рис. 3.
Листинг 1. Пример разметки JSP
<!-- Сохранить как /srv/tomcat/webapps/myapp/hello.jsp --> <html> <head> <meta charset="utf-8" /> <title>JSP sample</title> </head> <body> <%= new String("<h1>Hello, world!</h1>") %> </body> </html>
Рис. 3. Вывод JSP-страниц
Примечание: Если при обращении к JSP-странице вы получаете сообщение об ошибке вида:
org.apache.jasper.JasperException: java.lang.IllegalStateException: No output folder....
,
это скорее всего означает, что каталог tomcat/work не доступен для записи. Используйте команду chmod -R a+w tomcat/work
для установки разрешений или chown
для смены владельца.
Сервлеты
Все сервлеты (серверные приложения на Java) размещаются в подкаталоге WEB-INF/classes/. Рассмотрим использование сервлетов на примере приложения, выводящего некоторую информацию о сервере (листинг 1).
Листинг 1. Исходный код Java-сервлета
// Сохранить как /srv/tomcat/webapps/myapp/WEB-INF/classes/MyServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MyServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // установить MIME-type и кодировку ответа response.setContentType("text/html; charset=UTF8"); PrintWriter out = response.getWriter(); // Отправка веб-страницы try { out.println("<html>"); out.println("<head><title>Servlet sample</title></head>"); out.println("<body>"); out.println("<p>Запрошенный ресурс: " + request.getRequestURI() + "</p>"); out.println("<p>Протокол: " + request.getProtocol() + "</p>"); out.println("<p>Адрес сервера: " + request.getRemoteAddr() + "</p>"); out.println("</body></html>"); } finally { out.close(); // Всегда закрывать Writer } } }
Следующий этап – компиляция. Это можно сделать из той среды разработки, которую вы используете (Eclipse, NetBeans, IntelliJ и т.п.) или из командной строки. В случае использования openJDK и Tomcat 7 это будет выглядеть примерно так:
aag@stylo:~> javac -classpath /usr/share/tomcat/lib/tomcat-servlet-3.0-api.jar:classes /srv/tomcat/webapps/myapp/WEB-INF/classes/MyServlet.java
В результате компиляции в каталоге WEB-INF/classes будет создан файл MyServlet.class. Теперь нужно сконфигурировать Tomcat для его использования.
Настройка доступа к сервлету
С точки зрения пользователя сервлет – это обычный веб-ресурс, адресуемый URI и обращение к сервлету выполняется через адресную строку браузера. Однако, чтобы сервлет стал доступным для клиентов, необходимо выполнить его настройку в файле WEB-INF/web.xml веб-приложения. Структура этого файла для рассматриваемого примера будет примерно такой:
<?xml version="1.0" encoding="UTF-8"?> <!-- Сохранить как "myapp/WEB-INF/web.xml" --> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <servlet> <servlet-name>aboutServer</servlet-name> <servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>aboutServer</servlet-name> <url-pattern>/about</url-pattern> </servlet-mapping> </web-app>
В такой конфигурации сервлет из файла MyServlet.class будет выполняться при обращении по адресу [server:port]/myapp/about. Для КАЖДОГО сервлета должна быть описана пара <servlet> и <servlet-mapping>, связанная по элементу <servlet-name>.
Для того, чтобы изменения вступили в силу, требуется перезапустить сервер. Результат выполнения сервлета приведен на рис. 4.
Рис. 4. Выполнение сервлета
Подробную информацию о всех возможностях сервера Tomcat можно получить из документации, которая устанавливается вместе с сервером и доступна по адресу http://localhost:8080/docs/ или на официальном сайте проекта: http://tomcat.apache.org/.
CC-BY-CA Анатольев А.Г., 31.01.2012