Создание Web-приложений в среде Delphi
Эпоха web-дизайна, когда наиважнейшим считалось возможность
запихнуть на страницу как можно больше графики и поразить пользователя
широтой фантазии дизайнера, канула в лету. В моде - информационный дизайн
и всяческие удобности для пользователя. Плохим тоном уже считается одно
только то, что на сайте нет форума или гостевой книги, и самое ужасное
- о, боже - вы до сих пор верстаете каждую страницу вручную, вместо того,
что бы поручить сеё скучное и утомительное занятие скрипту.
Время первопроходцев HTML в скором времени закончится
и вовсе, и их место займут профессионалы-программисты. Именно программисты,
ибо уже в большей степени от их умения создать удобный в использование
сайт зависит его успех. Кроме прочего, теперь сайты создают совсем уж
как программные продукты: тем кто занят наполнением содержанием, уже
может не опасаться запутаться в html, java, cgi и прочих ипостасях интернет-технологий
- администрирование сайта становится таким же привычным и удобным, как
работа с текстовыми процессорами. Пока, правда, ощущается явный недостаток
законченных продуктов, на плечи которых можно было бы возложить все функции
по поддержанию сайта в актуальном состоянии, оставив себе лишь вопросы
по наполнению его содержанием.
Пока же тяжкое бремя по созданию данных систем, на
основе которых будет функционировать сайт, ложится на плечи программистов,
только вот-вот успевших изумится возможностями языка Perl или Java. И
многие из них, сказать без преувеличения, вышли, словно из гоголевской "Шинели",
из Delphi. Действительно, данная среда разработчика, предоставляющая
удобный интерфейс для визуального программирования и широкие возможности
Object Pascal, столь мила сердцу российских программистов.
Но, похоже, что времена меняются, и Delphi из среды
создания обычных настольных приложений, может сгодиться и в другом плане:
для написания прикладных web-программ. И действительно, что может быть
лучше: уже знакомая среда разработки, вдоль и поперек изученный язык,
да и достаточно широкий круг специалистов по программированию в Delphi
- это ли не плюсы создания web-приложений на Delphi. Есть конечно и минусы:
созданные программы вряд ли смогут удовлетворить тех, кто считает, что
лучший web-сервер, это сервер не от Microsoft. Но что поделаешь - версия
Delphi под Unix отложена пока до лучших времен. Зато посудите сами: перенос
программ в будущем светлом будущем можно будет совершить с малой кровью.
Но отложим пока теорию в сторону, и обратимся к практике.
Итак, создание web-приложения в среде Delphi, что называется шаг за шагом.
В отличие от прочих аспектов создания приложений в
Delphi, о создании приложений для web написано мало. Так ужасающе мало,
что из книги в книгу, из учебника в учебник путешествует один и тот же
пример. Не будем оригинальничать и мы - чем проще, тем лучше.
Вообще, простейшее web-приложение на Delphi мало чем
отличается, а точнее ничем не отличается от создания программы для старой
доброй DOS. Это - простейшее консольное приложение, запускаемое на стороне
сервера и взаимодействующие с пользователем (в случае необходимости)
через броузер.
Создайте в Delphi новый проект - ту самую уже давно
забытую всем Console Application. Вы получите знакомый со школьной скамьи,
текст обычной паскалевской программы:
program primer;
{$APPTYPE CONSOLE}
uses SysUtils;
begin
// Insert user code here
end.
Далее еще проще. Организуем вывод кода HTML с помощью
команды writeln.
writeln ('CONTENT-TYPE: TEXT/HTML');
writeln;
writeln ('<html>');
writeln ('<head>');
writeln ('<meta HTTP-EQUIV="Content-Type" Content="text-html;
charset=windows-1251">');
writeln ('<title>Delphi the best facility for making
web-publications!</title>');
writeln ('</head>');
writeln ('<body bgcolor="white">');
writeln ('Hello, world!');
writeln ('</body>');
writeln ('</html>');
Обратите внимание на строку CONTENT-TYPE: TEXT/HTML,
которая определяет описание последующего содержимого, а именно кода HTML.
После CONTENT-TYPE: TEXT/HTML, необходимо вывести пустую строку иначе
броузер может выдать сообщение об ошибке.
Теперь, когда приложение закончено, осталось его скомпилировать
и проверить. Для проверки работоспособности программы вам понадобиться
веб-сервер. Можно особо не утруждаться, подойдет любой, даже стандартный
домашний веб-сервер от Microsoft. Приложение надо будет разместить в
папке публикаций сервера (обычно это - C:\Inetpub\ wwwroot) и запустить
сам сервер. Теперь, если вы перейдете по адресу http://localhost/primer.exe
в броузере, вы должны увидеть результат действия данной программы - строку
Hello, world! Вот и всё, простейшее web-приложение на Delphi готово.
На самом деле нам бы вряд ли понадобилось Delphi, для
создания подобных программ. Конечно, можно генерировать страницы исходя
из различных условий, но вопрос в том, как данные условия передать программе.
И здесь оказывается не всё так сложно, достаточно вспомнить передачу
параметров приложению с помощью командной строки и поступить соответствующе.
Хотя это, разумеется, хитрость. Это для приложения Delphi мы оперируем
командной строкой, для пользователя же это адресная строка в броузере,
то есть url.
Попробуем на примере. Необходимо создать приложение,
которое выдает различную информацию (к примеру, время, дату или то и
другое вместе) в зависимости от параметров, указанных в адресной строке
броузера. Как известно, за данные в параметрах отвечают такие функции,
как ParamCount и ParamStr. Их-то мы и будем использовать.
program CgiDate;
{$APPTYPE CONSOLE}
uses SysUtils;
begin
writeln ('CONTENT-TYPE: TEXT/HTML');
writeln;
writeln ('<HTML><HEAD>');
writeln ('<TITLE>Cgidate</TITLE>');
writeln ('</HEAD><BODY>>');
writeln ('<H1>Пример передачи параметров</H1>');
writeln ('<HR>');
writeln ('<H4>
if ParamCount >0 then
begin
if ParamStr (1) = 'date' then
writeln (FormatDateTime('"Сегодня " dddd, mmmm d, yyyy', Now))
else if ParamStr (1) = 'time' then
writeln (FormatDateTime('"Время" hh:mm:ss AM/PM', Now))
else if ParamStr (1) = 'both' then
writeln (FormatDateTime('"Сегодня " dddd, mmmm d, yyyy,'
+ '"<p> и время" hh:mm:ss AM/PM', Now))
else
writeln ('Ошибка! Неверный параметр: ' + ParamStr (1) + '.')
end
else
writeln ('Параметр отсутствует.');
writeln ('</BODY></HTML>');
end.
Не правда ли просто? Теперь, если в адресной строке
броузера вы наберете, например http://localhost/cgidate/exe?time, будет
сгенерирована страница, отображающая текущее время, http://localhost/cgidate/exe?date
- соответственно дата, а при передаче параметра both - текущая дата и
время. В случае если никакой из параметров передан не был или он был
ошибочен - возникнет сообщение об этом.
Данные адреса и параметры можно непосредственно указать
в коде HTML и генерировать необходимые изменения на странице либо другие
страницы переходя по соответствующим ссылкам.
Следует обратить внимание на то, как передавать данные
через url. Знак вопроса отделяет параметр от адреса файла, с помощью
знака равенства web-приложению передается значение данного параметра.
Так как в адресной строке нельзя использовать пробел, он заменяется на
шестнадцатеричный код в таблице ASCII, то есть %20.
Но на самом деле, если некие данные передаются от пользователя
web-приложению, то обычно для этого используют формы, а не url (хотя
одно другому не мешает). Попробуем и мы создать приложение, которое бы
получало данные от пользователя, занесенные им в форму.
Для начала, естественно, нужно создать сам код HTML
в котором бы присутствовала форма с полями ввода, кнопкой отправки и
прочими необходимыми атрибутами. При этом form action должен содержать
адрес программы, которая будет получать данные. Значение method может
быть равно как GET, так и POST. На самом деле GET - это и есть передача
параметров через url, добавляя их к адресной строке, так как POST передает
их приложению посредством стандартного потока ввода. Какой из них лучше
и удобней - решать вам, но чаще всего метод GET используется именно для
генерации страниц (достаточно взглянуть на url который возникает при
работе на поисковых серверах), тогда как второй для - передачи данных,
отображать которые в адресной строке было бы весьма накладно.
Затем необходимо создать приложение, которое бы адекватно
смогло воспринять все эти данные со стороны пользователя. В случае если
данные передавались с помощью метода GET проблем не будет - можно действовать
как в предыдущем примере. Если же приложение получает данные от пользователя
с помощью POST, всё несколько иначе.
Необходимо будет считывать данные из переменной окружения,
а для этого мы, естественно, должны знать данные переменные.
Нет в мире тайн. Особенно их мало у пользователя от
web-приложения. И если мы не знаем о пользователе кое-что личное, все
прочее броузеры с легкостью отдают web-серверу, нисколько не заботясь
о приватности и желаниях того самого пользователя. Это, конечно, нехорошо
для пользователя, но хорошо для разработчика web-приложения, поскольку
для него знания - великая вещь.
Итак, данные от пользователя web-приложению можно передать
через переменные окружения. Вот список наиболее часто употребляемых:
GATEWAY_INTERFACE
Поддерживаемая версия CGI.
REQUEST_METHOD
Метод запроса, может быть как GET так и POST.
HTTP_REFERER
Адрес страницы (url), активирующей текущее приложение на web-сервере.
PATH_INFO
Путь переданный приложению расположенный между именем приложения и строкой
запроса.
QUERY_STRING
Строка запроса, если метод - GET, добавляеться к url.
REMOTE_HOST
Имя хоста удаленного пользователя.
REMOTE_USER
Имя удаленного пользователя.
REMOTE_IDENT
IP-адрес удаленного пользователя.
HTTP_USER_AGENT
Имя и версия броузера удаленного пользователя.
С помощью данных переменных можно получить исчерпывающую
информацию о пользователе и передаваемых данных для верного проектирования
вашего web-приложения. Конечно, этого хватит в том случае, если вы не
собираетесь подобно Большому Брату следить за каждым телодвижением пользователя.
Но вернемся к поставленной задаче - передаче данных
приложению от пользователя через форму. Данные, которые передаются через
QUERY_STRING в приложение с помощью метода POST, достаточно просто извлечь
для использования.
Ниже листинг программы, выдающий список некоторых переменных
окружения и их значения. Узнайте кое-что о своем броузере и web-сервере.
program CgiVars;
{$APPTYPE CONSOLE}
uses
Windows;
сonst
VarList: array [1..17] of string [30] =
('SERVER_NAME', 'SERVER_PROTOCOL',
'SERVER_PORT', 'SERVER_SOFTWARE',
'GATEWAY_INTERFACE', 'REQUEST_METHOD',
'PATH_TRANSLATED', 'HTTP_REFERER',
'SCRIPT_NAME', 'PATH_INFO',
'QUERY_STRING', 'HTTP_ACCEPT',
'REMOTE_HOST', 'REMOTE_USER',
'REMOTE_ADDR', 'REMOTE_IDENT',
'HTTP_USER_AGENT');
var
I: Integer;
ReqVar: string;
VarValue: array [0..200] of Char;
begin
writeln('Content type: text/html');
writeln;
writeln('<HTML><HEAD>');
writeln('<TITLE>CGI Variables</TITLE>');
writeln('</HEAD><BODY>');
writeln('<H1>CGI Variables</H1>');
writeln('<HR><PRE>');
for I := Low (VarList) to High (VarList) do
begin
ReqVar := VarList[I];
if (GetEnvironmentVariable (PChar(ReqVar),
VarValue, 200) > 0) then
else
VarValue := '';
writeln (VarList[I] + ' = ' + VarValue);
end;
writeln('</PRE></BODY></HTML>');
end.
В этой статье мы не коснулись другой и уж наверняка
более обширной и сложной темы, как создание ISAPI-приложений на Delphi.
Вышеприведенные способы создания приложений годны лишь в том случае,
если вам необходимо быстрое, компактное и не слишком сложное web-приложение.
Если же вам необходим, к примеру, доступ к базам данным, то подобный
путь неприемлем.
Для создания полномасштабных приложений для интернета
в Delphi существует специальный помощник - Web Server Application. С
его помощью можно создать приложение генерируещее динамические web-страницы,
основанные на CGI, NSAPI или ISAPI. Единственное накладываемое ограничение
- непосредственно web-сервер должен работать на базе Windows.
Одним из главных преимуществ создания подобных приложений
именно в среде Delphi является то, что вы продолжаете работать с визуальными
компонентами - это значительно проще, чем создание приложений в других
средах - возможность ошибки в больших проектах, где используется визуальное
проектирование меньше, чем в тех, где всё описывается исключительно кодом.
Кроме того, средства создания web-приложений позволяют импортировать
уже существующие приложения в интернет-среду, что, согласитесь, немаловажно.
Пока, конечно, Delphi не обладает большим набором компонентов для web-приложений,
но, видимо, уже следующая версия этой среды обзаведется необходимыми.
Но и сейчас Delphi можно считать достаточно удобным инструментом для
создания приложений, взаимодействующих с интернетом.
Новинки софта