Отображение суммы выплатыпо закладной
Рисунок 13.2. Отображение суммы выплатыпо закладной
Подробнее о приложении 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. Приглашение к вводуинформации по закладной