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

         

Отображение результата конвертирования



Рисунок 5.3. Отображение результата конвертирования




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



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

Как и приложение CurrencyConvert.wml, приложение CurrencyConvert.hdml отображает список доступных валют. После того как пользователь произведет выборвалюты, у него будет запрошен ввод требуемой суммы. Далее, будет отображенполученный результат преобразования. Дека CurrencyConvert.hdml содержит следующий исходный код:

&ltHDML Version=3.0 Markable=True TTL=0&gt

&ltChoice Name=Currency Method=Alpha&gt

&ltAction Type=Accept Label=Enter&gt

&ltCenter&gtCurrency Converter&ltbr&gt

&ltCE Task=GOSub Dest=#GetUSDollar Vars=USDollar=$USDollar Receive=USDollar Next=../waplibcgi/CurrencyConvertHDML.pl?USDollar&$USDollar&gt US Dollars:

&ltCE Task=GOSub Dest=#GetEuro Vars=Euro=$Euro Receive=Euro Next=../waplibcgi/CurrencyConvertHDML.pl?Euro&$Euro&gt Euro:

&ltCE Task=GOSub Dest=#GetUKPounds Vars=UKPounds=$UKPounds Receive=UKPounds Next=../waplibcgi/CurrencyConvertHDML.pl?UKPounds&$UKPounds&gt UK Pounds:

&ltCE Task=GOSub Dest=#GetJapanYen Vars=JapanYen=$JapanYen Receive=JapanYen Next=../waplibcgi/CurrencyConvertHDML.pl?JapanYen&$JapanYen&gt Japan Yen:

&lt/Choice&gt

&ltEntry Name=GetUSDollar Default=$USDollar Key=USDollar Format=X*X&gt

&ltAction Type=Accept Task=Return Retvals=$USDollar&gt US Dollar:

&lt/Entry&gt

&ltEntry Name=GetEuro Default=$Euro Key=Euro Format=X*X&gt

&ltAction Type=Accept Task=Return Retvals=$Euro&gt Euro:

&lt/Entry&gt



&ltEntry Name=GetUKPounds Default=$UKPounds Key=UKPounds Format=X*X&gt

&ltAction Type=Accept Task=Return Retvals=$UKPounds&gt UK Pounds:

&lt/Entry&gt

&ltEntry Name=GetJapanYen Default=$JapanYen Key=JapanYen Format=X*X&gt

&ltAction Type=Accept Task=Return RetVals=$JapanYen&gt Japan Yen:

&lt/Entry&gt

&lt/HDML&gt

Первый элемент внутри деки сообщает браузеру (или другим программистам),какая версия языка HDML используется приложением.


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

Для выбора требуемой валюты из отображенного списка доступных приложениеиспользует элемент <Choice>. После того как пользователь произведет выборвалюты, осуществляется переход на соответствующую карту, находящуюся внутри данной деки, для ввода пользователем суммы денег. Далее, когда сумма будетопределена, приложение запускает сценарий языка Perl CurrencyConvertHDML.pl,который очень похож на сценарий CurrencyConvertWML.pl, за исключением нескольких последних элементов, которые генерируют новую деку формата HDML,как показано ниже:

$Deck = "Content-type: text/x-hdml

&ltHDML Version=3.0 Markable=True TTL=0&gt

&ltDisplay Name=Result&gt

&ltAction Type=Accept Label=Done Task=GO Vars=USDollar=&Euro=&UKPounds=&JapanYen= Dest=../CurrencyConvert/CurrencyConvert.hdml&gt

&ltCenter&gtCurrency Converter

&ltLine&gtUS Dollars:&lttab&gt$USDollar&ltbr&gt Euro:&lttab&gt$Euro&ltbr&gt UK Pounds:&lttab&gt$UKPound&ltbr&gt Japan Yen:&lttab&gt$JapanYen

&lt/Display&gt

&lt/HDML&gt";

print $Deck;

Подробнее о приложении CurrencyConvert.wml



Подробнее о приложении CurrencyConvert.wml

