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

         

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



ГЛАВА 13


Подробнее о приложении MortgageCalculator
Подробнее о сценарии языка Perl MortgageCalcWML.pl
Подробнее о приложении MortgageCalc.hdml
Подробнее о сценарии языка Perl MortgageCalcHDML.pl

По мере того, как сложность наших приложений, поддерживающих протол WAP,увеличивается, у вас может возникнуть необходимость выполнения арифметических операций внутри своих приложений. В этой главе мы создадим приложениеMortgageCalculator (Вычисление закладной), которое сочетает в себе несколькофайлов формата WML и сценарий языка Perl. Это приложение позволяет пользователю проводить вычисления выплат по закладной, установленных для определенной основной суммы, ссудного процента (который пользователь может ввести в установленном формате, например, 07,75) и количества лет, необходимыхдля погашения заема. Когда пользователь запускает приложение в первый раз, надисплее сотового телефона ему предлагается ввести основную сумму, значениессудного процента и количество лет, как показано на Рис. 13.1.


После того как пользователь введет всю необходимую по закладной информацию, приложение MortgageCalculator отобразит размер соответствующей выплаты,как показано на Рис. 13.2. Ш



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






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





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




Как и приложение формата WML, файл MortgageCalc.hdml позволяет пользователю вычислить сумму выплаты по закладной, используя собственный сотовый телефон. Этот файл имеет следующий исходный код:
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=Mortgage Method=Alpha>
<Action Type=Accept Label=Edit> <Action Type=Soft1 Label=Calc Task=GO Dest=#CalcPayments>
<Center>Mortgage Calculator<br>
<CE Task=GOSub Dest=#GetPrincipal Vars=Principal=$Principal Receive=Principal> Principal: &dol;$Principal
<CE Task=GOSub Dest=#GetInterest Vars=Interest=$Interest Receive=Interest> Interest(%): $Interest
<CE Task=GOSub Dest=#GetYears Vars=Years=$Years Receive=Years> Years: $Years
</Choice>
<Entry Name=GetPrincipal Default=$Principal Key=Principal Format=NNNNNN*N>
<Action Type=Accept Task=Return Retvals=$Principal> Principal:&dol;
</Entry>
<Entry Name=GetInterest Default=$Interest Key=Interest Format=NN.NN>
<Action Type=Accept Task=Return Retvals=$Interest> Interest(%):
</Entry>
<Entry Name=GetYears Default=$Years Key=Years Format=NN>
<Action Type=Accept Task=Return Retvals=$Years> Years:
</Entry>
<NoDisplay Name=CalcPayments>
<Action Type=Accept Task=GO Method=Post PostData=$Principal&$Interest&$Years Dest=../waplibcgi/MortgageCalcHDML.pl>
</NoDisplay>
</HDML>


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


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


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


После того как пользователь введет и подтвердит всю необходимую информацию, приложение переходит к карте CalcPayments, откуда и вызывается сценарий языка Perl MortgageCalcHDML.pl.





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





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


Когда пользователь запускает приложение MortgageCalculator, декаMortgageCalc.wml предлагает пользователю ввести значение основной суммы,ссудный процент и количество лет на выплату ссуды. Далее, приложение запускает сценарий языка Perl (файл MortgageCalcWML.pl). Дека MortgageCalc.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="MortgageCalc">
<do type="accept" label="Edit"> <noop /> </do>
<do type="options" label="Calc"> <go href="#CalcPayments" /> </do>
<p align="center">
Mortgage Calculator<br/>
</p>
<p align="left" mode="nowrap">
<select>
<option onpick="#GetPrincipal">Principal: $$$(Principal)</option> <option onpick="#GetInterest">Interest(%): $(Interest)</option> <option onpick="#GetYears">Years: $(Years)</option>
</select>
</p>
</card>
<card id="GetPrincipal">
<do type="accept"> <go href="#MortgageCalc" /> </do>
<p align="left">
Principal: $$ <input name="Principal" maxlength="7" format="NNNNNN*N" />
</p>
</card>
<card id="GetInterest">
<do type="accept"> <go href="#MortgageCalc" /> </do>
<p align="left">
Interest(%): <input name="Interest" maxlength="5" format="NN.NN" />
</p>
</card>
<card id="GetYears">
<do type="accept"> <go href="#MortgageCalc" /> </do>
<p align="left">
Years: <input name="Years" maxlength="2" format="NN" />
</p>
</card>
<card id="CalcPayments">
<onevent type="onenterforward">
<go method="post" href="../waplibcgi/MortgageCalcWML.pl"> <postfield name="Principal" value="$(Principal)&"/> <postfield name="Interest" value="$(Interest)&"/> <postfield name="Years" value="$(Years)"/> </go>
</onevent>
</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 предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.


