Запуск веб-сценариев на сервере Tomcat

Задача
Вы хотите запустить программу на Java в веб-среде.

Решение
Пишите программы, используя нотацию JSP, и выполняйте их, используя контейнер сервлетов.

Обсуждение
В рецепте 16.2 говорилось о том, что сервер Apache можно использовать для запуска сценариев Perl, PHP и Python. Для Java необходим другой подход, так как Apache не может запускать страницы JSP. Поэтому будем работать с сервером Tomcat, предназначенным для обработки Java в веб-среде. Apache и Tomcat – очень разные серверы, но они связаны семейными узами – Tomcat входит в проект Jakarta, которым занимается Apache Software Foundation.

В этом разделе приводится обзор JSP-программирования с использованием Tomcat, причем я буду исходить из следующих предположений:

• У вас есть некоторое представление об основах JavaServer Pages, например, вы знаете, что такое контейнер сервлета, контекст приложения и каковы базовые элементы сценариев JSP.

• Сервер Tomcat установлен так, что вы можете исполнять страницы JSP и знаете, как его запустить и остановить.

• Вы знакомы с каталогом Tomcat webapps и знаете, какова структура приложения Tomcat.


В частности, вы понимаете, что представляют собой каталог WEB-INF и файл web.xml.

• Вы знаете, что такое библиотека тегов и как ее использовать.

Признаю, что сделанные допущения достаточно серьезны, поскольку JSP и Tomcat используются в мире MySQL не так широко, как другие языки в сочетании с Apache. Если вы не знакомы с JSP или вам необходима помощь в установке Tomcat, обратитесь за информацией к приложению B.

После того как Tomcat установлен, следует инсталлировать перечисленные ниже компоненты, чтобы иметь возможность работать с JSP-примерами:

• Приложение mcb из каталога tomcat дистрибутива recipes.

• Драйвер JDBC для MySQL. Может быть, вы уже устанавливали его для сценариев из предыдущих глав, но для Tomcat необходим собственный экземпляр.

• Библиотека стандартных тегов JSP (JSTL – JSP Standard Tag Library), которая содержит теги условных конструкций, итеративных операций и работы с базами данных для страниц JSP.Давайте поговорим о том, как установить эти компоненты, затем рассмотрим некоторые теги JSTL и, наконец, напишем JSP-эквивалент сценария вывода списка таблиц MySQL, реализованный в рецепте 16.2 на языках Perl, PHP и Python.

Установка приложения mcb
Веб-приложения для Tomcat обычно упаковываются в файлы WAR (веб-архив) и устанавливаются в каталоге webapps, который напоминает корневой каталог дерева документов Apache htdocs.


Дистрибутив recipes содержит пример приложения mcb, которое можно использовать для опробования приведенных примеров JSP. Скопируйте файл mcb.war из каталога tomcat дистрибутива в каталог Tomcat webapps.

Считаем, что дистрибутив recipes и Tomcat расположены в каталогах /u/paul/recipes и /usr/local/jakarta-tomcat, тогда команда установки mcb.war для UNIX будет такой:

% cp /u/paul/recipes/tomcat/mcb.war /usr/local/jakarta-tomcat/webapps

В Windows, если соответствующие каталоги – это D:\recipes и D:\jakartatomcat, то команда будет такой:

C:\> copy D:\recipes\tomcat\mcb.war D:\jakarta-tomcat\webapps

После того как файл mcb.war скопирован в каталог webapps, перезапустите Tomcat. Обычно изначально Tomcat по умолчанию настроен так, чтобы при запуске искать файлы WAR в каталоге webapps и автоматически распаковывать все, что еще не распаковано. То есть копирование mcb.war в каталог webapps и перезапуск Tomcat должны привести к распаковке приложения mcb.

Когда загрузка Tomcat завершится, вы должны обнаружить в каталоге webapps новый каталог mcb, включающий все файлы из mcb.war. (Если Tomcat автоматически не распаковывает mcb.war, обратитесь к примечанию «Как распаковать файл WAR вручную».) Давайте посмотрим на каталог mcb.


Он должен содержать файлы, которые могут понадобиться клиентам, использующим броузер. Кроме того, должен присутствовать подкаталог WEB-INF предназначенный для информации с ограниченным доступом, то есть доступный для использования сценариям каталога mcb, но клиенты непосредственного доступа к нему не имеют.

Теперь проверим, может ли Tomcat обслуживать страницы контекста приложения mcb, запросив какие-нибудь страницы из броузера. Следующие URL запрашивают статическую HTML-страницу, сервлет и простую страницу JSP соответственно:

http://tomcat.snake.net:8080/mcb/test.html
http://tomcat.snake.net:8080/mcb/servlet/SimpleServlet
http://tomcat.snake.net:8080/mcb/simple.jsp

