Пособие по написанию WAP сайтов

         

Пособие по написанию WAP сайтов



ГЛАВА 14

Подробнее о приложении Weatherlnfo
Подробнее о сценариях языка Perl, используемых в приложении
Подробнее о приложении Weather.hdml
Подробнее о сценариях языка Perl, используемых в приложении

Если вы часто путешествуете или просто куда-то выходите, вам наверняка должны быть интересны сведения о текущих и ближайших погодных условиях. В этойглаве вы создадите приложение Weatherlnfo (Информация о погоде), котороевключает в себя файлы формата WML и сценарий языка Perl, позволяя пользователю видеть на дисплее своего сотового телефона информацию о погодных условиях в выбранном городе, штате или по определенному почтовому индексу. Когдапользователь запускает приложение, на дисплее телефона отобразится приглашение выбрать почтовый индекс, город или штат, как показано на Рис. 14.1. Вдобавок к этому, пользователь может выбрать опцию Help (Помощь) приложения,которая отображает доступные для выбора города, штаты и почтовые индексы.После определения пользователем выбранной области, приложение Weatherlnfoотобразит соответствующую информацию о погодных условиях, как показано наРис. 14.2.



Если вы еще не установили пакет инструментальных средствдля разработки программного обеспечения (SDK) для WAP, например, с сайта www.openwave.com, можно протестироватьприложение Weatherlnfo, используя сотовый телефон, поддерживающий протокол WAP. Для этого с помощью телефона необходимо набрать адрес waplib.com/Weatherlnfo/Weatherlnfo.hdml,если браузер телефона поддерживает язык HDML Если браузерподдерживает язык WML, то надо ввести адресwaplib.com/Weatherlnfo/Weatherlnfo.wml.






Подробнее о приложении Weather.hdml





Подробнее о приложении Weather.hdml


Как и файл формата WML, файл Weather.hdml позволяет пользователю получитьинтересующую его информацию о погоде, используя свой сотовый телефон. Исходный код файла Weather.hdml приведен ниже:
<HDML Version=3.0 Markable=True TTL=0>


<Choice Name=Main Method=Alpha>
<Center>Weather Info<BR> Search by:
<CE Task=GO Dest=#GetZipCode>Zip Code <CE Task=GO Dest=#GetCity>City <CE Task=GO Dest=#GetState>State <CE Task=GO Dest=../Weather/Wxhelp.hdml>Help
</Choice>
<Entry Name=GetZipCode Format=NNNNN Key=ZipCode Default="">
<Action Type=Prev Task=GO Dest=#Main Vars=ZipCode=>
<Action Type=Accept Task=GO Method=Post PostData=$(ZipCode) Dest=../waplibcgi/ZipWeatherHDML.pl>
<Center>Weather Info<BR><BR> Enter Zip Code:
</Entry>
<Entry Name=GetCity Format=*M Key=CityName Default="">
<Action Type=Prev Task=GO Dest=#Main Vars=CityName=>
<Action Type=Accept Task=GO Method=Post PostData=$(CityName:noesc) Dest=../waplibcgi/CityWeatherHDML.pl>
<Center>Weather Info<BR><BR> Enter City:
</Entry>
<Entry Name=GetState Format=AA Key=StateName Default="">
<Action Type=Prev Task=GO Dest=#Main Vars=StateName=>
<Action Type=Accept Task=GO Method=Post PostData=$(StateName) Dest=../waplibcgi/StateWeatherHDML.pl>
<Center>Weather Info<BR><BR> Enter State:
</Entry>
</HDML>


Первый элемент внутри деки сообщает браузеру (или другим программистам)какая версия языка HDML используется приложением. Далее, выражение Markable=True сообщает, что браузер может установить закладку в исходной деке, аTTL=0 сообщает ему о невозможности кэширования (таким образом, браузердолжен перегружать эту деку каждый раз при обращении к ней пользователя).


Для предоставления пользователю возможности выбора почтового индекса, города, штата или режима помощи используется элемент <Choice>. Внутри<Choice> используются элементы <СЕ> для направления приложения в опереде-ленное место в исходном коде внутри деки. Если же выбрана опция помощи, требуется, чтобы браузер загрузил другую деку.


В деке формата HDML используются элементы <Entry> для обеспечения вводапользователем почтового индекса, города или штата. Внутри каждого из этих элементов в поле format определяется формат вводимых пользователем данных.


После того как произведен выбор, приложение запускает один из сценариевязыка Perl (в зависимости от того, что выбрано: индекс, штат или город). Еслипользователем выбрана опция помощи, браузер загружает деку Wxhelp.hdml, которая имеет следующий исходный код:
<HDML Version=3.0 Markable=True TTL=0>
<Display>
<ACTION Type=Accept Task=GO Dest=../Weather/Weather.hdml>
For this demo<BR>
Zip Codes are:<BR> 87101, 87701, 89101, 89501<BR>
Cities are:<BR> Albuquerque, NM<BR> Las Vegas, NM<BR> Las Vegas, NV<BR> Reno, NV<BR>
States are:<BR> Nevada<BR> New Mexico<BR>
</Display>
</HDML>