Приложение использует индивидуальные карты в деке для основной суммы,ссудного процента и количества лет. Внутри основной карты деки находитсяэлемент <Select> для предоставления пользователю возможности выбрать элемент, который он хочет редактировать. Далее, внутри соответствующей карты,приложение использует элемент <lnput> для возможности ввода пользователемзначения. В элементе <Input> Д|9Л? f011!3* определяет формат данных, принимаемых приложением.


После ввода и подтверждения пользователем необходимых значений, приложение вызывает карту CalcPayment, из которой запускается сценарий языка PerlMortgageCalcWML.pl.





Подробнее о сценарии языка Perl MortgageCalcHDML.pl





Подробнее о сценарии языка Perl MortgageCalcHDML.pl


Как было сказано выше, после того как пользователь вводит всю необходимуюдля вычислений информацию в файле MortgageCalc.hdml, приложение пересылает данные сценарию MortgageCalcHDML.pl. Очевидно, что используемые для отображения информации по выплатам элементы аналогичны элементам сценария,описанного в этой главе выше. Исключение составляют только два момента: каксценарий определяет необходимые ему параметры и как он создает новую декуформата HDML для отображения результата работы приложения. Исходный кодсценария MortgageCalcHDML.pl приведен ниже:
#!/usr/bin/perl
read (STDIN, $Buffer, $ENV{'CONTENT_LENGTH'});
@data = split(/&/, $Buffer);
$Principal = $data[0]; $Interest = $data[1]; $Years = $data[2];
$MonthInt = ($Interest / 12) / 100; $Months = $Years * 12;
$Payment = $Principal * ($MonthInt / (1 - (1 + $MonthInt) ** (-$Months))); $Payment = $Payment * 100; $Payment = (int $Payment) / 100;
$Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Display Name=Result1>
<Action Type=Accept Label=Done Task=GO Dest=../MortgageCalc/MortgageCalc.hdml>
<Line>Principal: &dol;$Principal<br> Interest(%): $Interest<br> Years: $Years<br> Payment: &dol;$Payment
</Display>
</HDML>";
print $Deck;





Подробнее о сценарии языка Perl MortgageCalcWML.pl





Подробнее о сценарии языка Perl MortgageCalcWML.pl


Как было сказано выше, каждый раз после ввода пользователем всей необходимой по закладной информации, карта CalcPayment активизирует сценарий языкаPerl, который вычисляет и отображает информацию по выплате. Этот сценарийMortgageCalcWML.pl имеет следующий исходный код:
#!/usr/bin/perl
require 'DeckUtils.pl';
%cgiVars = &AppUtils::ParseCGIVars();
$Principal = $cgiVars{"Principal"}; $Interest = $cgiVars{"Interest"}; $Years = $cgiVars{"Years"};
$MonthInt = ($Interest / 12) / 100; $Months = $Years * 12;
$Payment = $Principal * ($MonthInt / (1 - (1 + $MonthInt) ** (-$Months))); $Payment = $Payment * 100; $Payment = (int $Payment) / 100;
$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 id=\"Result1\">
<do type=\"accept\" label=\"Done\"> <go href=\"../MortgageCalc /MortgageCalc.wml\" /> </do>
<p align=\"left\" mode=\"nowrap\">
Principal: \$\$$Principal<br/> Interest(%): $Interest<br/> Years: $Years<br/> Payment: \$\$$Payment
</p>
</card>
</wml>";
print $Deck;

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



Приглашение к вводуинформации по закладной



Рис.. 13.1. Приглашение к вводуинформации по закладной





Отображение суммы выплатыпо закладной



Рис.. 13.2. Отображение суммы выплатыпо закладной