Подробнее о приложении WapMail.hdml
Подробнее о приложении WapMail.hdml
Как и приложение формата WML, файл WapMail.hdml позволяет пользователюпосылать сообщения электронной почты по всему миру. Файл WapMail.hdml такжесвязан со сценарием языка Perl, содержание которого практически идентичносценарию WapMail.pl. Дека WapMail.hdml имеет следующий исходный код:
<HDML Version=3.0 Markable=True TTL=0>
<Entry Name=Start Format=*m Key=ReplyTo Default="">
<Action Type=Accept Task=GO Dest=#GetTo>
<Center>WAP Mail <br><br>Reply To:
</Entry>
<Entry Name=GetTo Format=*m Key=SendTo Default="">
<Action Type=Accept Task=GO Dest=#GetSubject>
<Center>WAP Mail <br><br>Send To:
</Entry>
<Entry Name=GetSubject Format=*M Key=MsgSubject Default="">
<Action Type=Accept Task=GO Dest=#GetText>
<Center>WAP Mail <br><br>Subject:
</Entry>
<Entry Name=GetText Format=*M Key=MsgText Default="">
<Action Type=Accept Task=GO Dest=#Confirm>
<Center>WAP Mail <br><br>Message:
</Entry>
<Display Name=Confirm>
<Action Type=Accept Task=GO Label=Send Method=Post PostData=$(ReplyTo:noesc)&$(SendTo:noesc) &$(MsgSubject:noesc)&$(MsgText:noesc) Dest=../waplibcgi/WapMailHDML.pl>
<Center>WAP Mail <br>Reply-To: $(ReplyTo) <br>To: $(SendTo) <br>Subject: $(MsgSubject) <br>Text: $(MsgText)
</Display>
</HDML>
Первый элемент внутри деки сообщает браузеру (или другим программистам),какая версия языка HDML используется приложением. Далее, выражение Markable=True сообщает браузеру, что он может установить закладку в исходной деке,a TTL=0 сообщает о невозможности кэширования (таким образом, браузер должен перезагружать эту деку каждый раз при обращении к нему пользователя).
Дека использует те же имена переменных, что и дека формата WML - SendTo, ReplyTo, MsgSubject и MsgText. Для обеспечения пользователю ввода информациииспользуется элементы <Entry>, которые также определяют формат вводимыхданных.
Снова форматы *м и *т позволяют вводить любые символы, числа и алфавитно-цифровые знаки, причем *М - по умолчанию считает первый символ символомверхнего регистра, *т - по умолчанию символом нижнего регистра.
После того как пользователь введет данные, приложение передает управлениекарте Confirm, которая отображает приглашение нажать кнопку Send. Если Sendнажата, приложение запускает сценарий языка Perl WapMailHDML.pl, который ивыполняет основную обработку данных.
Подробнее о приложении WapMail.wml
Подробнее о приложении WapMail.wml
Когда вы запустите приложение WapMail, дека WapMail.wml отобразит пользователю приглашение ввести адрес для ответа, электронный адрес получателя, темусообщения и сам текст сообщения. После того как пользователь введет всю этуинформацию, приложение запустит сценарий языка Perl WapMailWML.pl, которыйи перешлет это сообщение электронной почты. Дека WapMail.wml имеет следующий исходный код:
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head>
<card id="WAPMail" title="WAP Mail">
<onevent type="onenterforward">
<refresh> <setvar name="SendTo" value="" /> <setvar name="MsgSubject" value="" /> <setvar name="MsgText" value="" /> </refresh>
</onevent>
<onevent type="onenterbackward">
<refresh> <setvar name="SendTo" value="" /> <setvar name="MsgSubject" value="" /> <setvar name="MsgText" value="" /> </refresh>
</onevent>
<do type="accept"> <go href="#Confirm" /> </do>
<p align="center">
WAP Mail<br/>
</p>
<p align="left">
Reply To: <input name="ReplyTo" type="text" format="*m" />
</p>
<p align="center">
WAP Mail<br/>
</p>
<p align="left">
Send To: <input name="SendTo" type="text" format="*m" />
</p>
<p align="center">
WAP Mail<br/>
</p>
<p align="left">
Subject: <input name="MsgSubject" type="text" format="*M" />
</p>
<p align="center">
WAP Mail<br/>
</p>
<p align="left">
Message: <input name="MsgText" type="text" format="*M" />
</p>
</card>
<card id="Confirm">
<do type="accept" label="Send"> <go method="post" href="../waplibcgi/WapMailWML.pl"> <postfield name="ReplyTo" value="$(ReplyTo)&"/> <postfield name="SendTo" value="$(SendTo)&"/> <postfield name="MsgSubject" value="$(MsgSubject)&"/> <postfield name="MsgText" value="$(MsgText)"/> </go> </do>
<p align="center">
WAP Mail
</p>
<p align="left" mode="wrap">
Reply-To: $(ReplyTo) <br/>To: $(SendTo) <br/>Subject: $(MsgSubject) <br/>Text: $(MsgText)
</p>
</card>
</wml>
Так же как и во всех деках формата WML, первые два ее элемента сообщают браузеру, какую из версий спецификации WAP поддерживает данное приложение. Внашем случае WML-страница поддерживает версию 1.0 языка XML и версию 1.1описания типа документа (DTD), разработанного ассоциацией WAP Forum.
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
Далее, за информацией о версиях, каждый WML-файл начинается с тега <wml>. Вконце каждого файла вводят </wml>, что означает окончание исходного кодаприложения.
За <wml> следуют теги <head> и </head>, внутри которых находитсяинформация о самом исходном коде, включая метаданные и информацию обуправлении доступом. Многие программисты называют метаданные «данными оданных». Другими словами, в этом случае метаданные, которые считывает и обрабатывает браузер, сообщают ему, как трактовать данные.
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head>
Элемент <meta> позволяет точно определить метаинформацию для исходногофайла. В нашем случае строка http-eguiv="Cache-Control" сообщает браузеруWAP, что эта часть метаинформации используется системой кэширования памяти. Аналогично, строка content=max-age=0 сообщает браузеру, что максимальноевремя, в течение которого будет кэшироваться этот файл, равно нулю секунд;значит, браузер не будет кэшировать данные, а загружать данные с сервера каждый раз, когда они будут запрошены. Для этой книги значение нуля было выбрано для содействия процессу обучения читателя. При выборе нуля каждый раз,когда будут происходить изменения, они будут передаваться на телефон. В реальном приложении статическое меню, подобное этому, можно использовать поумолчанию в течение 30 дней. Последняя строка forua="true" определяет, чтозначение Cache-Control предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.
Для отслеживания пользовательской информации приложение использует четыре переменные: ReplyTo, SendTo, MsgSubject, MsgText. За информацией заголовка деки следуют два элемента <onevent> для очистки значений переменныхSendTo, MsgSubject, MsgText в случае, если пользователь будет двигаться впередили назад по приложению, используя команды <до> и <prev>. Приложение считает адрес ReplyTo неменяющимся и поэтому не производит очистку соответствующей переменной каждый раз.
Как вы уже поняли по Главе 9, событие Onenterforward происходит, когдапользователь перемещается к карте деки с помощью команды <до>.
Аналогично,когда пользователь использует команду <prev>, происходит событие
пользователь использует команду <prev>, происходит событие Onenterbackward. После того как приложение передает сообщение сценарию языка Perl, сценарийиспользует элемент <до> для возврата в начало для того, чтобы пользовательсмог, если желает, послать еще одно сообщение.
Далее, в исходном коде деки следуют элементы <input> для определения формата четырех описанных выше переменных. Элементы <input> внутри деки записаны в том же порядке, в котором они появляются на дисплее. Заметьте также,что элементы <input> определяют формат для каждой из переменных. Формат*М позволяет вводить алфавитно-цифровые знаки смешанного регистра, числаили имена, начинающиеся, по умолчанию, со знака в верхнем регистре. Вообще,оба форматы *М и *т позволяют вводить имена, числа и алфавитно-цифровыезнаки, причем М - по умолчанию первый символ верхнего регистра, m - по умолчанию первый символ нижнего регистра.
После ввода пользователем всех данных, приложение передает управление картеConfirm (Подтверждение), которая отображает сообщение о данных, предназначенных для пересылки. После выбора пользователем опции Send, карта пересылает данные сценарию языка Perl WapMailWML.pl.
Подробнее о сценарии языка Perl WapMail.pl
Подробнее о сценарии языка Perl WapMail.pl
Как было сказано выше, когда пользователь выбирает опцию Send, приложениеWapMail.wml вызывает сценарий языка Perl, который и пересылает сообщениеэлектронной почты выбранному пользователю. Далее сценарий создает новуюдеку формата WML, которая запускается в браузере протокола WAP и отображаетсообщение об успешной пересылке сообщения. Как вы увидите, для пересылкисообщения сценарий просто использует программу пересылки почты ОС Unix.Исходный код сценария WapMailWML.pl приведен ниже:
#!/usr/bin/perl
require 'DeckUtils.pl';
$mailprog = "/bin/sendmail";
# Get the CGI variables. %cgiVars = &AppUtils::ParseCGIVars(); $ReplyTo = $cgiVars{"ReplyTo"}; $SendTo = $cgiVars{"SendTo"}; $MsgSubject = $cgiVars{"MsgSubject"}; $MsgText = $cgiVars{"MsgText"};
open(MAIL, "|$mailprog $SendTo");
print MAIL "Reply-To: $ReplyTo\n"; print MAIL "From: Demo\@waplib.com\n"; print MAIL "To: $SendTo\n"; print MAIL "Subject: $MsgSubject\n\n";
print MAIL "$MsgText\n";
close(MAIL);
print "Content-type: text/vnd.wap.wml\n\n"; print "<?xml version=\"1.0\"?>\n"; print "<!DOCTYPE wml PUBLIC \"- //WAPFORUM//DTD WML 1.1//EN\"\n"; print "\"http://www.wapforum.org /DTD/wml_1.1.xml\">\n\n"; print "<wml>\n"; print "<card>\n"; print "<do type=\"accept\">\n"; print "<go href=\"../WapMail/WapMail.wml\" />\n"; print "</do>\n"; print "<p align=\"left\">\n"; print "Message has been sent to:<br/>\n"; print "$SendTo\n"; print "</p>\n"; print "</card>\n"; print "</wml>\n";
Если вы внимательно проанализируете элемент open, вы увидите, что символуmailprog предшествует знак конвейера "|".
Имя mailprog является просто указателем на программу пересылки почты. Приложение использует знак конвейера"|", потому что открывает программу и передает ей данные по конвейеру посредством print
Первая строка сценария является всего лишь комментарием, сообщающим интерпретатору командной строки, где находится интерпретатор языка Perl. Втораястрока сообщает этому интерпретатору, что исходный сценарий требует другойсценарий DeckUtils.pl из SDK и содержит функцию ParseCGIVars, которая извлекает пары данных имя/значение, передаваемые сценарию из карты Confirm. Далее сценарий для сокращения записи присваивает переменной mailprog строковое значение полного пути к программе
Приложение анализирует список параметров (которые передаются из картыConfirm) и присваивает извлеченные значения переменным SendTo, ReplyTo,MsgSubject и MsgText. Далее, приложение запускает почтовую программу и использует print для адресации сообщения, ввода текста сообщения и так далее.Как вы видите, приложение присваивает значение ReplyTo заодно и значениюFrom сообщения. Значение From сообщает приложению, что оно было послано отDemo@waplib.com (вы можете изменить это значение, ссылаясь на свой собственный сайт в Сети). Значение ReplyTo, в отличие от From, определяет адрес, покоторому будет передан ответ, если получатель сообщения захочет на него ответить (значение ReplyTo соответствует значению, введенному пользователем призапуске приложения).
После того как сценарий закрывает почтовую программу, она пересылает сообщение получателю. Далее, сценарий создает новую деку, сообщающую об успешной пересылке сообщения.
Подробнее о сценарии языка Perl WapMailHDML.pl
Подробнее о сценарии языка Perl WapMailHDML.pl
После того как пользователь введет все данные для посылки сообщения электронной почты внутри приложения WapMail.hdml, оно пересылает данные сценариюWapMailHDML.pl, который и осуществляет посылку сообщения. Очевидно, что элементы для пересылки сообщения в сценарии WapMailHDML.pl аналогичны использующимся в сценарии, описанном выше в этой главе. Они приведены ниже:
#!/usr/bin/perl
$mailprog = "/bin/sendmail";
read (STDIN, $Buffer, $ENV{'CONTENT_LENGTH'});
@data = split(/&/, $Buffer);
$ReplyTo = $data[0]; $SendTo = $data[1]; $MsgSubject = $data[2]; $MsgText = $data[3];
open(MAIL, "|$mailprog $SendTo");
print MAIL "Reply-To: $ReplyTo\n"; print MAIL "From: Demo\@waplib.com\n"; print MAIL "To: $SendTo\n"; print MAIL "Subject: $MsgSubject\n\n";
print MAIL "$MsgText\n";
close(MAIL);
print "Content-type: text/x-hdml\n\n"; print "<HDML Version=3.0 Markable=True TTL=0>\n\n"; print "<Display>\n"; print "<Action Type=Accept Task=GO Dest=../WapMail /WapMail.hdml"; print " Vars=SendTo=&MsgSubject=&MsgText=>"; print "Message has been sent to:<br>\n"; print "$SendTo\n"; print "</Display>\n"; print "</HDML>\n";
Если вы сравните описанные сценарии, то, как и в Главе 9, вы увидите, что онипо-разному анализируют данные передаваемых им параметров. Это происходитпотому, что элемент postf ield языка WML работает не так, как элемент postdataязыка HDML. Как было сказано в Главе 9, postf ield передает параметры парамиимя/значение. В отличие от него элемент postdata передает только значенияданных. Это означает, что приложение должно знать, в какой последовательности передаются данные. Как вы можете видеть, сценарий просто анализируетданные параметров, создает и пересылает сообщения электронной почты, и после этого создает новую деку формата HDML, которая информирует пользователяоб успешной передаче сообщения.
Приглашение к вводу адресадля ответа
Рисунок 10.1. Приглашение к вводу адресадля ответа
Ввод адреса электронной почтиполучателя
Рисунок 10.2. Ввод адреса электронной почтиполучателя
Ввод текста сообщения
Рисунок 10.4. Ввод текста сообщения
Для того чтобы запустить приложение WapMail из своей собственной системы, вы должны использовать операционную систему Unixили Linux. Вы можете также запустить это приложение с сайтаwaplib.com.