
- •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
Var Align: thtmlAlign; var vAlign: thtmlvAlign; var CustomAttrs,
CellData: String); begin if (CellColumn = 4) and (CellRow > 0) then
CellData := '<a href="' + ScriptName + '/image?1 +
IntToSTR(CellRow-l) + ' "Target="image"> Show Image </a>'; end;
// Обработчик события AfterDispatch
procedure TWebModulel.WebModuleAfterDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin
Tablel.close; end;
// Обработчик события BeforeDispatch
procedure TWebModulel.WebModuleBeforeDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin
Tablel.Open;
ScriptName := Request.ScriptName; end;
// Обработчик события OnAction объекта WebActionlteml
procedure TWebModulel.WebModulelWebActionltemlAction (Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin
// Формирование ответа браузеру с помощью // компонента DataSetTableProducerl
Response.Content:= DataSetTableProducerl.Content; end;
// Обработчик события OnAction объекта WebActionItem2
procedure TWebModulel.WebModulelWebActionItem2Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var
DataSourcel: TDataSource; DBImage1: TDBImage; Jpegl: TJpeglmage; Stream: TMemoryStream; num: integer; begin
DataSourcel:=TDataSource.Create(nil); DBImagel:=TDBImage.Create(nil); try
Tablel.Open;
DataSourcel.DataSet:=Tablel; DBImagel.DataSource:=DataSourcel ; DBImagel.DataField:='BMP'; // Извлечение параметров запроса num:=StrToInt(Request.Query); if num = 0 then Tablel.First
else Tablel.MoveBy(num); Jpegl:=TJpegImage.Create; try
Jpegl.CompressionQuality := 50;
Jpegl.Assign(DBImagel.Picture.Bitmap) ;
Stream := TMemoryStream.Create;
try
Jpegl.SaveToStream (Stream);
Stream.Position := 0;
Response.ContentStream := Stream;
Response.ContentType := 'image/jpeg';
Response.SendResponse;
finally
Stream.Free; end; finally
Jpegl.Free; end; finally
Tablel.Close; end; end;
end.
Результаты обработки запросов модулем isag.dll приведены на рис. 16.20.
Рис. 16.20. Результаты работы модуля isag.dll
В первом фрейме (рис. 16.20) в виде таблицы отображаются текстовые данные. Для формирования таблицы в левом фрейме используется следующий URL-запрос:
http://igin/scripts/isag.dll/text
Для обработки ЭТОГО запроса вызывается процедура WebModulelWebActionltemlAction, в которой генерируется HTML-документ, содержащий таблицу. Формирование HTML-документа выполняет метод Content компонента DataSetTableProducerl:
Response.Content:=DataSetTableProducerl.Content ;
При форматировании каждой ячейки этой таблицы в методе content объекта DataSetTableProducerl возникает событие OnFormatCell, в обработчике которого содержится условный оператор
if (CellColumn = 4) and (CellRow > 0) then ...
Тем самым допускается редактирование только пятого столбца всех строк, начиная со второй, и для них формируются ссылки вида
<а href="http://igin/scripts/isag.dll/image?O" Target="image"> Show Image </a>
Цифра после знака ? изменяется в зависимости от номера строки. Параметр Target=nimage" задает целевой фрейм для вывода графики после обработки запроса.
Собственно публикация графической информации осуществляется в процедуре
WebModulelWebAct ionItem2Act ion.
Для извлечения параметров URL-запроса, передаваемых в самом запросе, используется свойство Query параметра Request. Для преобразования строкового значения переданного параметра используется процедура strToint: num:=StrToInt(Request.Query);
С помощью метода MoveBy объекта Table производится установка указателя текущей записи на запись номер num.
Для извлечения графической информации из БД используется объект DBimage:
DataSourcel:=TDataSource.Create(nil);
DBImagel:=TDBImage.Create(nil);
Tablel.Open;
DataSourcel.DataSet:=Tablel;
DBIraagel.DataSource:=DataSourcel;
DBImagel.DataField:='BMP';
Информация в поле вмр базы данных хранится в формате BMP. Чтобы браузер мог отобразить графическую информацию, ее необходимо преобразовать в формат JPG. Для этого используется объект класса tjpeg:
Jpegl:=TJpegImage.Create; Jpegl.CompressionQuality:=50;
Преобразование файла из формата BMP в формат JPG осуществляется с помощью метода Assign объекта Jpeglmage:
Jpegl.Assign(DBImagel.Picture.Bitmap);
Для отправки изображения браузеру используется промежуточный поток
Stream:=TMemoryStream.Create; Jpegl.SaveToStream(Stream);
Указатель текущей позиции устанавливается на начало потока с помощью свойства Position объекта Stream:
Stream.Position:=0;
Далее указателю на возвращаемый поток Web-сервера присваивается указатель на промежуточный поток:
Response.ContentStream:=Stream;
Тип возвращаемых данных устанавливается следующим образом:
Response.ContentType:='image/jpeg';
С помощью метода sendResponse находящиеся в потоке данные отсылаются браузеру:
Response.SendResponse;
Замечание
Событие BeforeDispatch возникает прежде, чем Web-диспетчер приступит к обработке поступившего HTTP-запроса. Событие AfterDispatch возникает после того, как HTTP-ответ успешно сформирован, но еще не отослан. Эти события удобно использовать для выполнения соответственно инициализации и удаления различных ресурсов, необходимых для обработки запроса.