- •1. Компоненты, используемые при разработке Web-приложений
- •2. Статическая публикация
- •3. Компоненты генерации html-страниц
- •3.1. Компонент PageProducer
- •3.2. Компонент DataSetPageProducer
- •3.3. Компонент DataSetTableProducer
- •Var Align: thtmlAlign; var vAlign: thtmlvAlign; var CustomAttrs,
- •3.4. Компонент QueryTableProducer
- •3.5. Пример генератора html-страниц
- •Var ReplaceText; String); procedure PageProducerlHtmlTag(Sender: tObject; Tag: tTag;
- •Var ReplaceText: String); procedure DataSetTableProducerlFormatCell(Sender: tObject; CellRow,
- •Var Align: thtmlAlign; var vAlign: thtmlvAlign; var CustomAttrs, f
- •Var Align: thtmlAlign; var vAlign: thtmlvAlign; var CustomAttrs,
- •4. Динамическая публикация
- •4.1. Создание модуля cgi
- •II:integer;
- •Var I: integer;
- •Var I: integer;
- •Var I: integer;
- •4.2. Создание isapi-модуля расширения сервера
- •4.3. Обработка ввода пользователя в модуле isapi
- •5. Публикация графики
- •Interface
- •Var Align: thtmlAlign; var vAlign: thtmlvAlign; var CustomAttrs,
- •6. Использование интерфейса ado
2. Статическая публикация
Как уже говорилось, статическая публикация базы данных в Интернете используется при редком обновлении информации в БД. При использовании такого типа публикации информация из БД помещается в HTML-документ, который хранится постоянно в файле на диске. При этом запрос на получение данных не приводит к большой загрузке сервера, т. к. пользователю возвращается уже готовый HTML-документ.
Для статической публикации можно использовать обычное приложение Windows, которое запускают периодически (после обновления информации в БД). Вообще говоря, для такой публикации достаточно создать простейшее приложение БД, которое обеспечивает, во-первых, доступ к БД, во-вторых, генерацию HTML-документа на основе получаемой из БД информации и, в третьих, сохранение созданного файла на диске. Рассмотрим особенности использования средств Delphi для решения этих задач на следующем примере.
Пусть требуется выполнить статическую публикацию содержимого демонстрационной БД, входящей в состав стандартной поставки Delphi. Эта БД имеет псевдоним dbdemos и имя файла таблицы An.imals.dbf (при полной установке Delphi псевдоним создается автоматически).
Разместим на форме 2 кнопки Button и установим с помощью Инспектора объектов их свойству Name значения Gen и show, соответственно. Кроме кнопок, поместим на форме компонент Table. Ниже приведен код модуля DbHTML генератора HTML-страниц.
unit DbHTML;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Db, DBTables, StdCtrls, ComCtrls;
type
TDbHTMLForm = class(TForm)
Tablel: TTable;
Gen: TButton;
Show: TButton;
procedure GenClick(Sender: TObj ect);
procedure ShowClick(Sender: TObject);
end;
var
DbHTMLForm: TDbHTMLForm;
implementation
{$R *.DFM}
uses
Shellapi, FileCtrl;
// Обработчик события OnClick кнопки Gen
procedure TDbHTMLForm.GenClick(Sender: TObject);
var HTMLStr: TStringList;
I,k: Integer;
begin
// Инициализация объекта Tablel
Tablel.Close;
Tablel.DatabaseName := 'DBDEMOS';
Tablel.TableName := 'Animals.dbf ;
Tablel.Open;
// Создание заголовка HTML-документа
HTMLStr:= TStringList.Create;
HtmlStr.Clear;
HtmlStr.Add ('<HTML>');
HtmlStr.Add ('<HEAD>');
HtmlStr.Add ('<TITLE>' + 'HTML-страница, отчет
из БД'+</Т1ТLЕ>');
HtmlStr.Add ('</HEAD>');
HtmlStr.Add ('<BODY BGCOLOR="#FFFFEE">');
HtmlStr.Add ('<HlxCENTER> Данные из файла ' + Tablel.TableName +
'</CENTER></Hl>');
// Вывод тега, открывающего таблицу
HtmlStr.Add('<table border>');
// Вывод тега, открывающего строку таблицы
HtmlStr.Add('<tr>');
// Создание заголовков таблицы
for I := 0 to Tablel.FieldCount - 1 do
HtmlStr.Add('<th>' + Tablel.Fields[I].FieldName + '</th>');
// Вывод тега, закрывающего строку таблицы
HtmlStr.Add('</tr>);
// Вывод данных
Tablel.First;
// Перебор всех записей
while not Tablel.EOF do begin
HtmlStr.Add('<tr>');
for I := 0 to Tablel.FieldCount - 1 do
// Вывод тега ячейки данных таблицы
if Tablel.Fields[I].DisplayText = '
then HtmlStr.Add('<td>' + ' '+ '</td>')
else HtmlStr.Add('<td>' + Tablel.Fields[I].DisplayText + '</td>')
HtmlStr.Add('</tr>');
Tablel.Next;
end;
// Вывод тега, закрывающего таблицу
HtmlStr.Add('</table>');
// Вывод тега, закрывающего тело документа
HtmlStr.Add ('</BODY>');
// Вывод тега, закрывающего документ
HtmlStr.Add ('</HTML>');
// Сохранение сформированного HTML-документа в файле Htmltest.htm
HtmlStr.SaveToFile ('Htmltest.htm1);
HtmlStr.Free ;
end;
// Обработчик события Onclick кнопки Show
procedure TDbHTMLForm. ShowClick(Sender: TObject);
begin
// Запуск просмотра файла HTMLTEST.htm
ShellExecute (Handle, 'open', pChar('HTMLTEST.htm'), '', '', sw_ShowNormal);
end;
end.
В рассматриваемом примере HTML-страницы генерируются без использования специальных средств библиотеки VCL. Формирование и сохранение в файле HTML-страниц задается в явном виде. Интерфейсная часть приложения представляет собой окно с двумя кнопками: Gen и Show.
Разберем подробнее, как происходит обработка события нажатия кнопки. В процедуре GenClick используется объект HTMLStr типа TStringList, в котором хранятся строки формируемого HTML-документа. В начале процедуры выполняется инициализация объекта Tablel с помощью следующего кода:
Tablel.Close;
Tablel.DatabaseName := 'DBDEMOS';
Tablel.TableName := 'Animals.dbf';
Tablel.Open;
Здесь для объекта Table1 устанавливаются свойства, которые задают источник БД. Свойство DatabaseName определяет псевдоним (dbdemos), а свойство TabieName задает таблицу БД (в рассматриваемом случае используемая таблица находится в файле Animals.dbf). Методы close и open соответственно закрывают и уставливают соединение с БД. При этом вызов метода close перед инициализацией объекта Table! обеспечивает успешное выполнение кода при повторном обращении к процедуре Genciick.
Далее в процедуре осуществляется создание объекта stringList с помощью конструктора Create:
HTMLStr:= TStringList.Create;
и его инициализация с помощью метода clear:
HtmlStr.Clear;
Формирование HTML-документа выполняется с помощью метода Add:
HtmlStr.Add ('<HTML>');
Информация из БД выводится в формируемый HTML-документ в табличном виде. В частности, заголовок таблицы выводится с помощью следующего кода:
HtmlStr.Add('<table border>');
HtmlStr.Add('<tr>');
for I := 0 to Tablel.FieldCount - 1 do
HtmlStr.Add('<th>' + Tablel.Fields[I].FieldName + '</th>');
HtmlStr.Add('</tr>');
Свойство FieldCount задает число полей в записи таблицы. Строка Tablel.Fields [I] .FieldName возвращает указатель на строку, содержащую имя поля. При этом объект Fields является массивом полей записи. Выражение Fields[I] позволяет обратиться к полю записи с номером i (нумерация с нуля).
Далее в обработчике стоит итерационный цикл, содержащий вложенный цикл с параметром:
Tablel.First;
while not Tablel.EOF do begin
HtmlStr.Add('<tr>');
for I := 0 to Tablel.FieldCount - 1 do
if Tablel.Fieldsfl].DisplayText=''
then HtmlStr.Add('<td>' + '_ '+ '</td>')
else HtmlStr.Add('<td>' + Tablel.Fields[I].DisplayText + '</td>');
HtmlStr.Add('</tr>');
Tablel.Next;
end;
Перед началом цикла с помощью метода First производится установка указателя текущей записи на первую запись таблицы. Во внешнем цикле указатель текущей записи последовательно перемещается по записям таблицы, а во внутреннем цикле осуществляется перебор всех полей текущей записи. Выход из внешнего цикла происходит при достижении указателем текущей записи конца таблицы (выражение not Tabiei.EOF становится ложным).
Метод Tabiei.Fields[i].DispiayText возвращает указатель на строку, содержащую данные из 1-го поля текущей записи. Чтобы браузер не нарушал структуру таблицы, при отсутствии в поле данных в формируемый документ выводится строка '<td>' + ' ' + '</td>' (если данные есть, то выводится
'<td>' + Tablel.Fields[I].DispiayText + '</td>').
Последняя строка в теле цикла содержит вызов метода Next, который переводит указатель текущей записи на следующую запись в таблице.
Сохранение сформированного HTML-документа в файле Htmitest.htm на диске Выполняется с помощью метода SaveToFile объекта StringList:
HtmlStr.SaveToFile ('Htmitest.htm');
В процедуре showciick вызывается API-функция Windows sheiiExecute:
ShellExecute (Handle, 'open1, pChar {'HTMLTEST.htm' ), ' ', ' ', sw_ShowNormal);
которая загружает файл HTMLTEST.htm в браузер.
Вид сформированного приложением HTML-документа в окне браузера показан на рис. 16.2.
Рис. 16.2. Вид сгенерированного приложением HTML-документа в окне браузера
Как видно из приведенного рисунка, данные в HTML-документе представлены в виде таблицы, столбцы которой соответствуют полям, а строки — записям БД.
