Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 16.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

2. Статическая публикация

Как уже говорилось, статическая публикация базы данных в Интернете исполь­зуется при редком обновлении информации в БД. При использовании такого типа публикации информация из БД помещается в HTML-документ, который хранится постоянно в файле на диске. При этом запрос на получение данных не приводит к большой загрузке сервера, т. к. пользователю возвращается уже го­товый HTML-документ.

Для статической публикации можно использовать обычное приложение Win­dows, которое запускают периодически (после обновления информации в БД). Вообще говоря, для такой публикации достаточно создать простейшее приложе­ние БД, которое обеспечивает, во-первых, доступ к БД, во-вторых, генерацию 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-документе представлены в виде таблицы, столбцы которой соответствуют полям, а строки — записям БД.