Измените значения имени хоста и номера порта в URL на значения вашей системы.

Установка драйвера JDBC
Для соединения с базой данных cookbook страницам JSP приложения mcb нужен драйвер JDBC. Рассмотрим процедуру установки драйвера MySQL Connector/J, для других драйверов все будет аналогично.

Чтобы установить MySQL Connector/J для использования приложениями Tomcat, скопируйте его в дерево каталогов Tomcat. Если считать, что драйвер заархивирован в JAR-файл (в случае MySQL Connector/J это именно так), в корневом каталоге Tomcat есть три места, где его можно разместить, в зависимости от того, насколько доступным вы хотели бы его сделать:

• Чтобы драйвер был доступен только приложению mcb, поместите его в подкаталог mcb/WEB-INF/lib каталога Tomcat webapps.

• Чтобы драйвер был доступен всем приложениям Tomcat, но не самому Tomcat, поместите его в подкаталог lib корневого каталога Tomcat.

• Чтобы сделать драйвер доступным как приложениям, так и Tomcat, поместите его в подкаталог common/lib корневого каталога Tomcat.

Я рекомендовал бы скопировать драйвер в каталог common/lib. Тогда он будет наиболее доступен (и приложениям, и Tomcat), и процедуру инсталляции потребуется произвести всего однажды. Если разрешить использование драйвера только приложению mcb, поместив его в mcb/WEB-INF/lib, а затем создавать другие приложения, использующие MySQL, то придется копироватьдрайверы в каталоги этих приложений или перемещать его в более доступное место.

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

Приведем пример процедуры инсталляции для UNIX, предполагая, что драйвер MySQL Connector/J и Tomcat расположены в /src/Java/mysql-connector-java-bin.jar и /usr/local/jakarta-tomcat. Команда копирования драйвера будет такой:

% cp /src/Java/mysql-connector-java-bin.jar /usr/local/jakarta-tomcat/common/lib

Для Windows, если компоненты расположены в D:\mysql-connector-javabin.jar и D:\jakarta-tomcat, команда выглядит так:

C:\> copy D:\mysql-connector-java-bin.jar D:\jakarta-tomcat\common\lib

После установки драйвера перезапустите Tomcat, а затем запросите страницу приложения mcb, чтобы убедиться в том, что Tomcat находит драйвер JDBC:

http://tomcat.snake.net:8080/mcb/jdbc_test.jsp

Может быть, придется предварительно отредактировать файл jdbc_test.jsp, чтобы изменить параметры соединения.

Установка JSTL
Большинство сценариев приложения mcb используют библиотеку JSTL, поэтому необходимо установить ее, или сценарии не будут работать. Чтобы поместить библиотеку тегов в контекст приложения, скопируйте файлы библиотеки в каталог приложения WEB-INF. Обычно необходимо установить хотя бы один JAR-файл и файл дескриптора библиотеки тегов (TLD – tag library descriptor) и добавить информацию о библиотеке в файл приложения web.xml. На самом деле JSTL состоит из нескольких наборов тегов, так что есть несколько файлов JAR и TLD. Процедура установки JSTL для использования с приложением mcb такова:

• Убедитесь в том, что файл mcb.war был распакован, и иерархия каталогов приложения mcb создана внутри каталога Tomcat webapps. Это необходимо, поскольку файлы JSTL должны размещаться в каталоге mcb/WEB-INF, который не будет существовать до тех пор, пока не распакован mcb.war.

• Скачайте дистрибутив JSTL с сайта Jakarta Project. Зайдите на страницу проектов Jakarta Taglibs по адресу:

http://jakarta.apache.org/taglibs/

Следуйте по ссылке Standard Taglib для получения информационной страницы JSTL, содержащей раздел «Downloads», откуда можно получить двоичный дистрибутив JSTL.

• Распакуйте дистрибутив JSTL в какой-нибудь каталог, желательно вне иерархии Tomcat. Для этого выполните команды, подобные использованным для распаковки самого Tomcat (см. раздел «Установка сервера Tomcat » в приложении B). Например, для распаковки дистрибутива в формате ZIP выполните следующую команду, при необходимости заменив имя файла:

% jar xf jakarta-taglibs-standard.zip

• Распаковка дистрибутива приведет к созданию каталога, содержащего несколько файлов. Скопируйте файлы JAR (jstl.jar, standard.jar и т. д.) в каталог mcb/WEB-INF/lib. Эти файлы содержат библиотеки классов, которые реализуют действия тегов JSTL. Скопируйте файлы дескрипторов библиотеки тегов (c.tld, sql.tld и т. д.) в каталог mcb/WEB-INF. Эти файлы определяют интерфейс для действий, реализуемых классами в файлах JAR.

• Каталог mcb/WEB-INF содержит файл web.xml, являющийся файлом дескриптора инсталляции веб-приложения (необычное название для «файла конфигурации»). Измените web.xml, добавив записи для каждого из файлов JSTL TLD:


