имя
атрибута
|
возможные
значения
|
смысл
|
примечания
|
NAME
|
строка
|
обязательно
|
ROWS
|
целое
|
количество линий видимого
текста
|
обязательно
|
COLS
|
целое
|
число, задающее видимую
ширину текста
|
обязательно
|
Программа просмотра не
должна интерпретировать атрибуты ROWS и COLS, как ограничивающие размер
действительного ввода. Броузер должен предоставить некоторые средства
скроллинга содержимого области вводимого текста, когда его размер выходит за
пределы видимой области.
Броузер может
перенести строку видимого текста, чтобы уложиться в длину строки видимого
текста без скроллинга.
Допустимый контекст
Текстовый контейнер,
т.е. любой элемент, который может включать текстовые элементы. Это включает большинство
элементов HTML. Однако, текстовый контейнер может появляться только в пределах
элемента FORM.
Содержимое
Строка. Escape последовательность
разрешена, однако никакие теги не распознаются.
Содержимое
используется для инициализации текста, который выводится в вводном поле при
первой загрузке документа.
Примеры
<TEXTAREA NAME=address ROWS=4
COLS=40>
Your address here...
</TEXTAREA>
Примечания
Смотрите обсуждение форм.
Для однострокового
поля ввода можно использовать элемент INPUT с TYPE=TEXT.
Форма будет правильно работать лишь в том случае,
если все вышеуказанные поля заключены между тегами <FORM>
</FORM> и каждому текстовому полю обязательно должно быть
присвоено имя NAME=..
Вот так форма отображается в браузере.
А вот HTML код этой формы
<form method="GET"
action="/Scripts/test/webshop.dll/addmsg">
<center>
<h2>Cервер "Электронный
магазин"</h2>
<h2>Оставьте ваше сообщение</h2>
<br><img
src="img/cls_dkbl.gif">
</center>
<h3>Введите Ваш адрес электронной
почты</h3>
<table>
<td>
<img src="img/bullet30.gif">
</td>
<td>
<input name="sender"
type="TEXT">
</td>
</table>
<TEXTAREA NAME="message" ROWS=5
COLS=60>Введите Ваши пожелания здесь</TEXTAREA>
<HR>
<img src="img/bullet30.gif">
<input type="SUBMIT"
value="Ввод">
<input type="RESET"
value="Отменить">
</form>
При
нажатии кнопки «Ввод» происходит событие SUBMIT и
содержание текстовых полей этой формы отправляется по адресу который указан в ACTION свойстве формы action="/Scripts/test/webshop.dll/addmsg . В
данном случае адрес указывает на динамическую библиотеку webshop.dll
загруженную на сервере и этой библиотеке передается команда addmsg тоесть
получить из текстового поля само сообщение пользователя , адрес его
электронной почты и записать эти данные в какой либо файл на сервере. Полный
вид запроса посылаемого серверу имеет следующий вид: webshop.dll/addmsg?sender=xxx@xxx&message=ccc Библиотека webshop.dll –называется ISAPI приложением
(ISAPI – Internet Services API). Именно обзору интерфейса ISAPI
будет посвящена следующая глава.
Место программирования в публикации данных таково.
Приемом и обработкой запросов от клиентов занимается WEB
сервер. Большая часть серверов Internet работает под управлением UNIX и
популярного на этой платформе сервера Apache, растет популярность платформы Windows NT Server и сервера Microsoft
Internet Information Server. Сервер
реализует поддержку протокала HTTP, принимая от браузеров клиентов запросы и
выдавая им в ответ те или иные WWW страницы. Но всех возможных запросов не
предусмотришь поэтому после после получения запроса сервер передает управление WEB –интерфейсу
БД (модулю расширения) . Чаще всего эти модули расширения называют сценариями
или скриптами (scripts). Задача такого скрипта - обработать запрос ,
извлечь из базы данных или другого внешнего источника нужную информацию,
оформить ее в виде HTML документа и передать ее обратно серверу,
который возьмет на себя труд отправить ее браузеру клента.
Первым и общепринятым интерфейсом для создания
модулей расширения является CGI (Common
Gateway Interface) ,
распространенный в Unix. Излюбленным
языком написания CGI скриптов
является PERL , хотя можно писать и на С, Basic и Delphi.
Microsoft
снабдила свой сервер Internet протоколом для взаимодействия с модулями
расширения ISAPI (ISAPI –
Internet Services API), по которому скрипт представляет собой динамическую
библиотеку, загружаемую сервером и работающую с ним в одном адресном
пространстве. Библиотека должна экспортировать вполне определенные функции (их
три: GetExtensionVersion , HttpExtensionProc, TerminateExtension), которые и
будут вызываться сервером . Одна библиотика может обрабатывать сколько угодно
запросов.
Пример сгенеренной ISAPI модулем HTML
страницы, выдающей ответ на
зпрос:
Исходный код ISAPI модуля на языке Delphi 4
unit webshopunit;
interface
uses
Windows, Messages, SysUtils, Classes,
HTTPApp, DBWeb, Db, DBTables;
type
TWebModule1 = class(TWebModule)
GroupQuery: TQuery;
WebSession: TSession;
StoreQTP: TQueryTableProducer;
GroupQueryMainGroup: TIntegerField;
GroupQuerySubGroup: TIntegerField;
GroupQueryGroupName: TStringField;
StoreQuery: TQuery;
ValidateQuery: TQuery;
AddMsgQuery: TQuery;
procedure
WebModule1GetGroupAction(Sender: TObject;
Request: TWebRequest; Response:
TWebResponse; var Handled: Boolean);
procedure WebModule1Create(Sender:
TObject);
CellColumn: Integer; var BgColor:
THTMLBgColor;
var Align: THTMLAlign; var VAlign:
THTMLVAlign; var CustomAttrs,
CellData: String);
procedure WebModule1Destroy(Sender:
TObject);
procedure
WebModule1ValidateAction(Sender: TObject;
Request: TWebRequest; Response:
TWebResponse; var Handled: Boolean);
procedure
StoreQTPGetTableCaption(Sender: TObject; var Caption: String;
var Alignment:
THTMLCaptionAlignment);
procedure
WebModule1AcceptOrderAction(Sender: TObject;
Request: TWebRequest; Response:
TWebResponse; var Handled: Boolean);
procedure
WebModule1SearchAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled:
Boolean);
procedure
WebModule1AddMSgAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled:
Boolean);
private
ScriptName: String;
{ Private declarations }
public
{ Public declarations }
function GroupListProducer(Query:
TQuery; Kind: Integer): string;
function CreateGroupList(Gr1,Gr2,Kind:Integer)
: string;
end;
var
WebModule1: TWebModule1;
resourcestring
sOrderAccepted = 'Tр° чрърч єёях°эю
яЁшэ Є';
sContent = '+уыртыхэшх';
implementation
uses inifiles;
{$R *.DFM}
var HTMLPath, TemplatesPath, DBAliasName,
iniName,CommonLook,CommonEnd : string;
UserStatus : Integer;
csect : TRTLCriticalSection;
procedure
TWebModule1.WebModule1Create(Sender: TObject);
var
ini : TINIFile;
FN: array[0..MAX_PATH- 1] of char;
s1,s2: string;
fs : TFileStream;
bgpath, txtcol, lcol,vcol,acol: string;
begin
GetWindowsDirectory(FN, SizeOf(FN));
s1:= StrPas(fn);
GetModuleFileName(hInstance, FN,
SizeOf(FN));
s2 := ExtractFileName(StrPas(fn));
if not (Char(s1[Length(s1)]) in
['/','\']) then AppendStr(s1,'/');
if Pos('.',s2)<>0 then s2 :=
Copy(s2,1,Pos('.',s2)-1);
iniName := s1+s2+'.ini';
ini := TINIFile.Create(iniName);
HTMLPath :=
ini.ReadString('Paths','HTMLPath','/test');
TemplatesPath :=
ini.ReadString('Paths','TemplatesPath',s1);
DBAliasName :=
ini.ReadString('Paths','DBAliasName','webtest');
if Assigned(WebSession) and
WebSession.IsAlias(DBAliasName) then
begin
GroupQuery.DatabaseName := DBAliasName;
StoreQuery.DatabaseName := DBAliasName;
ValidateQuery.DatabaseName :=
DBAliasName;
end;
bgpath :=
ini.ReadString('Design','Background','img\sand.jpg');
txtcol :=
ini.ReadString('Design','text','black');
lcol :=
ini.ReadString('Design','link','blue');
acol :=
ini.ReadString('Design','alink','aqua');
vcol := ini.ReadString('Design','vlink','aqua');
ini.Free;
CommonLook :=
Format('<HTML><BODY BACKGROUND="%s%s" TEXT=%s LINK=%s
ALINK=%s VLINK=%s>',
[HTMLPath,bgpath,txtcol,lcol,acol,vcol]);
CommonEnd :=
'</BODY></HTML>';
end;
procedure TWebModule1.WebModule1Destroy(Sender:
TObject);
;
end;
function
TWebModule1.GroupListProducer(Query: TQuery; kind: Integer): string;
var s: string;gn1,gn2: Integer;
begin
with Query do
try
Open;
Result := '';
First;
while not Eof do
begin
gn1 := Query.Fields[0].AsInteger;
gn2 := Query.Fields[1].AsInteger;
if Gn2=0 then s:='' else
s:=IntToStr(Gn2);
Result := Result + Format('<A
HREF="%s/GetGroup?Gr1=%d&Gr2=%d&Kind=%d">%d.%s
%s</A><BR>',
[Request.ScriptName, gn1,gn2,Kind,
gn1,s,Query.Fields[2].AsString]);
Next;
end;
finally
Close;
end;
end;
function
TWebModule1.CreateGroupList(Gr1,Gr2,Kind:Integer) : string;
var fs: TFileStream; i: Integer;
begin
Result := '<B><FONT
SIZE=+1>'+sContent+'<BR></FONT></B><HR>';
with GroupQuery do
begin
if Gr1=0 then
SQL.Text := 'SELECT * FROM Groups
WHERE SubGroup=0'
else
SQL.Text := Format('SELECT * FROM
Groups WHERE (MainGroup=%d) and (SubGroup>0)',[Gr1]);
try
Result := Result + GroupListProducer(GroupQuery,Kind);
if Gr1<>0 then
Result := Result + Format('<A
HREF="%s/GetGroup?Gr1=%d&Gr2=%d&Kind=%d">TхЁэєЄ№ё ъ
юуыртыхэш¦</A><BR>',
[Request.ScriptName, 0,0, Kind]);
except
on E:EDBEngineError do
begin
Result := Result + '+°шсър
BDE'+'<BR>';
for i:=0 to E.ErrorCount -1 do
Result := Result +
E.Errors[i].Message + '<BR>';
end;
end;
end;
Result := Result+'<HR><a
href="#"_Toc465077314">Библиографический список.
1. Компьютер Пресс N2 1997г.
2. П. Дарахвелидзе, Е. Марков
«Программирование в Delphi
4»
3. Компьютер Пресс N4 1997г.
4. Компьютер Пресс N5 1998г.
5. Computer Week Москва N4(210) 1999г.
6. Computer Week Москва N17(223) 1996г.
7. Computer Week Москва N18(224) 1998г.
8. Компьютерра N15(142) 1996.