Каждый раз, когда пользователь запускает приложение CurrencyConvert, декаCurrencyConvert.wml отображает список возможных валют и, в конечном счете,ожидает ввода суммы денег, которые пользователь желает конвертировать. Далее, эта дека вызывает сценарий языка Perl CurrencyConvert.pl, который производит вычисления и создает новый файл, который отображает результат. ДекаCurrencyConvert.wml содержит следующий исходный код:

&lt?xml version="1.0"?&gt &lt!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//E "http://www.wapforum.org/DTD/wml_1.1.xml"&gt

&ltwml&gt

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt

&ltcard id="CurrencyConvert"&gt

&ltdo type="accept" label="Enter"&gt &ltnoop /&gt &lt/do&gt

&ltp align="center"&gt

Currency Converter&ltbr/&gt

&lt/p&gt

&ltp align="left" mode="nowrap"&gt

&ltselect&gt

&ltoption onpick="#GetUSDollar"&gtUS Dollars:&lt/option&gt &ltoption onpick="#GetEuro"&gtEuro:&lt/option&gt &ltoption onpick="#GetUKPounds"&gtUK Pounds: &lt/option&gt &ltoption onpick="#GetJapanYen"&gtJapan Yen: &lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetUSDollar"&gt

&ltdo type="accept"&gt &ltgo href="../waplibcgi/CurrencyConvertWML.pl? USDollar&$(USDollar)" /&gt &lt/do&gt

&ltp align="left"&gt

US Dollars: &ltinput name="USDollar" maxlength="7" format="X*X" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetEuro"&gt

&ltdo type="accept"&gt &ltgo href="../waplibcgi/CurrencyConvertWML.pl? Euro&$(Euro)" /&gt &lt/do&gt




&ltp align="left"&gt

Euro: &ltinput name="Euro" maxlength="7" format="X*X" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetUKPounds"&gt

&ltdo type="accept"&gt &ltgo href="../waplibcgi/CurrencyConvertWML.pl? UKPounds&$(UKPounds)" /&gt &lt/do&gt

&ltp align="left"&gt

UK Pounds: &ltinput name="UKPounds" maxlength="7" format="X*X" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetJapanYen"&gt

&ltdo type="accept"&gt &ltgo href="../waplibcgi/CurrencyConvertWML.pl? JapanYen&$(JapanYen)" /&gt &lt/do&gt

&ltp align="left"&gt

Japan Yen: &ltinput name="JapanYen" maxlength="7" format="X*X" /&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt

Так же как и во всех деках формата WML, первые два ее элемента сообщают браузеру, какую из версий спецификации WAP поддерживает данное приложение. Внашем случае WML-страница поддерживает версию 1.0 языка XML и версию 1.1описания типа документа (DTD), разработанного ассоциацией WAP Forum.

&lt?xml version="1.0"?&gt &lt!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//E "http://www.wapforum.org/DTD/wml_1.1.xml"&gt

Далее, за информацией о версиях, каждый WML-файл начинается с тега <wml>. Вконце каждого файла вводят </wml>, что означает окончание исходного кодаприложения. За <wml> следуют теги <head> и </head>, внутри которых находитсяинформация о самом исходном коде, включая метаданные и информацию обуправлении доступом. Многие программисты называют метаданные «данными оданных». Другими словами, в этом случае метаданные, которые считывает и обрабатывает браузер, сообщают ему, как трактовать данные.

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt

Элемент <meta> позволяет точно определить метаинформацию для исходногофайла. В нашем случае строка http-eguiv="Cache-Control" сообщает браузеруWAP, что эта часть метаинформации используется системой кэширования памяти. Аналогично, строка content=max-age=0 сообщает браузеру, что максимальноевремя, в течение которого будет кэшироваться этот файл, равно нулю секунд;значит, браузер не будет кэшировать данные, а загружать данные с сервера каждый раз, когда они будут запрошены. Для этой книги значение нуля было выбрано для содействия процессу обучения читателя. При выборе нуля каждый раз,когда будут происходить изменения, они будут передаваться на телефон. В реальном приложении статическое меню, подобное этому, можно использовать поумолчанию в течение 30 дней. Последняя строка forua="true" определяет, чтозначение Cache-Control предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.