Эта дека использует элемент <Display> для отображения доступных почтовыхиндексов, городов и штатов. После того как пользователь просмотрит интересующую его информацию и нажмет кнопку Accept (Принято), элемент <Action>даст указание браузеру перезагрузить основную деку приложения.





Подробнее о приложении Weatherlnfo





Подробнее о приложении Weatherlnfo


Когда пользователь запускает приложение Wheatherlnfo, дека Wheather.wml предлагает пользователю ввести почтовый индекс, город, штат или выбрать опциюпомощи. Основываясь на выборе пользователя, приложение осуществляет переход к локальной карте, которая находится в пределах текущего файла или деки.Дека Wheather.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="Weather" title="Weather Info">
<onevent type="onenterforward">
<refresh> <setvar name="ZipCode" value="" /> <setvar name="CiryName" value="" /> <setvar name="StateName" value="" /> </refresh>
</onevent>
<onevent type="onenterbackward">
<refresh> <setvar name="ZipCode" value="" /> <setvar name="CityName" value="" /> <setvar name="StateName" value="" /> </refresh>
</onevent>
<p align="center">
Weather Info<br/> Search by:
</p>
<p align="left">
<select title="Main">
<option onpick="#GetZipCode">Zip Code</option> <option onpick="#GetCity">City</option> <option onpick="#GetState">State</option> <option onpick="../Weather/Wxhelp.wml">Help</option>
</select>
</p>
</card>
<card id="GetZipCode">
<do type="accept"> <go href="../waplibcgi/ZipWeatherWML.pl ?$(ZipCode)" /> </do>
<p align="center">
Weather Info<br/>
</p>
<p align="left">
Enter Zip Code:
<input name="ZipCode" maxlength="6" type="text" format="NNNNN" />
</p>
</card>
<card id="GetCity">
<do type="accept"> <go href="../waplibcgi/CityWeatherWML.pl ?$(CityName)" /> </do>
<p align="center">
Weather Info<br/>
</p>
<p align="left">
Enter City:
<input name="CityName" type="text" format="*M" />
</p>
</card>
<card id="GetState">
<do type="accept"> <go href="../waplibcgi/StateWeatherWML.pl ?$(StateName)" /> </do>
<p align="center">
Weather Info<br/>
</p>
<p align="left">
Enter State:
<input name="StateName" type="text" format="AA" />
</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 предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.


Приложение использует три переменные для хранения введенных пользователем данных: ZipCode, CityName и StateName. При запуске приложения карта использует элемент <onevent> для очистки текущих значений каждой из переменных при нажатии пользователем кнопки Next (Далее) или кнопки Previous (Предыдущий) на телефоне. После этого карта использует элемент <select> для приглашения пользователя к вводу желаемой им опции:
<select title="Main">
<option onpick="#GetZipCode">Zip Code</option> <option onpick="#GetCity">City</option> <option onpick="#GetState">State</option> <option onpick="../Weather/Wxhelp.wml">Help</option>
</select>


