Пособие по написанию WAP сайтов
ГЛАВА 12
Подробнее о приложении PackageTracker
Подробнее о сценарии языка Perl PackageWML.pl
Подробнее о приложении Ptracker.hdml
Подробнее о сценарии языка Perl PackageHDML.pl
Если ваша компания рассылает свои продукты производства покупателям илиотдаленным получателям, всегда важно знать, получил ли адресат посылку илиона задержалась в пути. Приложение PackageTracker (Отслеживание посылок)сочетает в себе файлы формата WML и сценарий языка Perl для того чтобы позволить пользователю видеть информацию о выбранной им посылке. Когда пользователь запускает приложение, ему предлагается ввести номер, присвоенный посылке авиакомпанией, как показано на Рис. 12.1 (в нашем случае приложениереагирует только на один такой номер: AD12345).
Используя клавиши телефона, пользователь вводит присвоенный посылке номер. После ввода и подтверждения правильности информации, приложениеотобразит текущиее состояние посылки, как показано на Рис. 12.2.
Если вы еще не установили пакет инструментальныхсредств для разработки программного обеспечения (SDK)для WAP, например, с сайта www.openwave.com, можнопротестировать приложение PackageTracker, используя сотовый телефон, поддерживающий протокол WAP. Для этогос помощью телефона необходимо набрать адресwaplib.com/PackageTracker/PackageTracker.hdml, если браузертелефона поддерживает язык HDML. Если браузер поддерживает язык WML, то надо ввести адрес waplib.com/PackageTracker/PackageTracker.wml.
Подробнее о приложении PackageTracker
Подробнее о приложении PackageTracker
Когда пользователь запускает приложение PackageTracker, дека Ptracker.wml предлагает пользователю ввести номер, присвоенный посылке авиакомпанией. Послеего ввода и подтверждения правильности, дека загружает сценарий языка Perl(файл PackageWML.pl). Дека Ptracker.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="Tracker" title="Package Tracker">
<onevent type="onenterforward">
<refresh> <setvar name="ABNum" value="" /> </refresh>
</onevent>
<onevent type="onenterbackward">
<refresh> <setvar name="ABNum" value="" /> </refresh>
</onevent>
<p align="center">
Package<br/> Tracker<br/>
</p>
<p align="left">
AirBill Number: <input name="ABNum" maxlength="7" title="Air Bill Number" type="text" format="AANNNNN" />
</p>
<p align="left">
Package ID#:<br/> $(ABNum)<br/>
<select> <option onpick="../waplibcgi/PackageWML.pl? $(ABNum)">Track</option> <option onpick="#Tracker">Clear</option> </select>
</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 предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.
Далее за элементами заголовка в деке определяется единственная карта, котораяв нашем случае называется Tracker. Основной задачей этой карты является предоставление пользователю возможности ввода номера посылки. Внутри картыиспользуются два элемента <onevent>, которые обрабатывают нажатие пользователем кнопок <до> и <prev>. Исходный код обработки события каждый разпросто переинициализирует переменную ABNum (номер посылки), присваивая ейзначение ноль. Далее в карте используется элемент <input> для ввода номерапосылки. Заметьте, что в <input> определяется формат AANNNNN, который позволяет пользователю ввести перед пятью цифрами два алфавитно-цифровых символа.
После ввода номера посылки приложение вызывает сценарий языка PerlPackageWML.pl.
Подробнее о приложении Ptracker.hdml
Подробнее о приложении Ptracker.hdml
Как и приложение формата WML, файл Ptracker.hdml позволяет увидеть текущеесостояние выбранной им посылки на дисплее своего переносного устройства(в нашем случае сотового телефона). Этот файл имеет следующий исходный код:
<HDML Version=3.0 Markable=True TTL=0>
<Entry Name=Tracker Format=AANNNNN Key=ABNum Default="">
<Action Type=Accept Task=GO Dest=#Confirm>
<Center>Package<BR> <Center>Tracker<BR><BR> AirBill Number:
</Entry>
<Choice Name=Confirm Key=ABNum Method=Alpha>
Package ID#: $(ABNum)
<CE Label=Track Task=GO Method=Post PostData=$(ABNum) Dest=../waplibcgi/PackageHDML.pl>Track
<CE Task=GO Dest=#Tracker Label=Clear Value="">Clear
</Choice>
</HDML>
Первый элемент внутри деки сообщает браузеру (или другим программистам), какая версия языка HDML используется приложением. Далее, выражение Markable=True сообщает браузеру, что он может установить закладку в исходной деке, аTTL=0 сообщает браузеру о невозможности кэширования (таким образом, ему необходимо перегружать эту деку каждый раз при обращении к нему пользователя).
Как вы видите, приложение использует элемент <Entry> для приглашения пользователя к вводу номера посылки. Снова используется формат AANNNNN для вводаперед пятью числами двух алфавитно-цифровых символов. Как и в предыдущемслучае, приложение запоминает значение номера посылки в переменной ABNum.
После ввода и подтверждения номера посылки, приложение вызывает сценарийязыка Perl PackageHDML.pl.
Подробнее о сценарии языка Perl PackageHDML.pl
Подробнее о сценарии языка Perl PackageHDML.pl
Как было сказано выше, после ввода пользователем номера посылки в файлеPtracker.hdml, приложение передает данные сценарию языка Perl PackageHDML.pl.Очевидно, что для отображения информации о статусе посылки в этом сценариииспользуются практически идентичные элементы, что и в описанном выше вэтой главе сценарии. Если пользователь вводит номер посылки AD12345, сценарий загружает файл AD12345.hdml, который имеет следующий исходный код:
<HDML Version=3.0 TTL=0>
<Display>
<ACTION Type=Accept Task=GO Dest=../PackageTracker/PTracker.hdml Vars=ABNum=>
<Center>Package<BR> <Center>Tracker<BR>
<Line>Package AD12345<BR> <Line>Pickup LAS 11/13/99 12:30 <Line>Left LAS 11/13/99 15:00 <Line>Arrive HOU 11/13/99 21:00 <Line>Delivered 11/14/99 09:00
</Display>
</HDML>
В исходном коде просто используются элементы <Line> для отображения информации о посылке. После просмотра пользователем выведенной информации,элемент <Action> в коде позволяет пользователю вернуться в начало приложения PackageTracker.
Как и в предыдущем случае, если пользователем введен неправильный номер посылки, сценарий языка Perl загружает файл BadlD.hdml, исходный код которогоприведен ниже:
<HDML Version=3.0 TTL=0>
<Display>
<ACTION Type=Accept Task=GO Dest=../PackageTracker/PTracker.hdml Vars=ABNum=>
<Center>Package<BR> <Center>Tracker<BR>
<BR>Unknown Package ID. Try again. <BR><BR>For this demo the only valid Package ID is AD12345
</Display>
</HDML>
Подробнее о сценарии языка Perl PackageWML.pl
Подробнее о сценарии языка Perl PackageWML.pl
Как было сказано, каждый раз после ввода пользователем номера посылки, декаPtracker.wml загружает сценарий языка Perl, который и отображает информациюо текущем статусе посылки или отображает сообщение о том, что такой посылкине существует (ошибка). Исходный код сценария PackageWML.pl приведен ниже:
#!/usr/bin/perl
print "Content-type: text/vnd.wap.wml\n\n";
$Buffer = $ENV{'QUERY_STRING'};
if ($Buffer eq "AD12345") { $FileName = "../PackageTracker/AD12345.wml"; } else { $FileName = "../PackageTracker/BadID.wml"; }
open (PackageInfo, $FileName);
while (<PackageInfo>) { print; }
close (PackageInfo);
Первая строка сценария является всего лишь комментарием, сообщающим интерпретатору командной строки, где находится интерпретатор языка Perl. Втораястрока сообщает браузеру протокола WAP о том, что после окончания работысценария на выходе будет создан исходный код формата WML. Далее, в исходномкоде используется функция $ENV для определения номера посылки, который декаформата WML передает сценарию как параметр.
После этого в коде используется последовательность операторов if-else дляопределения введенного пользователем номера (номер может быть толькоAD12345, единственный распознаваемый нашим приложением). Если пользователем введен именно этот номер посылки, то загружается дека AD12345.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>
<do type="accept"> <go href="../PackageTracker/PTracker.wml"/> </do>
<p align="center">
Package<br/> Tracker<br/> </p>
<p align="left" mode="nowrap">
Package AD12345<br/> Pickup LAS 11/13/99 12:30<br/> Left LAS 11/13/99 15:00<br/> Arrive HOU 11/13/99 21:00<br/> Delivered 11/14/99 09:00<br/>
</p>
</card>
</wml>
В коде просто используются элементы <р> для отображения информации о посылке. В реальном приложении, в исходном его коде должен осуществляться поиск информации о посылке в базе данных, и дека, подобная описанной, создаваться в процессе работы сценария.
Если пользователь вводит неправильный номер посылки, приложение загружаетдеку BadlD.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>
<do type="accept"> <go href="../PackageTracker/PTracker.wml"/> </do>
<p align="center">
Package<br/> Tracker<br/>
<br/>Unknown Package ID. Try again. <br/><br/>For this demo the only valid Package ID is AD12345
</p>
</card>
</wml>
Снова исходный код деки использует тег абзаца <р> для вывода сообщения обошибке.
Приглашение к вводу номерапосылки
Рис.. 12.1. Приглашение к вводу номерапосылки
Отображение текущегосостояния посылки
Рис.. 12.2. Отображение текущегосостояния посылки