http://java.sun.com/jstl/core
/WEB-INF/c.tld


http://java.sun.com/jstl/sql
/WEB-INF/sql.tld


Каждый экземпляр содержит элемент , указывающий символическое имя, по которому JSP-страницы mcb будут ссылаться на соответствующий файл TLD, и элемент , указывающий местоположение файла TLD внутри каталога приложения. (Файл web.xml из дистрибутива уже содержит эти записи. Однако необходимо просмотреть их, чтобы убедиться в том, что они соответствуют названиям файлов TLD, установленных на предыдущем этапе.)

• Каталог mcb/WEB-INF содержит и файл с именем jstl-mcb-setup.inc. Данный файл не входит в состав JSTL, но содержит тег JSTL , который используется многими JSP-страницами mcb для указания источника данных при соединении с базой данных cookbook. Этот файл выглядит так:

driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/cookbook"
user="cbuser" password="cbpass" />

При необходимости вы можете отредактировать атрибуты тегов driver, url, user и password для изменения параметров соединения на те, которые вы используете для обращения к базе данных cookbook. Но не меняйте атрибут var.

• Дистрибутив JSTL также включает файлы WAR, содержащие документацию и примеры (standard-doc.war и standard-examples.war). Если вы хотите установить их, то скопируйте в каталог Tomcat webapps. (Вероятно, следует установить документацию, чтобы можно было получить к ней доступ локально с собственного сервера. Полезно установить и примеры, так как они являются наглядной иллюстрацией использования тегов JSTL на страницах JSP.)

• Перезапустите Tomcat, чтобы он заметил изменения, сделанные в приложении mcb, и распаковал файлы, содержащие документацию и примеры по JSTL. Если Tomcat автоматически не распаковывает файлы WAR, обратитесь к примечанию «Как распаковать файл WAR вручную».

После установки JSTL перезапустите Tomcat и запросите следующую страницу приложения mcb с тем, чтобы проверить, может ли Tomcat корректно определить расположение тегов JSTL:

http://tomcat.snake.net:8080/mcb/jstl_test.jsp

Создание страниц JSP с помощью JSTL
В разделе обсуждается синтаксис некоторых тегов JSTL, наиболее часто используемых JSP-страницами mcb. Описания будут очень краткими, а многие из тегов имеют дополнительные атрибуты, позволяющие использовать их не так, как описано в разделе. Подробную информацию о тегах вы сможете найти в спецификации JSTL (см. приложение C).

JSP-страница, использующая JSTL, должна содержать директиву taglib для каждого набора тегов, используемого страницей. Примеры книги используют базовые теги и теги работы с базой данных, определяемые следующими директивами taglib:

<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

Значения uri должны соответствовать символическим значениям, которые перечислены в записях web.xml . Значение prefix задает начальную строку, используемую в названиях тегов для идентификации принадлежности тега к определенной библиотеке тегов.

Теги JSTL записываются в формате XML с использованием специального синтаксиса для включения выражений в атрибуты тегов. Внутри атрибутов тегов текст интерпретируется буквально, если только он не заключен в ${...} – тогда текст воспринимается как выражение, которое должно быть вычислено. Перечислим теги, входящие в базовый набор JSTL:


Тег вычисляет свой атрибут value и заменяется результатом. Одним из применений этого тега является предоставление содержимого страницы вывода. Следующий тег выводит значение 3:



Тег присваивает значение переменной. Например, чтобы присвоить символьную строку переменной с именем title, а затем использовать переменную в элементе страницы вывода, сделайте следующее:<br /> <br /> <c:set var="title" value="JSTL Example Page" /><br /> <html><br /> <head><br /> <title><c:out value="${title}" />

...

Этот пример иллюстрирует правило, обычно справедливое для тегов JSTL: при указании переменной, в которой будет храниться значение, не используйте для ее имени нотацию ${...}. Для последующих ссылок на значение этой переменной используйте ее внутри ${...}, чтобы она интерпретировалась как выражение для вычисления.


Тег оценивает условную конструкцию, приведенную в его атрибуте test. Если результат – истина, то вычисляется тело тега, которое и становится его выводом; в противном случае тело тега игнорируется:

1 is not equal to 0


К операторам сравнения относятся ==, !=, <, >, <= и >=. Альтернативные операторы eq, ne, lt, gt, le и ge позволяют избежать использования специальных символов HTML в выражениях. Арифметические операторы включают +, -, *, / (или div) и % (или mod). К логическим операторам относятся && (and), || (or) и ! (not). Специальный пустой оператор empty истинен, если его значение пусто или равно null:


x is empty


y is not empty



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


Please choose an item
Please choose only one item


Thank you for choosing an item




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

id = ,
name =




