
- •Раздел 12. Веб-сервера
- •12.2. Стандарт cgi
- •Раздел 13. Технология Java Servlet
- •Пример сервлета
- •Компиляция сервлетов
- •Структура веб-модуля
- •Запуск сервлета
- •Архив веб-модуля
- •13.2. Структура и жизненный цикл сервлета
- •Работа сервлетов в многопоточной среде
- •13.3. Основные классы Servlet api Класс HttpServletRequest (запрос)
- •Класс HttpServletResponse (ответ)
- •Класс HttpServlet (сервлет)
- •Класс ServletContext (взаимодействие с сервлет-контейнером)
- •13.4. Cookies и сессии
- •13.5. Отладка сервлетов
- •Раздел 14. Технология JavaServer Pages
- •14.1. Введение в jsp
- •14.2. Жизненный цикл jsp-страниц
- •Действия
- •14.4. Язык выражений
- •Предопределенные объекты
- •14.5. Библиотеки тегов
- •Раздел 14. Технология JavaServer Pages
- •14.1. Введение в jsp
- •14.2. Жизненный цикл jsp-страниц
- •Действия
- •14.4. Язык выражений
- •Предопределенные объекты
- •14.5. Библиотеки тегов
12.2. Стандарт cgi
Apache поддерживает стандарт CGI (Common Gateway Interface, дословно переводится как «общий интерфейс шлюза»). Стандарт CGI задает правила взаимодействия веб-сервера (например, Apache) и внешней программы на веб-сервере, предназначенной для обработки HTTP-запросов клиентов. Взаимодействие сервера и программы осуществляется через стандартные потоки ввода-вывода и переменные окружения. Таким образом, стандарт CGI позволяет создавать динамические веб-страницы практически на любом языке программирования.
Программы, которые взаимодействуют с веб-сервером по правилам стандарта CGI, называют CGI-программами, CGI-скриптами или просто скриптами.
CGI-программа — это обычный исполняемый файл операционной системы: в Windows это может быть exe-файл, а в Unix — это может быть не только двоичный исполняемый файл, но и программа, написанная на некотором интерпретируемом языке (например, Perl или Python).
Операционные системы семейства Unix позволяют создавать исполняемые файлы практически на любых скриптовых языках. Для этого файлу с исходным кодом программы устанавливается соответствующий атрибут, а в первую строку добавляется путь к интерпретатору языка в следующем формате:
#!/usr/bin/perl
…далее идет исходный код на языке perl…
Когда поступает HTTP-запрос и веб-сервер, в соответствии со своей конфигурацией, решает, что нужно выполнить CGI-приложение, то он:
-
Инициализирует различные переменные окружения, в которые помещает информацию о запросе (IP-адрес пользователя, строку запроса, запрошенный URI и т. д.).
-
Определяет путь к CGI-программе и запускает её на выполнение. На стандартный поток ввода CGI-программы передается тело HTTP-запроса (если оно присутствует).
-
CGI-программа анализирует запрос (используя переменные окружения и стандартный поток ввода), выполняет нужную обработку запроса и отправляет HTML-документ на стандартный поток вывода.
-
Веб-сервер добавляет к сгенерированному ответу необходимые HTTP-заголовки и передает данные пользователю.
Apache по умолчанию сконфигурирован так, что выполнение CGI-скриптов разрешено только из каталога cgi-bin. Чтобы разрешить запуск из другого каталога, в httpd.conf должны быть директивы вида:
<Directory c:/hosts/htdocs>
Options +ExecCGI
AddHandler cgi-script cgi pl
</Directory>
Теперь в указанном каталоге все файлы с расширениями cgi и pl (обычное расширение для программ на Perl) будут исполняться веб-сервером как CGI-программы.
В Windows файлы с расширением cgi и pl не могут быть обычными исполняемыми программами. Однако версия Apache для Windows поддерживает не только исполняемые файлы Windows, но и программы на других языках, если в первой их строчке указан путь к интерпретатору, например, «#!c:/perl/bin/perl.exe» (т. е. так же, как это поддерживается в Unix).
Пример простейшей CGI-программы на Perl, которая выводит строку запроса (если она была указана) и IP-адрес клиента:
#!/usr/local/bin/perl
# вывод заголовков и пустой строки
print "Content-type: text/html; charset=koi8-r\r\n\r\n";
print "<html>";
print "<head><title>Пример CGI-программы</title></head>";
print "<body><h1>Пример CGI-программы</h1>";
print "QUERY_STRING: $ENV{QUERY_STRING}<br />";
print "REMOTE_ADDR: $ENV{REMOTE_ADDR}<br / >";
print "</body></html>";
Первая строка — это признак исполняемого файла (в Unix) или инструкция для Apache (в случае Windows). Далее программа выводит HTTP-заголовок «Content-Type» (остальные заголовки опциональны). Некоторые другие заголовки и первую строку HTTP-ответа добавит сам веб-сервер (Apache).
Остальные строки этой программы просто печатают HTML-код на стандартный поток вывода. Ассоциативный массив ENV в Perl содержит все переменные окружения, включая те, которые были установлены веб-сервером перед запуском CGI-программы.
Если эту программу запустить обычным образом на выполнение командой «/hosts/htdocs/test.pl» в Unix или с помощью интерпретатора Perl в Windows «perl c:\hosts\htdocs\test.pl», то просто выведется заголовок Content-Type и HTML-код. Значения QUERY_STRING и REMOTE_ADDRESS будут пустыми, т. к. эти переменные окружения инициализируются лишь веб-сервером.
Если же эту программу разместить на работающем веб-сервере и в веб-браузере набрать соответствующий адрес http://hostname/test.pl?name=hello, то выведется веб-страница следующего вида (при условии, что будет найден интерпретатор Perl):
Пример CGI-программы
QUERY_STRING: name=hello REMOTE_ADDR: 80.250.188.11
Если параметры запроса передать HTTP-методом POST, то поле QUERY_STRING останется пустым, т. к. параметры запроса будут переданы на стандартный поток ввода программы, а не через переменную окружения.
С помощью средства языка, на котором реализуется CGI-программа, можно создавать динамические сайты практически любой сложности.
Обычно стандарт CGI используется для написания веб-страниц на языке Perl. Реже на других языках — C++, Phyton, Ruby, PHP.
Поддержка популярного языка PHP в Apache обычно реализуется с помощью модуля, а не как CGI. Специализированный модуль работает быстрее, чем CGI, т. к. веб-серверу не приходится запускать интерпретатор PHP для каждой обработки запроса.
Еще пример CGI-скрипта на Perl:
#!/usr/local/bin/perl
# подключение модуля CGI и импорт функции param
use CGI qw/param/;
print "Content-Type: text/html; charset=windows-1251\r\n\r\n";
$name = param("name");
# если пользователь еще не указал имя...
if ($name eq "") {
# показываем форму для ввода имени
print "<form method='post' action='hello.cgi'>Как Вас зовут? ";
print "<input name='name'>";
print "<input type='submit' value='Отправить'>";
print "</form>";
} else {
print "<p>Здравствуйте, $name!</p>";
}
Этот CGI-скрипт выводит форму с предложением ввести имя. После ввода имени и нажатии на кнопку, повторно сработавший CGI-скрипт выведет приветствие.
Кроме стандартной версии сервера Apache, которая доступна на сервере httpd.apache.org, существует ряд пакетов для веб-разработчиков, включающих Apache. Примеры таких пакетов — Denwer (только для Windows) и XAMPP. Эти пакеты включают полностью сконфигурированный веб-сервер Apache с поддержкой PHP и Perl, включают СУБД MySQL и некоторые другие вспомогательные утилиты. У пакета XAMPP есть версия, которая даже не требует инсталляции. Такие пакеты могут быть удобны для веб-разработчиков, чтобы те не углублялись в тонкости администрирования веб-серверов и могли сконцентрироваться собственно на разработке веб-приложений.
12.3. Apache Tomcat
Разработка сервера Tomcat также осуществляется организацией Apache Software Foundation (сайт проекта: http://tomcat.apache.org/). Сервер является бесплатным и имеет открытый код.
Сервер реализован на языке Java и поддерживает технологии Java Servlet и JavaServer Pages (JSP), которые являются важной частью спецификации J2EE (разработка Sun) и фактически являются стандартами для веб-приложений на Java.
Tomcat доступен на сайте разработчика в виде инсталлятора для Windows (устанавливается как сервис) и в виде обычного архива, для которого инсталляция не требуется. Эта версия может быть запущена на любой операционной системе (запускается как консольное приложение).
Запуск сервера прост:
-
Сначала нужно разархивировать архив с Tomcat.
-
Затем указать в переменной окружения JAVA_HOME путь к JDK.
-
И запустить программу bin\startup.bat (Windows) или bin/startup.sh (Unix).
Основной конфигурационный файл Tomcat — conf/server.xml. Tomcat по умолчанию использует порт 8080 (порт указан в server.xml).
Веб-приложения для Tomcat (или других Java-ориентированных веб-серверов) обычно называют веб-модулями. Веб-модули в Tomcat по умолчанию размещаются в каталоге webapps. Веб-модули имеют стандартную структуру каталогов, которая описана в спецификации J2EE.
В стандартной поставке Tomcat в каталоге webapps размещен ряд веб-приложений для администрирования сервера, документация и примеры сервлетов и JSP-страниц. После запуска сервера ссылки на примеры, документацию и страницы администрирования доступны с главной страницы сервера.