C.Ю.Соловьев

Методические материалы
по курсу
"Алгоритмы и алгоритмические языки"

Программа курса
Программирование в машинных кодах
Примеры-1
Примеры-2
Пример "большой" программы
Нисходящее программирование
Ссылочные типы
Структуры данных
Очереди и стеки
Деревья поиска
AVL-деревья
Таблицы
Хеш-таблицы
Динамические страницы

Программирование на языке Паскаль динамических страниц в сети Интернет

(* Рассмотрим упрощенную схему информационного взаимодействия *)
(* в сети Интернет. Участниками взаимодействия являются:      *)
(*          сервер, пользователь и администратор              *)
(* Пользователь с помощью программы-браузера (IE for Windows) *)
(* - посылает на сервер запросы и                             *)
(* - получает на них ответы в виде текстовых html-файлов,     *)
(*   которые браузер разворачивает в экранное изображение.    *)
(*                                                            *)
(*     Для (формирования и) отправки запроса на сервер        *)
(*     пользователю предоставляются три возможности:          *)
(* -1- явное указание адреса веб-страницы в окне адреса       *)
(*     браузера: http://www.glossary.ru/pascal.htm,           *)
(*               http://www.test.ru/cgi-bin/dip.cgi и т.п.    *)
(* -2- активизация гиперссылки щелчком мыши;                  *)
(* -3- ввод данных в некоторую форму с последующей            *)
(*     активизацией кнопки типа ОК, Готово, Записать и т.п.   *)
(*                                                            *)
(* Во втором случае html-файл должен содержать конструкцию    *)
(* вида: <A href="адрес веб-страницы" ..>ССЫЛКА</A>           *)
(* В третьем случае html-файл должен содержать конструкцию    *)
(* вида:                                                      *)
(* <FORM action="адрес веб-страницы" method=...>ФОРМА</FORM>  *)
(* Сервер (программный сервер Apache for OS Linux) :          *)
(* - развернут на компьютере провайдера;                      *)
(* - однозначно характеризуется доменным адресом;             *)
(* - располагает некоторым информационным наполнением;        *)
(* - пребывает в постоянном режиме ожидания запросов;         *)
(* - способен исполнять запросы пользователя и                *)
(*   передавать ответы в виде html-файлов;                    *)
(* - предоставляет администратору возможности изменения       *)
(*   своего информационного наполнения.                       *)
(*                                                            *)
(* Информационное наполнение сервера - формально -  каталог   *)
(* файлов, внутри которого, вообще говоря, есть подкаталоги.  *)
(* Информационное наполнение может изменять администратор.    *)
(* Среди прочего сервер Apache предоставляет администатору    *)
(* подкаталог со стандартным именем cgi-bin (или cgi).        *)
(* Администратор может размещать в этом подкаталоге файлы,    *)
(* которые являются исполняемыми программными модулями.       *)
(*
(* Обычно информационное наполнение сервера состоит           *)
(* - из некоторого количества статических  веб-страниц,       *)
(* - из некоторого количества динамических веб-страниц, и     *)
(* - вспомогательных файлов: изображений, данных и др.        *)
(* Статическая веб-страница - текстовый файл:                 *)
(* - оформленный в соответствии с соглашениями языка HTML, и  *)
(* - имеющий расширение .htm или .html                        *)
(* Динамическая веб-страница - программа, которая             *)
(* выдает символ-за-символом                                  *)
(*        в стандартный выходной поток                        *)
(*        текстовый файл, оформленный в соответствии с        *)
(*                        соглашениями языка HTML.            *)
(*                                                            *)
(* Соответственно сервер способен различать                   *)
(* статические и динамические запросы пользователей.          *)
(* Первые исполняются посредством копирования html-файла.     *)
(* Вторые исполняются посредством запуска программы           *)
(*                                   (в подкаталоге cgi-bin). *)
(* Администратор - человек, рабочее место которого позволяет  *)
(*          модифицировать информационное наполнение сервера. *)
(* Инструментами администратора являются: текстовый редактор, *)
(* компилятор Free Pascal, OS Linux, FTP-программа и др.      *)
(*                                                            *)
(* FTP-программа (FAR, absoluteFTP и др.)                     *)
(*  позволяет администратору заменять-старые-на-новые или     *)
(*  включать-новые файлы в информационное наполнение сервера. *)
(* dip1 : простейшая программа, формирующая html-страницу     *)
(*        из единственной строки:                             *)
(*        <html><center><b>Привет<br>ВМК</b></center></html>  *)
 
program dip1;
begin   writeln('Content_type: text/html'); (* <== Обязательно *)
        writeln;                            (* <== Обязательно *)
        writeln('<html><center><b>Привет<br>ВМК</b></center></html>');
end.

(* Вызов *) http://www.glossary.ru/cgi-bin/dip1.cgi                       

(* dip2 : программа, формирующая html-страницу с указанием    *)
(*        серверного времени подготовки ответа на запрос.     *)
 
program dip2;             (* Free Pascal или Turbo Pascal *)
uses DOS;
var H,M,S,U : word;
    X,Y,Z   : String;
begin   GetTime(H,M,S,U);                   (* Ф-ция библ. DOS *)
        Str(100+H,X);     Delete(X,1,1);    (*  hh - часы      *)
        Str(100+M,Y);            Y[1]:=':'; (* :mm - минуты    *)
        Str(100+S,Z);            Z[1]:=':'; (* :ss - секунды   *)
 
        writeln('Content_type: text/html'); (* <== Обязательно *)
        writeln;                            (* <== Обязательно *)
        writeln('<html><center>Серверное время<br>',X,Y,Z);
        writeln('<br>Нажмите Refresh (Обновить)</center></html>');
end.

(* Вызов *) http://www.glossary.ru/cgi-bin/dip2.cgi>

(* dip3 : программа, формирующая html-страницу                *)
(*        в которой перечисляются параметры вызова.           *)
 
program dip3;             (* Free Pascal или Turbo Pascal *)
var I : integer;
begin   writeln('Content_type: text/html'); (* <== Обязательно *)
        writeln;                            (* <== Обязательно *)
        writeln('<html><center>');
        writeln('Количество параметров = ',ParamCount,'<br>');
        for I:=1 to ParamCount do
        writeln(I,'-й параметр = ''',ParamStr(I),'''<br>');
        writeln('Нажмите Refresh (Обновить)</center></html>');
end.

(* Вызов с двумя параметрами 'abc' и 'mn' *) http://www.glossary.ru/cgi-bin/dip3.cgi?abc+mn
(* Вызов с одним параметром '041220'      *) http://www.glossary.ru/cgi-bin/dip3.cgi?041220

(* dip4 и dip5 : программы, принимающие запрос                   *)
(*               пользователя, введенный с клавиатуры.           *)
(* Считаем, что:                                                 *)
(* - браузер вывел на экран приглашение 'Введите строку:',       *)
(*                          окно ввода и                         *)
(*                          кнопку 'Ввод';                       *)
(* - пользователь вводит в окне некоторую строку и нажимает Ввод *)
(*       При обработке букв русского алфавита следует учитывать  *)
(*       перекодировку: а -> %E0,  б -> %E1  и т.д.              *)
(* dip4 : Случай, когда приглашение ввода реализуется html-кодом *)
(*   <FORM method="GET" action="http://www.glossary.ru/cgi-bin/dip4.cgi">   *)
(*       Введите строку:                                         *)
(*    <INPUT name="CTP">                                         *)
(*    <INPUT value="Ввод" type="submit">                         *)
(*   </FORM>                                                     *)

program dip4;             (* Free Pascal или Turbo Pascal *)
uses DOS;
var S : String;
begin   S:=GetEnv('QUERY_STRING');
        writeln('Content_type: text/html'); (* <== Обязательно *)
        writeln;                            (* <== Обязательно *)
        writeln('<html><center>');
        writeln('dip4: Пользователь ввел = ''',S,'''<br>');
        writeln('Нажмите Refresh (Обновить)</center></html>');
end.
(* Вызов dip4 *)     Введите строку:     
(* dip5 : Случай, когда приглашение ввода реализуется html-кодом *)
(*   <FORM method="POST" action="http://www.glossary.ru/cgi-bin/dip5.cgi">             *)
(*       Введите строку:                                         *)
(*    <INPUT name="CTP">                                         *)
(*    <INPUT value="Ввод" type="submit">                         *)
(*   </FORM>                                                     *)

program dip5;             (* Free Pascal или Turbo Pascal *)
uses DOS;
var S : String;
begin   Readln(S);
        writeln('Content_type: text/html'); (* <== Обязательно *)
        writeln;                            (* <== Обязательно *)
        writeln('<html><center>');
        writeln('dip5: Пользователь ввел = ''',S,'''<br>');
        writeln('Нажмите Refresh (Обновить)</center></html>');
end.
(* Вызов dip5 *)     Введите строку:     

Вопросы?