Подробнее о приложении WorldTime.hdml
Подробнее о приложении WorldTime.hdml
Так же как и приложение, использующее язык WML, файл WorldTime.hdml отображает текущее время в выбранном городе, используя сотовый телефон. Разни- ца между двумя приложениями в том, что в одном используется язык WML, а вдругом язык HDML. Приведем исходный код файла WorldTime.hdml:
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=Select Method=Alpha Key=CityName>
<Action Type=Accept Task=GO Method=Post PostData=$(CityName:noesc) Dest=../waplibcgi/WorldTimeHDML.pl>
<Center>World Time<br> <Center>Select City<br>
<CE Value="Honolulu">Honolulu
<CE Value="London">London
<CE Value="Los Angeles">Los Angeles
<CE Value="New York">New York
<CE Value="Paris">Paris
<CE Value="Phoenix">Phoenix
<CE Value="Tokyo">Tokyo
</Choice>
</HDML>
Первый элемент внутри деки сообщает браузеру (или другим программистам),какая версия языка HDML используется приложением. Далее выражениеMarkable=True сообщает браузеру, что он может установить закладку в исходнойдеке, a TTL=0 свидетельствует о невозможности кэширования.
Для отображения списка городов, из которого необходимо выбрать желаемый,приложение использует элемент <Choice>. Внутри <Choice> приложение использует другой элемент <Action> для определения имени и расположения сцнария языка Perl. Этот сценарий запускается, когда произведен выбор города иприложение передает ему информацию, которая в нашем случае является названием города.
Далее, для центрирования текста WorldTime и SelectCity приложение используетэлементы <Center>. Напоследок, для определения названий городов используется элемент <Choi.ce> с применением элемента <СЕ>. Как и в случае с файломформата WML, элемент <Choice> позволяет пользователю произвести выбор города из списка. После того как пользователь произведет свой выбор, браузер вы- полнит определенные действия, которые в нашем случае заключаются в запускесценария языка Perl.
Подробнее о приложении WorldTime.wml
Подробнее о приложении WorldTime.wml
Когда вы запускаете приложение WorldTime, дека1 WorldTime.wml отображает наэкране телефона названия городов и после произведенного вами выбора городазапускает сценарий языка Perl, который находится в файле WorldTimeWML.pl.Именно этот сценарий (скрипт) и выполняет расчет текущего времени. Приве- дем исходный код деки WorldTime.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="Choice">
<do type="accept"> <go href="../waplibcgi/WorldTimeWML.pl?$(CityName)" /> </do>
<p align="center">
World Time<br/> Select City<br/>
</p>
<p align="left">
<select name="CityName">
<option value="Honolulu">Honolulu</option> <option value="London">London</option> <option value="Los Angeles">Los Angeles</option> <option value="New York">New York</option> <option value="Paris">Paris</option> <option value="Phoenix">Phoenix</option> <option value="Tokyo">Tokyo</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 предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.
Далее, за начальными элементами, в исходном коде определяется единственнаякарта, которая в нашем случае называется Choice. Если вы просмотрите содер- жимое карты браузером, поддерживающим WAP, вы смелеете просмотреть список названий городов, предлагаемых картой и в конечном итоге сделать выборпо своему желанию.
Как было сказано выше, дека WorldTime.wml используется, главным образом, дляотображения названий городов и потом, после выбора пользователем города,для запуска сценария языка Perl, передавая ему при этом название города. Длявыполнения этого действия исходный код использует элемент <do>:
<do type="accept"> <go href="../waplibcgi/WorldTimeWML.pl?$(CityName)" /> </do>
Элемент <do> в нашем случае подключает сценарий языка Perl, передавая емуспециальную опцию интерфейса пользователя.
Если вы внимательно рассмотрите начальное окно приложения, показанное на Рисунок 2.1, то увидите, что браузер отображает заголовок приложения World Time, и
следом предлагает выбрать город: Select City. Для центрирования этих текстовыхсообщений приложение использует тег абзаца <р> с центральным выравниванием, для перевода на следующую строку используется тег <br>. Далее используеся тег абзаца <р> повторно, только с выравниванием текста по левому краю длявыравнивания названия городов. Внутри элемента <р> используется <select>для выбора пользователем названия города:
<select name="CityName">
<option value="Honolulu">Honolulu</option> <option value="London">London</option> <option value="Los Angeles">Los Angeles</option> <option value="New York">New York</option> <option value="Paris">Paris</option> <option value="Phoenix">Phoenix</option> <option value="Tokyo">Tokyo</option>
</select>
Элемент <select> позволяет пользователю производить выбор из определенного списка городов, устанавливая значение выбранной опции в переменную, доступную во всей деке. В предыдущем элементе <select> браузер присваивал значение выбранного элемента переменной "CityName".
Подробнее о сценарии языка Perl WorldTime.pl
Подробнее о сценарии языка Perl WorldTime.pl
Как было сказано выше, каждый раз, когда пользователь производит выбор горо- да, файл WorldTime.wml запускает сценарий языка Perl, который собственно и вы- числяет текущее время. После этого сценарий Perl, используя вычисленное не- давно время, создает новую WML-деку, которая передается браузеру WAP.
Приведем исходный код сценария языка Perl WorldTime.pl:
#!/usr/bin/perl
$Buffer = $ENV{'QUERY_STRING'}; $Buffer =~ s/%20/ /g;
$CityName = $Buffer;
if ($CityName eq "Honolulu") { $Delta = -10; } elsif ($CityName eq "London") { $Delta = +1; } elsif ($CityName eq "Los Angeles") { $Delta = -7; } elsif ($CityName eq "New York") { $Delta = -4; } elsif ($CityName eq "Paris") { $Delta = +2; } elsif ($CityName eq "Phoenix") { $Delta = -7; } else { $Delta = +9; }
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
$hour = $hour + $Delta;
if ($hour < 0) { $hour = $hour + 24; } elsif ($hour > 24) { $hour = $hour - 24; }
if ($hour < 10) { $hour = 0 . $hour; } if ($min < 10) { $min = 0 . $min; } if ($sec < 10) { $sec = 0 . $sec; }
$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>
<p align=\"center\">
World Time<br/>
</p>
<p align=\"left\" mode=\"wrap\">
Current time in $CityName is<br/> $hour:$min:$sec<br/>
</p>
</card>
</wml>";
print $Deck;
Первая строка сценария является просто комментарием, который сообщает интерпретатору командной строки, где находится интерпретатор языка Perl.
Сле- дующие две строки сценария позволяют ему найти параметр, который карта исходной деки передала сценарию:
$Buffer = $ENV{'QUERY_STRING'}; $Buffer =~ s/%20/ /g;
Первый оператор возвращает значение параметра. Второй оператор удаляет всепустые символы (пробелы) из названия города, которое содержится в параметре,для облегчения сценарию обработки конструкции if-else.
Далее, приложение извлекает из параметра название города. После этого сценарий использует серию операторов if-else для определения часового пояса вы- бранного города относительно времени по Гринвичу (GMT). Если приложениедолжно выдавать сведения о большем количестве городов, то в исходный коддолжны быть добавлены операторы, позволяющие вычислять разницу во време- ни для этих городов. ./.,:
Напоследок, сценарий использует функцию gmtime для вычисления текущей даты и времени по Гринвичу: ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
Для вычисления текущего времени используется разница во времени выбранного города по отношению ко времени по Гринвичу. К примеру, вычислено, чтовремя по Гринвичу 16 часов. Тогда в Финиксе (Аризона), который имеет поправкупо времени -7 часов, текущее время будет 9 часов утра.
После того как сценарий вычислит текущее время, он создает новую карту формата WML, которая передается браузеру WAP. Для того чтобы создать эту карту, сце- нарий формирует содержимое карты в символьной строке с именем $Deck. Послеэтого дека передается в браузер с использованием оператора печати print.
Подробнее о сценарии языка Perl WorldTimeHDML.pl
Подробнее о сценарии языка Perl WorldTimeHDML.pl
Когда вы выберете город в приложении WorldTime.hdml, браузер передаст данные файлу сценария WorldTimeHDML.pl, который вычислит текущее время в городе исоздаст файл формата HDML, используемый браузером для отображения времени.Как вы догадались, все элементы для вычисления текущего времени в файлеWorldTimeHDML.pl идентичны тем, что были приведены в этой главе ранее. Однако следующие олераторы языка Perl создают исходный код на языке HDML, который браузер использует для отображения текущего времени:
$Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0> <Display> <Center>World Time<br><br> Current time in $CityName is<br> $hour:$min:$sec<br> </Display> </HDML>";
print $Deck;
Исходный код использует элемент <Display> для центрирования текущих часов,минут, секунд на дисплее телефона. Далее, в исходном коде используется оператор print для записи кода в браузер.