Внутри элемента <select> символы фунта (#), предшествующие первым тремопциям, сообщают вам, что карта, например, #GetZipCode, находится внутри текущей деки формата WML. В отличие от этого, карта для опции помощи Help находится в отдельной деке.


Внутри каждой из карт приложение использует элемент <input> для предоставления пользователю возможности ввода необходимых данных, таких, как Название города или почтовый индекс. Если вы обратите внимание на элемент<input>, то увидите, что поле format определяет формат соответствующих данных. К примеру, <input> внутри карты GetZipCode использует формат NNNNN дляпредоставления возможности ввода только 5 числовых символов.


Как было сказано, если пользователь выбирает опцию Help, приложение загружает карту из деки на диске, которая в нашем случае находится в файлеWxhelp.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="../Weather/Weather.wml" /> </do>
<p align="left" mode="wrap">
For this demo<br/>
Zip Codes are:<br/> 87101, 87701, 89101, 89501<br/>
Cities are:<br/> Albuquerque, NM<br/> Las Vegas, NM<br/> Las Vegas, NV<br/> Reno, NV<br/>
States are:<br/> Nevada<br/> New Mexico<br/>
</p>
</card>
</wml>


В карте используется тег абзаца <р> для отображения списка доступных почтовых индексов, городов и штатов в нашей демо-версии приложения. Если пользователь производит нажатие на кнопку Accept (Принять), приложение используетэлемент <do> для загрузки основной деки Weather.wml. При вводе пользователемгорода, штата или почтового индекса, приложение вызывает соответствующийсценарий языка Perl.





Подробнее о сценариях языка Perl,используемых в приложении





Подробнее о сценариях языка Perl,используемых в приложении


Когда пользователь выбирает опцию Zip Code (Почтовый индекс) в приложенииWeatherlnfo, в исходном коде ему предлагается ввести почтовый индекс. Далее запускается сценарий языка Perl, который этот индекс анализирует. Если пользователем введен разрешенный индекс (в нашем случае один из нескольких известных приложению), сценарий открывает, а затем печатает соответствующий файло погоде (вывод которого перехватывается браузером). Если пользователь ввелнедоступный почтовый индекс, сценарий открывает файл Unknown.wml, исходный код которого производит отображение сообщения об ошибке. Исходныйкод сценария языка Perl ZipWeatherWML.pl приведен ниже:
#!/usr/bin/perl
print "Content-type: text/vnd.wap.wml\n\n";
$Buffer = $ENV{'QUERY_STRING'};
if ($Buffer eq "87101") { $FileName = "../Weather/87101.wml"; } elsif ($Buffer eq "87701") { $FileName = "../Weather/87701.wml"; } elsif ($Buffer eq "89101") { $FileName = "../Weather/89101.wml"; } elsif ($Buffer eq "89501") { $FileName = "../Weather/89501.wml"; } else { $FileName = "../Weather/Unknown.wml"; }
open (WeatherInfo, $FileName);
while (<WeatherInfo>) { print; }
close (WeatherInfo);


Первая строка сценария представляет собой комментарий, сообщающий интерпретатору командной строки, где находится интерпретатор языка Perl. Втораястрока информирует браузер (который перехватывает вывод) о том, что результатом работы сценария будет создание исходного кода формата WML. Далее используется функция $ENV для извлечения параметра почтового индекса.


После получения сценарием этого индекса используется серия конструкций if-else для определения, является ли введенный индекс доступным. Если сценарийраспознал введенный индекс, он присваивает имя файла формата WML этого индекса переменной $FileName. Позднее сценарий откроет и выведет соответствующий файл (который может быть и файлом Unknown.wml). Браузер, поддерживающий протокол WAP, в свою очередь, перехватывает вывод, трактуя его каккарту формата WML. ^ v i, t ;я;


В файле формата WML для определенного индекса исходный код предлагаетпользователю выбрать, что он желает узнать: текущую погоду, погоду на сегодняшний день или прогноз на завтра. После этого, основываясь на выборе пользователя, отображается информация о погоде.


В нашем случае карта содержит всю информацию о погоде. В реальном приложении вам необходимо будет использовать базу данных для хранения информации о погоде, исходя из содержимого которой будут создаваться в процессе работы приложения соответствующие карты, содержащие необходимую информацию.


Сценарий языка Perl CityWeatherWML.pl анализирует название города, получаемоеим из приложения как параметр, и затем, основываясь на введенном названии,открывает и выводит файл, предлагающий пользователю выбрать информацию отекущей погоде, погоде на сегодняшний день или прогноз на завтра. После этогофайл выводит на дисплей телефона соответствующую погодную информацию.Сценарий CityWeatherWML.pl имеет следующий исходный код:
#!/usr/bin/perl
print "Content-type: text/vnd.wap.wml\n\n";
$Buffer = $ENV{'QUERY_STRING'}; $Buffer =~ s/%20/ /g;
if ($Buffer eq "Las Vegas") { $FileName = "../Weather/LasVegas.wml"; } elsif ($Buffer eq "Reno") { $FileName = "../Weather/89501.wml"; } elsif ($Buffer eq "Albuquerque") { $FileName = "../Weather/87101.wml"; } else { $FileName = "../Weather/Unknown.wml"; }
open (WeatherInfo, $FileName);
while (<WeatherInfo>) { print; }
close (WeatherInfo);


Как вы видите, в сценарии используется последовательность конструкций if-else для определения введенного пользователем названия города. Если сценарийобнаруживает поддерживаемое название города, он присваивает его переменной$FileName, которую использует позднее для открытия и вывода содержимогофайла. Если введенное название не поддерживается сценарием, то этой переменной присваивается имя файла Unknown.wml с целью вывода на дисплей пользователя сообщения об ошибке. Наше приложение поддерживает всего два города: Лас-Вегас, штат Невада (Las Vegas, Nevada) и Лас-Вегас, штат Нью-Мехико (LasVegas, New Mexico). Поскольку названия городов одинаковы, приложение должно предложить пользователю выбрать один из городов. Файл LasVegas.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="prev"> <go href="../Weather/Weather.wml#GetCity" /> </do>
<p align="center" mode="wrap">
Pick City<br/>
<select>
<option onpick="../Weather/87701.wml" >Las Vegas, NM</option> <option onpick="../Weather/89101.wml" >Las Vegas, NV</option>
</select>
</p>
</card>
</wml>


Для определения выбранного пользователем города в деке используется элемент<seleot>. После того как пользователь произведет выбор, загружается соответствующая городу дека формата WML (на самом деле дека, соответствующая почтовому индексу города).


Как вы понимаете, сценарий языка Perl StateWeatherWML.pl работаетаналогичным образом, используя переданный параметр для определениявыбранного пользователем штата. После этого происходит вывод необходимойинформации на дисплей сотового телефона.





Подробнее о сценариях языка Perl,используемых в приложении





Подробнее о сценариях языка Perl,используемых в приложении


Как и приложение формата WML, приложение в формате HDML использует трисценария языка Perl для обработки выбранных пользователем почтового индекса,города или штата. Исходный код каждого из этих сценариев практически идентичен описанным ранее сценариям, поэтому здесь приведены только файлыформата HDML, которые сценарии загружают и отображают.


Когда пользователь определил почтовый индекс, приложение подключает сценарий ZipWeatherHDML.pl. Основываясь на выборе пользователя, сценарий загрузит одну из дек, например, 89101.hdml, исходный код которой приведен ниже:
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=Menu Method=Number>
<Action Type=Accept Label=Wx>
<Action Type=Soft1 Task=GO Dest=../Weather/Weather.hdml Label=Menu Vars=StateName=&CityName=&ZipCode=>
<Center>Las Vegas, NV<BR>
<CE Task=GO Dest=#Current>Current Conditions <CE Task=GO Dest=#Today>Today <CE Task=GO Dest=#Tomorrow>Tomorrow
</Choice>
<Display Name=Current>
<Action Type=Accept Task=GO Dest=#Menu>
<Center>Las Vegas, NV<BR>
<Line>8:50 pm PST <Line>Nov 25, 1999 <Line>Temp: 47 F <Line>Press: 30.15 <Line>Humid: 25% <Line>Wind: W at 10 mph <Line>Sky: Clear
</Display>
<Display Name=Today>
<Action Type=Accept Task=GO Dest=#Menu>
<Center>Las Vegas, NV<BR> <Line>Nov 25, 1999 <Line>Hi/Low: 70/40 F <Wrap>Mostly sunny. Light winds. Increasing clouds at night.
</Display>
<Display Name=Tomorrow>
<Action Type=Accept Task=GO Dest=#Menu>
<Center>Las Vegas, NV<BR> <Line>Nov 26, 1999 <Line>Hi/Low: 65/40 F <Wrap>Partly cloudy.
</Display>
</HDML>


Дека использует элемент <Choice> для определения, что желает увидеть пользователь: текущую погоду, прогноз на сегодня, прогноз на завтра. Далее, принимая вовнимание решение пользователя, управление передается одному из элементов<Display> для отображения выбранной информации. В деке используется несколько элементов <Action> для предоставления пользователю возможности вернуться назад в предыдущее меню или повторно запустить приложение в целом.


Когда пользователь определяет город (помните, что наше приложение поддерживает только четыре города), приложение подключает сценарийCityWeatherHDML.pl. Если пользователь выбирает город Las Vegas, приложениезагрузит деку LasVegas.hdml, которая имеет следующий исходный код:
<HDML Version=3.0 Markable=True TTL=0>
<Choice Method=Number>
<Action Type=Soft1 Task=GO Dest=../Weather/Weather.hdml#GetCity Label=Back Vars=CityName=>
<Center>Pick City<BR>
<CE Task=GO Dest=../Weather /87701.hdml>Las Vegas, NM <CE Task=GO Dest=../Weather /89101.hdml>Las Vegas, NV
</Choice>
</HDML>
Приложение использует элемент <Choice> для предоставления пользователю возможности выбрать, погоду в каком из городов с названием Las Vegas он желает узнать. После выбора пользователем города, приложение загружает соответствующую деку формата HDML. которая и отображает информацию о погоде. В самомначале деки используется элемент <Action> для предоставления пользователювозможности вернуться к карте #GetCity, находящейся внутри основной деки.
Наконец, если пользователь выбрал штат, приложение подключает сценарийStateWeatherHDML.pl, который использует последовательность конструкций if-else для определения запрашиваемого пользователем штата. После этого приложение загружает деку, предлагающую выбрать тип прогноза. Далее происходитотображение на дисплее сотового телефона выбранной информации.



Приглашение к вводу почтовогоиндекса, города или штата



Рис.. 14.1. Приглашение к вводу почтовогоиндекса, города или штата





Отображение информациио погоде в регионе



Рис.. 14.2. Отображение информациио погоде в регионе