Далее, дека определяет карту CurrencyConvert, которая использует элемент <select> для отображения списка доступных валют. После того как пользовательпроизвел выбор желаемой валюты, происходит переход к соответствующей карте, находящейся внутри этой же деки. К примеру, если выбрана валюта США, висходном коде происходит переход к карте GetUSDollar. Внутри этой карты используется элемент <lnput> для ввода суммы валюты, и затем запускается сценарий CurrencyConvertWML.pl, который и производит непосредственно вычисления. Этот сценарий языка Perl содержит следующий исходный код:

#!/usr/bin/perl

$Buffer = $ENV{'QUERY_STRING'};

@data = split(/&/, $Buffer);

$Currency = $data[0]; $Value = $data[1];

$DollarToEuro = .971032; $DollarToPound = .607327; $DollarToYen = 105.555;

$EuroToDollar = 1.02982; $EuroToPound = .625449; $EuroToYen = 108.702;

$PoundToDollar = 1.64649; $PoundToEuro = 1.59887; $PoundToYen = 173.814;

$YenToDollar = .00947277; $YenToEuro = .00919888; $YenToPound = .00575343;

if ($Currency eq "USDollar") { $USDollar = $Value; $Euro = (int(($Value * $DollarToEuro) * 100)) / 100; $UKPound = (int(($Value * $DollarToPound) * 100)) / 100; $JapanYen = (int(($Value * $DollarToYen) * 100)) / 100; }



elsif ($Currency eq "Euro") { $USDollar = (int(($Value * $EuroToDollar) * 100)) / 100; $Euro = $Value; $UKPound = (int(($Value * $EuroToPound) * 100)) / 100; $JapanYen = (int(($Value * $EuroToYen) * 100)) / 100; }

elsif ($Currency eq "UKPounds") { $USDollar = (int(($Value * $PoundToDollar) * 100)) / 100; $Euro = (int(($Value * $PoundToEuro) * 100)) / 100; $UKPound = $Value; $JapanYen = (int(($Value * $PoundToYen) * 100)) / 100; }

elsif ($Currency eq "JapanYen") { $USDollar = (int(($Value * $YenToDollar) * 100)) / 100; $Euro = (int(($Value * $YenToEuro) * 100)) / 100; $UKPound = (int(($Value * $YenToPound) * 100)) / 100; $JapanYen = $Value; }

$Deck = "Content-type: text/vnd.wap.wml

&lt?xml version=\"1.0\"?&gt &lt! DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\"&gt

&ltwml&gt

&lthead&gt

&ltmeta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/&gt

&lt/head&gt

&ltcard id=\"Result\"&gt

&ltdo type=\"accept\" label=\"Done\"&gt &ltgo href=\"../CurrencyConvert/CurrencyConvert.wml\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Currency Converter

&lt/p&gt

&ltp align=\"left\" mode=\"nowrap\"&gt

&lttable align=\"left\" columns=\"2\"&gt

&lttr&gt &lttd&gtUS Dollars:&lt/td&gt &lttd&gt$USDollar&lt/td&gt &lt/tr&gt

&lttr&gt &lttd&gtEuro:&lt/td&gt &lttd&gt$Euro&lt/td&gt &lt/tr&gt

&lttr&gt &lttd&gtUK Pounds:&lt/td&gt &lttd&gt$UKPound&lt/td&gt &lt/tr&gt

&lttr&gt &lttd&gtJapan Yen:&lt/td&gt &lttd&gt$JapanYen&lt/td&gt &lt/tr&gt

&lt/table&gt



&lt/p&gt

&lt/card&gt

&lt/wml&gt";

print $Deck;

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

Запускаясь, сценарий использует параметр $ENV для получения указателя на список параметров (приложение передает сценарию тип валюты и сумму денег какпараметры). Далее, исходный код использует функцию разделения split (/&/,$Ви££ег)для анализа переданного, употребляя символ & (амперсант) как разделитель. А именно, значение типа валюты присваивается элементу массиваdata[0], а значение суммы - элементу массива data[l]. Далее, значение этихэлементов массива (тип валюты и сумма) присваивается переменным $ Currencyи $Value.

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

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

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