Пособие по написанию WAP сайтов
ГЛАВА 11
Подробнее о приложении FlightSchedule.wml
Подробнее о сценарии языка Perl FlightScheduleWML.pl
Подробнее о приложении FlightSchedule.hdml
Подробнее о сценарии языка Perl FlightScheduleHDML.pl
Если вы путешествуете сами, или близко знакомы с кем-то, кто путешествует регулярно, вы знаете, как бывает важно владеть информацией о времени вылетов ивозможных задержках рейсов. Приложение FlightSchedule (Расписание полетов),состоящее из нескольких файлов формата WML и сценария языка Perl, позволяетотображать информацию о полетах для пользователя. Когда приложение запускается, сотовый телефон пользователя отображает список авиакомпаний, какпоказано на Рис. 11.1. Используя клавиши «вверх» и «вниз» телефона, пользователь может двигаться по списку авиакомпаний, выбирая необходимую. Послевыбора авиакомпании пользователю будет предложено ввести номер рейса, какпоказано на Рис. 11.2. Если введенный номер является правильным, на дисплеетелефона будет отображено текущее состояние рейса, как показано на Рис. 11.3.
Если вы еще не установили пакет инструментальных средствдля разработки программного обеспечения (SDK) для WAP, например, с сайта www.openwave.com, можно протестировать приложение FlightSchedule, используя сотовый телефон, поддерживающий протокол WAP. Для этого с помощью телефона необходимонабрать адрес waplib.com/FlightSchedule/FlightSchedule.hdml,если браузер телефона поддерживает язык HDML. Если браузерподдерживает язык WML, то надо ввести адресwaplil3.com/FlightSchedule/FlightSchedule.wml.
Подробнее о приложении FlightSchedule.hdml
Подробнее о приложении FlightSchedule.hdml
Как и приложение формата WML, файл FlightSchedule.hdml позволяет пользователю определить состояние выбранного рейса, используя переносное устройство(в нашем случае сотовый телефон). Этот файл имеет следующий исходный код:
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=GetAirline1 Key=AirCode>
<Action Type=Accept Task=GO Dest=#GetFlightNum>
<Center>Flight Schedule <br><Line>Airline:
<CE Value=SU>Aeroflot <CE Value=AC>Air Canada <CE Value=AF>Air France <CE Value=NZ>Air New Zealand <CE Value=AS>Alaska Airlines <CE Value=AQ>Aloha Airlines <CE Value=HP>America West <CE Value=AA>American Airlines <CE Value=TZ>American Trans Air <CE Task=GO Dest=#GetAirline2>...More
</Choice>
<Choice Name=GetAirline2 Key=AirCode>
<Action Type=Accept Task=GO Dest=#GetFlightNum> <Action Type=Soft1 Label=Back Task=GO Dest=#GetAirline1>
<Center>Flight Schedule <br><Line>Airline:
<CE Value=CO>Continental <CE Value=DL>Delta Airlines <CE Value=LH>Lufthansa <CE Value=JL>Japan Airlines <CE Value=KL>KLM Royal Dutch <CE Value=NW>Northwest Airlines <CE Value=QF>Qantas Airlines <CE Value=QQ>Reno Air <CE Value=SR>SwissAir <CE Task=GO Dest=#GetAirline3>...More
</Choice>
<Choice Name=GetAirline3 Key=AirCode>
<Action Type=Accept Task=GO Dest=#GetFlightNum> <Action Type=Soft1 Label=Back Task=GO Dest=#GetAirline2>
<Center>Flight Schedule <br><Line>Airline:
<CE Value=TW>TWA <CE Value=UA>United Airlines <CE Value=US>USAir <CE Value=VS>Virgin Atlantic
</Choice>
<Entry Name=GetFlightNum Format=5N Key=FlightNum Default="">
<Action Type=Accept Task=GO Label=Find Method=Post PostData=$(AirCode)&$(FlightNum) Dest=../waplibcgi/FlightScheduleHDML.pl>
Flight Number:
</Entry>
</HDML>
Первый элемент внутри деки сообщает браузеру (или другим программистам), какая версия языка HDML используется приложением. Далее выражение Markable=True сообщает браузеру, что он может установить закладку в исходной деке, атть=0 сообщает ему о невозможности кэширования (таким образом, браузер должен перегружать эту деку каждый раз при обращении к нему пользователя).
Как вы видите, для отображения списка авиакомпаний, приложение используетэлемент <Choice>. Внутри <Choice> используется элемент <Action> для определения места в деке, куда приложение передает управление, когда пользовательпроизводит выбор авиакомпании. В отличие от версии формата WML, где используются два отдельных файла (один для получения названия авиакомпании иодин для получения номера рейса), в версии приложения формата HDML используется только один файл. Если вы подробнее изучите приложение, вы заметите,что в элементе <Choioe> с именами GetAirline2 и GetAirlineS используетсяэлемент <Action>, который определяет место в деке, куда передается управлениепосле того как пользователь нажимает кнопку Back (Назад).
После выбора пользователем авиакомпании в исходном коде осуществляется переход к элементу GetFlightNum, который предлагает пользователю ввести номеррейса и загружает сценарий языка Perl FlightScheduleHDML.pl.
Подробнее о приложении FlightSchedule.wml
Подробнее о приложении FlightSchedule.wml
Когда пользователь запускает приложение FlightSchedule, дека FlightSchedule.wmlотображает список авиакомпаний, из которого пользователь может сделать свойвыбор. После ввода названия авиакомпании, в приложении предлагается ввестиномер рейса и затем подключается сценарий языка Perl (файл FlightSchedule.pl).Дека FlightSchedule.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="GetAirline1">
<onevent type="onenterforward">
<refresh>
<setvar name="AirCode" value="" /> <setvar name="FlightNum" value="" />
</refresh>
</onevent>
<onevent type="onenterbackward">
<refresh>
<setvar name="AirCode" value="" /> <setvar name="FlightNum" value="" />
</refresh>
</onevent>
<do type="accept"> <go href="GetFlightNum.wml" /> </do>
<p align="center">
Flight Schedule<br/>
</p>
<p align="left" mode="nowrap">
Airline:
<select name="AirCode">
<option value="SU">Aeroflot</option> <option value="AC">Air Canada</option> <option value="AF">Air France</option> <option value="NZ">Air New Zealand</option> <option value="AS">Alaska Airlines</option> <option value="AQ">Aloha Airlines</option> <option value="HP">America West</option> <option value="AA">American Airlines</option> <option value="TZ">American Trans Air</option> <option onpick="#GetAirline2">...More</option>
</select>
</p>
</card>
<card id="GetAirline2">
<onevent type="onenterforward">
<refresh>
<setvar name="AirCode" value="" /> <setvar name="FlightNum" value="" />
</refresh>
</onevent>
<onevent type="onenterbackward">
<refresh>
<setvar name="AirCode" value="" /> <setvar name="FlightNum" value="" />
</refresh>
</onevent>
<do type="accept"> <go href="GetFlightNum.wml" /> </do>
<do type="options" label="Back"> <go href="#GetAirline1" /> </do>
<p align="center">
Flight Schedule<br/>
</p>
<p align="left" mode="nowrap">
Airline:
<select name="AirCode">
<option value="CO">Continental</option> <option value="DL">Delta Airlines</option> <option value="LH">Lufthansa</option> <option value="JL">Japan Airlines</option> <option value="KL">KLM Royal Dutch</option> <option value="NW">Northwest Airlines</option> <option value="QF">Qantas Airlines</option> <option value="QQ">Reno Air</option> <option value="SR">SwissAir</option> <option onpick="#GetAirline3">...More</option>
</select>
</p>
</card>
<card id="GetAirline3">
<onevent type="onenterforward">
<refresh>
<setvar name="AirCode" value="" /> <setvar name="FlightNum" value="" />
</refresh>
</onevent>
<onevent type="onenterbackward">
<refresh>
<setvar name="AirCode" value="" /> <setvar name="FlightNum" value="" />
</refresh>
</onevent>
<do type="accept"> <go href="GetFlightNum.wml" /> </do>
<do type="options" label="Back"> <go href="#GetAirline2" /> </do>
<p align="center">
Flight Schedule<br/>
</p>
<p align="left" mode="nowrap">
Airline:
<select name="AirCode">
<option value="TW">TWA</option> <option value="UA">United Airlines</option> <option value="US">USAir</option> <option value="VS">Virgin Atlantic</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 предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.
Далее, за элементами заголовка в деке определяется первая карта, которая в нашем случае называется GetAirlinel. Основной задачей этой карты является предоставление пользователю возможности произвести выбор из списка авиакомпаний. Цифра 1 в конце имени этой карты сообщает о том, что она первая изтрех подобных карт. Приложению требуется много подобных карт для обработкивыбора пользователя из-за большого числа авиакомпаний.
Внутри каждой карты GetAirline приложение использует два элемента<onevent>, которые обрабатывают выбор пользователем кнопок <до> или<prev>. В каждом из случаев код обработки этих событий просто переинициализирует переменные AirCode (Код авиакомпании) и FlightNum (Номер рейса),присваивая им значения нуля. После этого в каждой из карт используется элемент <Select> для отображения списка авиакомпаний и для обработки выборапользователя.
После выбора пользователем желаемой авиакомпании приложение загружаетдеку GetFMghtNum.wml, которая предлагает пользователю ввести номер рейса изатем загружает сценарий языка Perl FlightScheduleWML.pl. Исходный код декиGetFlightNurn.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="GetFlightNum">
<do type="accept" label="Find">
<go method="post" href="../waplibcgi/FlightScheduleWML.pl"> <postfield name="AirCode" value="$(AirCode)&"/> <postfield name="FlightNum" value="$(FlightNum)"/> </go>
</do>
<p align="left">
Flight Number: <input name="FlightNum" maxlength="5" format="*N" />
</p>
</card>
</wml>
Как вы видите, в исходном коде используется элемент <input> для предоставления пользователю возможности ввода номера рейса. В этом элементе поле тахlength ограничивает количество вводимых знаков до пяти. Аналогично, формат*N позволяет пользователю вводить только числовые данные. После ввода пользователем желаемой информации о полетах, дека использует элемент <do> дляподключения сценария FlightScheduleWML.pl, который описан ниже.
Подробнее о сценарии языка Perl FlightScheduleHDML.pl
Подробнее о сценарии языка Perl FlightScheduleHDML.pl
Как было описано выше, когда пользователь производит выбор авиакомпании иопределяет номер рейса в файле FlightSchedule.hdml, приложение пересылаетданные сценарию FlightScheduleHOML.pl. Как вы понимаете, элементы в исходномкоде для отображения информации о рейсе этого сценария практически идентичны элементам сценария, описанного ранее в этой главе. Описанные нижеоператоры языка Perl создают исходный код формата HDML, который используется браузером для отображения информации о рейсе или сообщения об ошибке(если номер рейса неправильный):
#!/usr/bin/perl
read (STDIN, $Buffer, $ENV{'CONTENT_LENGTH'});
@data = split(/&/, $Buffer);
$AirCode = $data[0]; $FlightNum = $data[1];
if ($AirCode eq "SU") { $AirName = "Aeroflot";
if ($FlightNum eq "1") { $ArriveCity = "Moscow"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "New York"; $ArriveTime = "6:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AC")
{ $AirName = "Air Canada";
if ($FlightNum eq "1") { $ArriveCity = "New York"; $ArriveTime = "10:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Boston"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AF")
{ $AirName = "Air France";
if ($FlightNum eq "1") { $ArriveCity = "Paris"; $ArriveTime = "9:45 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "London"; $ArriveTime = "11:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "NZ")
{ $AirName = "Air New Zealand";
if ($FlightNum eq "1") { $ArriveCity = "Auckland"; $ArriveTime = "8:50 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Sydney"; $ArriveTime = "9:00 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AS")
{ $AirName = "Alaska Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Portland"; $ArriveTime = "6:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Las Vegas"; $ArriveTime = "7:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AQ")
{ $AirName = "Aloha Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Hilo"; $ArriveTime = "11:15 am"; } elsif ($FlightNum eq "2") { $ArriveCity = "Los Angeles"; $ArriveTime = "9:45 pm"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "HP")
{ $AirName = "America West";
if ($FlightNum eq "1") { $ArriveCity = "Las Vegas"; $ArriveTime = "10:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "PHoenix"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AA")
{ $AirName = "American Airlines";
if ($FlightNum eq "1") { $ArriveCity = "New York"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Phoenix"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "TZ")
{ $AirName = "American Trans Air";
if ($FlightNum eq "1") { $ArriveCity = "Chicago"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "San Francisco"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "CO")
{ $AirName = "Continental";
if ($FlightNum eq "1") { $ArriveCity = "Boston"; $ArriveTime = "6:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Los Angeles"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "DL")
{ $AirName = "Delta";
if ($FlightNum eq "1") { $ArriveCity = "Atlanta"; $ArriveTime = "7:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Las Vegas"; $ArriveTime = "8:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "LH")
{ $AirName = "Lufthansa";
if ($FlightNum eq "1") { $ArriveCity = "Berlin"; $ArriveTime = "9:30 am"; } elsif ($FlightNum eq "2") { $ArriveCity = "Chicago"; $ArriveTime = "9:00 pm"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "JL")
{ $AirName = "Japan Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Tokyo"; $ArriveTime = "9:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "New York"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "KL")
{ $AirName = "KLM Royal Dutch";
if ($FlightNum eq "1") { $ArriveCity = "London"; $ArriveTime = "10:00 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "New York"; $ArriveTime = "9:00 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "NW")
{ $AirName = "Northwest Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Seattle"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Portland"; $ArriveTime = "7:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "QF")
{ $AirName = "Qantas Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Melbourne"; $ArriveTime = "7:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Tokyo"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "QQ")
{ $AirName = "Reno Air";
if ($FlightNum eq "1") { $ArriveCity = "Reno"; $ArriveTime = "10:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Las Vegas"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "SR")
{ $AirName = "Swiss Air";
if ($FlightNum eq "1") { $ArriveCity = "New York"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Boston"; $ArriveTime = "6:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "TW")
{ $AirName = "TWA";
if ($FlightNum eq "1") { $ArriveCity = "Chicago"; $ArriveTime = "10:00 am"; } elsif ($FlightNum eq "2") { $ArriveCity = "Los Angeles"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "UA")
{ $AirName = "United Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Las Vegas"; $ArriveTime = "10:00 am"; } elsif ($FlightNum eq "2") { $ArriveCity = "Boston"; $ArriveTime = "11:45 pm"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "US")
{ $AirName = "USAir";
if ($FlightNum eq "1") { $ArriveCity = "New York"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Boston"; $ArriveTime = "6:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "VS")
{ $AirName = "Virgin Atlantic";
if ($FlightNum eq "1") { $ArriveCity = "London"; $ArriveTime = "10:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "New York"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
if ($ArriveCity eq "Unknown") {
$Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Display>
<Action Type=Accept Task=GO Label=Done Dest=../FlightSchedule/FlightSchedule.hdml Vars=AirCode=&FlightNum=>
$AirName flight $FlightNum is not in the database. Try again.
</Display>
</HDML>";
print $Deck; } else { $Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Display>
<Action Type=Accept Task=GO Label=Done Dest=../FlightSchedule/FlightSchedule.hdml Vars=AirCode=&FlightNum=>
$AirName flight $FlightNum will arrive in $ArriveCity at $ArriveTime
</Display>
</HDML>";
print $Deck; }
Как вы видите, обе деки формата HDML используют элементы <Display> вывода сообщения на экран сотового телефона. Аналогично, обе деки используют элементы <Action> для того, чтобы пользователь мог вернуться в началеприложения.
Подробнее о сценарии языка Perl FlightScheduleWML.pl
Подробнее о сценарии языка Perl FlightScheduleWML.pl
Как было сказано выше, каждый раз, когда пользователь производит выбор авиакомпании и определяет номер рейса, приложение FlightSchedule.wml запускаетсценарий языка Perl, который отображает информацию о текущем состояниирейса или выдает сообщение об ошибке, если такой рейс не существует. Сценарий FlightScheduleWML.pl имеет следующий исходный код: #!/usr/bin/perl
require 'DeckUtils.pl';
%cgiVars = &AppUtils::ParseCGIVars(); $AirCode = $cgiVars{"AirCode"}; $FlightNum = $cgiVars{"FlightNum"};
if ($AirCode eq "SU") { $AirName = "Aeroflot";
if ($FlightNum eq "1") { $ArriveCity = "Moscow"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "New York"; $ArriveTime = "6:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AC")
{ $AirName = "Air Canada";
if ($FlightNum eq "1") { $ArriveCity = "New York"; $ArriveTime = "10:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Boston"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AF")
{ $AirName = "Air France";
if ($FlightNum eq "1") { $ArriveCity = "Paris"; $ArriveTime = "9:45 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "London"; $ArriveTime = "11:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "NZ")
{ $AirName = "Air New Zealand";
if ($FlightNum eq "1") { $ArriveCity = "Auckland"; $ArriveTime = "8:50 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Sydney"; $ArriveTime = "9:00 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AS")
{ $AirName = "Alaska Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Portland"; $ArriveTime = "6:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Las Vegas"; $ArriveTime = "7:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AQ")
{ $AirName = "Aloha Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Hilo"; $ArriveTime = "11:15 am"; } elsif ($FlightNum eq "2") { $ArriveCity = "Los Angeles"; $ArriveTime = "9:45 pm"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "HP")
{ $AirName = "America West";
if ($FlightNum eq "1") { $ArriveCity = "Las Vegas"; $ArriveTime = "10:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "PHoenix"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "AA")
{ $AirName = "American Airlines";
if ($FlightNum eq "1") { $ArriveCity = "New York"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Phoenix"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "TZ")
{ $AirName = "American Trans Air";
if ($FlightNum eq "1") { $ArriveCity = "Chicago"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "San Francisco"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "CO")
{ $AirName = "Continental";
if ($FlightNum eq "1") { $ArriveCity = "Boston"; $ArriveTime = "6:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Los Angeles"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "DL")
{ $AirName = "Delta";
if ($FlightNum eq "1") { $ArriveCity = "Atlanta"; $ArriveTime = "7:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Las Vegas"; $ArriveTime = "8:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "LH")
{ $AirName = "Lufthansa";
if ($FlightNum eq "1") { $ArriveCity = "Berlin"; $ArriveTime = "9:30 am"; } elsif ($FlightNum eq "2") { $ArriveCity = "Chicago"; $ArriveTime = "9:00 pm"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "JL")
{ $AirName = "Japan Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Tokyo"; $ArriveTime = "9:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "New York"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "KL")
{ $AirName = "KLM Royal Dutch";
if ($FlightNum eq "1") { $ArriveCity = "London"; $ArriveTime = "10:00 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "New York"; $ArriveTime = "9:00 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "NW")
{ $AirName = "Northwest Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Seattle"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Portland"; $ArriveTime = "7:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "QF")
{ $AirName = "Qantas Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Melbourne"; $ArriveTime = "7:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Tokyo"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "QQ")
{ $AirName = "Reno Air";
if ($FlightNum eq "1") { $ArriveCity = "Reno"; $ArriveTime = "10:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Las Vegas"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "SR")
{ $AirName = "Swiss Air";
if ($FlightNum eq "1") { $ArriveCity = "New York"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Boston"; $ArriveTime = "6:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "TW")
{ $AirName = "TWA";
if ($FlightNum eq "1") { $ArriveCity = "Chicago"; $ArriveTime = "10:00 am"; } elsif ($FlightNum eq "2") { $ArriveCity = "Los Angeles"; $ArriveTime = "9:30 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "UA")
{ $AirName = "United Airlines";
if ($FlightNum eq "1") { $ArriveCity = "Las Vegas"; $ArriveTime = "10:00 am"; } elsif ($FlightNum eq "2") { $ArriveCity = "Boston"; $ArriveTime = "11:45 pm"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "US")
{ $AirName = "USAir";
if ($FlightNum eq "1") { $ArriveCity = "New York"; $ArriveTime = "8:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "Boston"; $ArriveTime = "6:45 am"; } else { $ArriveCity = "Unknown"; } }
elsif ($AirCode eq "VS")
{ $AirName = "Virgin Atlantic";
if ($FlightNum eq "1") { $ArriveCity = "London"; $ArriveTime = "10:30 pm"; } elsif ($FlightNum eq "2") { $ArriveCity = "New York"; $ArriveTime = "9:45 am"; } else { $ArriveCity = "Unknown"; } }
if ($ArriveCity eq "Unknown") {
$Deck = "Content-type: text/vnd.wap.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\" label=\"Done\"> <go href=\"../FlightSchedule /FlightSchedule.wml\" /> </do>
<p align=\"left\" mode=\"wrap\">
$AirName flight $FlightNum is not in the database. Try again.
</p>
</card>
</wml>";
print $Deck; } else {
$Deck = "Content-type: text/vnd.wap.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\" label=\"Done\"> <go href=\"../FlightSchedule /FlightSchedule.wml\" /> </do>
<p align=\"left\" mode=\"wrap\">
$AirName flight $FlightNum will arrive in $ArriveCity at $ArriveTime
</p>
</card>
</wml>";
print $Deck; }
Первая строка сценария является всего лишь комментарием, сообщающим интерпретатору командной строки, где находится интерпретатор языка Perl. Втораястрока сообщает этому интерпретатору, что исходный сценарий требует другойсценарий DeckUtils.pl, который содержит функции, используемые для анализапараметров, передаваемых из деки формата WML.
Далее, код использует серию конструкций if-else для определения, в первуюочередь, введенной авиакомпании, а затем и введенного номера рейса. Для простоты в нашем приложении код поддерживает только номер рейса 1 для всехавиалиний, в некоторых случаях и номер рейса 2. В реальном приложении сценарий должен получать номера рейсов из базы данных, которая позволит обрабатывать неограниченное число рейсов.
Если сценарий идентифицирует соответствующие авиакомпанию и номер рейса,он создает новую деку формата WML, которая отображает информацию о рейсе изатем позволяет пользователю вернуться в начало приложения:
$Deck = "Content-type: text/vnd.wap.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\" label=\"Done\"> <go href=\"../FlightSchedule /FlightSchedule.wml\" /> </do>
<p align=\"left\" mode=\"wrap\">
$AirName flight $FlightNum is not in the database. Try again.
</p>
</card>
</wml>";
print $Deck;
Если приложение не может найти номер рейса, сценарий создает деку форматаWML, которая отображает сообщение о том, что этого номера рейса нет в базеданных, и пользователю предоставляется возможность вернуться в начало приложения
Отображение списка авиалиний
Рис.. 11.1. Отображение списка авиалиний
Ввод номера рейса
Рис.. 11.2. Ввод номера рейса
Отображение состояния рейса
Рис.. 11.3. Отображение состояния рейса