Каждый шаг цикла присваивает текущую строку переменной row. Если предположить, что результат запроса содержит столбцы id и name, то для доступа к значениям столбцов применяйте row.id и row.name. JSTL-теги для работы с базой данных используются для запуска запросов и обращения к их результатам:



Этот тег задает параметры соединения для взаимодействия JSTL с сервером базы данных. Например, чтобы указать параметры, используемые драйвером MySQL Connector/J для доступа к базе данных cookbook, тег должен выглядеть так:

driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/cookbook"
user="cbuser" password="cbpass" />

Атрибуты driver, url, user и password определяют параметры соединения, а атрибут var задает переменную, сопоставленную соединению. Условимся, что JSP-страницы в этой книге будут использовать переменную conn, так что встречающиеся далее теги, которым необходим источник данных, могут ссылаться на соединение при помощи выражения ${conn}.

Чтобы не перечислять параметры соединения на каждой странице JSP, использующей MySQL, поместим тег , характеризующий соединение с базой данных cookbook, во включаемый файл WEBINF/jstl-mcb-setup.inc. Для установки соединения JSP-страница может обращаться к этому файлу так:

<%@ include file="/WEB-INF/jstl-mcb-setup.inc" %>

Для того чтобы изменить параметры соединения, используемые страницами mcb, просто отредактируйте jstl-mcb-setup.inc.


Для запуска предложения, не возвращающего строк, такого как UPDATE, DELETE или INSERT, используйте тег . Атрибут тега dataSource определяет источник данных; счетчик строк, обработанных запросом, возвращается в переменную, указанную в атрибуте var, а само предложение необходимо указать в теле тега:

DELETE FROM profile WHERE id > 100

Number of rows deleted:


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

Тег также принимает атрибут var, в котором указывается переменная, сопоставляемая результирующему множеству:

SELECT id, name FROM profile ORDER BY id


JSP-страницы mcb используют для результирующего множества переменную rs. О способах доступа к содержимому результирующего множества будет рассказано далее.


Вы можете вставлять значения данных в строку запроса как литералы, но JSTL позволяет использовать и заполнители, что удобно при работе со значениями, содержащие специальные символы SQL. Используйте символ ? для каждого заполнителя в строке запроса, а значения для связывания с заполнителями указывайте в тегах внутри тела тега запроса. Значения данных можно задавать в теле тега или в его атрибуте value:

DELETE FROM profile WHERE id > ?
100

SELECT id, name FROM profile WHERE cats = ? AND color = ?




К содержимому результирующего множества, возвращенного , можно обратиться несколькими способами. Если результирующему множеству сопоставлена переменная rs, то к строке i можно обратиться так:

rs.rows[i] или rs.rowsByIndex[i], где значения номеров строк начинаются с 0.

Первый вариант выводит строку, столбцы которой доступны по имени. Второй вариант выводит строку, столбцы которой доступны по своему номеру (начиная с 0). Например, если результирующее множество содержит столбцы id и name, то вы можете обратиться к значениям третьей строки, используя такие имена столбцов:



Теперь используем номера столбцов:



Можно применить для организации цикла по строкам результирующего множества. Если вы хотите обращаться к столбцам по имени, используйте цикл по rs.rows:

id = ,
name =




Или используйте rs.rowsByIndex, если хотите обращаться к столбцам по номеру:

id = ,
name =




Счетчик столбцов доступен как rs.rowCount:

Number of rows selected:

Имена столбцов результирующего множества можно получить с помощью rs.columnNames:






Создание сценария MySQL с помощью JSP и JSTL
В рецепте 16.2 было показано, как написать на Perl, PHP и Python сценарий, выводящий имена таблиц базы данных cookbook. Используя теги JSTL, мы можем создать страницу JSP, отображающую ту же информацию, так:

<%-- show_tables.jsp - Выполнить запрос SHOW TABLES и показать результат --%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %><%@ include file="/WEB-INF/jstl-mcb-setup.inc" %>


Tables in cookbook Database

Tables in cookbook database:


SHOW TABLES







Директивы taglib указывают, какие библиотеки тегов необходимы сценарию, а директива include включает код, задающий источник данных для доступа к базе данных cookbook. Оставшаяся часть сценария генерирует содержимое страницы.

Сценарий следует поместить в подкаталог mcb каталога webapps сервера Tomcat и вызывать его так:

http://tomcat.snake.net:8080/mcb/show_tables.jsp

Как и сценарий PHP, приведенный в рецепте 16.2, сценарий JSP явно не выводит заголовок Content-Type:. JSP автоматически формирует заголовок по умолчанию с типом содержимого text/html.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Запуск веб-сценариев на сервере Apache
Кодирование специальных символов для Web
Основы формирования веб-страницы

Вернуться в раздел: MySQL / 16. Знакомство с MySQL для Web