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

         

Отображение на экране данных о доме



Рисунок 19.3. Отображение на экране данных о доме




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



Рисунок 19.2. Отображение списка домов,чья цена попадает в указанный пользователем диапазон




Приглашение пользователюна ввод ценового диапазона



Рисунок 19.1. Приглашение пользователюна ввод ценового диапазона




Рассмотрение Peri-сценария RealEstateHDML.pl



Рассмотрение Peri-сценария RealEstateHDML.pl

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

#!/usr/bin/perl

read (STDIN, $Buffer, $ENV{'CONTENT_LENGTH'});

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

$PriceLow = $data[0]; $PriceHigh = $data[1];

$Price1 = 99500; $Price2 = 149995; $Price3 = 249995; $Price4 = 500000; $Price5 = 1500000;

if (($PriceLow &lt= 0) ($PriceHigh &lt= 0) ($PriceLow &gt $PriceHigh))

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



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

&ltDisplay Name=Error&gt

&ltAction Type=Accept Label=Back Task=GO Dest=../RealEstate/RealEstate.hdml&gt

&ltWrap&gtError in price range. Please enter a minimum price and a maximum price.

&lt/Display&gt

&lt/HDML&gt";

}

else

{

$Option = "";

if (($Price1 &gt= $PriceLow) && ($Price1 &lt= $PriceHigh)) { $Option = $Option . "&ltCE Task=GO Dest=../RealEstate/GV01234.hdml&gtGV01234 &dol;99,500"; }

if (($Price2 &gt= $PriceLow) && ($Price2 &lt= $PriceHigh)) { $Option = $Option . "&ltCE Task=GO Dest=../RealEstate/LV01234.hdml&gtLV01234 &dol;149,995"; }

if (($Price3 &gt= $PriceLow) && ($Price3 &lt= $PriceHigh)) { $Option = $Option . "&ltCE Task=GO Dest=../RealEstate/LV77711.hdml&gtLV77711 &dol;249,995"; }

if (($Price4 &gt= $PriceLow) && ($Price4 &lt= $PriceHigh)) { $Option = $Option . "&ltCE Task=GO Dest=../RealEstate/BC01234.hdml&gtBC01234 &dol;500,000"; }

if (($Price5 &gt= $PriceLow) && ($Price5 &lt= $PriceHigh)) { $Option = $Option . "&ltCE Task=GO Dest=../RealEstate/LV11711.hdml&gtLV11711 &dol;1,500,000"; }




if ($Option eq "")

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

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

&ltDisplay Name=Error&gt

&ltAction Type=Accept Label=Back Task=GO Dest=../RealEstate/RealEstate.hdml&gt

&ltWrap& gtNo houses match the price range.

&lt/Display&gt

&lt/HDML&gt";

}

else

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

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

&ltChoice Name=Pick&gt

&ltAction Type=Accept Label=View&gt &ltAction Type=Soft1 Label=Back Task=GO Dest=../RealEstate/RealEstate.wml&gt

&ltLine&gtPick a house&ltbr&gt ...MLS#....Price..

" . $Option . "

&lt/Choice&gt

&lt/HDML&gt"; }

}

print $Deck;

Как можно видеть, сценарий использует пять переменных, от $Pricel до$Price5, чтобы отслеживать цены домов, которые известны сценарию. Как и впредыдущем сценарии, для определения факта попадания цены дома в указанныйдиапазон, в программном коде используется серия операторов if. После того какпросмотрены цены всех пяти домов, приложение формирует HDML-страницу, которая с помощью элемента <Choice> создает меню из опций, отвечающих условиям поиска (опции сценарий сохраняет в переменной $0ption). Когда пользователь позднее выбирает из списка некоторый конкретный дом, HDML-приложение загружает HDML-страницу, соответствующую выбранному дому. Например, файл 77711 .hdml содержит следующий программный код:

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

&ltDisplay Name=House&gt

&ltAction Type=Accept Label=Back Task=PREV&gt

&ltLine&gtMLS #:LV77711&ltbr&gt &dol;249,995&ltbr&gt Las Vegas&ltbr&gt 4 BR / 2 Ba&ltbr&gt 4100 SF&ltbr&gt &ltA Task=GOSUB Dest=#MoreInfo&gtMore Info&lt/A&gt

&lt/Display&gt

&ltDisplay Name=MoreInfo&gt

&ltAction Type=Accept Label=Back Task=RETURN&gt

&ltLine&gtLot Size: 400X400&ltbr&gt Year Built: 1998&ltbr&gt Fireplace: Yes&ltbr&gt Patio: Yes&ltbr&gt Pool: Yes&ltbr&gt Spa: Yes

&lt/Display&gt

&lt/HDML&gt

Когда HDML-страница запускает первую карту, браузер выполняет программныйкод, располагающийся внутри элемента House. Если пользователь выбирает опцию More Information (Дополнительная информация), выполняется ветвлениепрограммного кода и переход (с использованием задания GOSUB) на элементMorelnfо.



Рассмотрение приложения Real Estate



Рассмотрение приложения Real Estate

При запуске приложения RealEstate WML-страница RealEstate.wml выводит на экран приглашение пользователю на ввод минимальной и максимальной цены надом. Затем, чтобы обработать введенные данные, приложение запускает Perl-сценарий. WML-страница RealEstate.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="RealEstatePrice"&gt

&ltonevent type="onenterbackward"&gt

&ltgo method="post" href="../waplibcgi/RealEstateWML.pl"&gt &ltpostfield name="PriceLow" value="$(PriceLow)&"/&gt &ltpostfield name="PriceHigh" value="$(PriceHigh)&"/&gt &lt/go&gt

&lt/onevent&gt

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

&ltdo type="options" label="Find"&gt &ltgo href="#GetRealEstateResults" /&gt &lt/do&gt

&ltp align="center"&gt

Real Estate&ltbr/&gt Listings&ltbr/&gt

&lt/p&gt

&ltp align="left"&gt

Price Range:

&ltselect&gt

&ltoption onpick="#GetPriceLow"&gtLow $$$(PriceLow)&lt/option&gt &ltoption onpick="#GetPriceHigh"&gtHigh $$$(PriceHigh)&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetPriceLow"&gt

&ltdo type="accept"&gt &ltgo href="#RealEstatePrice" /&gt &lt/do&gt

&ltp align="left"&gt

Low: &ltinput name="PriceLow" maxlength="7" format="N6N" /&gt




&lt/p&gt

&lt/card&gt

&ltcard id="GetPriceHigh"&gt

&ltdo type="accept"&gt &ltgo href="#RealEstatePrice" /&gt &lt/do&gt

&ltp align="left"&gt

High: &ltinput name="PriceHigh" maxlength="7" format="N6N" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetRealEstateResults"&gt

&ltonevent type="onenterforward"&gt

&ltgo method="post" href="../waplibcgi/RealEstateWML.pl"&gt &ltpostfield name="PriceLow" value= "$(PriceLow)&"/&gt &ltpostfield name="PriceHigh" value= "$(PriceHigh)&"/&gt &lt/go&gt

&lt/onevent&gt

&ltonevent type="onenterbackward"&gt

&ltgo method="post" href="../waplibcgi/RealEstateWML.pl"&gt &ltpostfield name="PriceLow" value= "$(PriceLow)&"/&gt &ltpostfield name="PriceHigh" value= "$(PriceHigh)&"/&gt &lt/go&gt

&lt/onevent&gt

&lt/card&gt

&lt/wml&gt

Первые два элемента WML-страницы сообщают WAP-браузерам версию WAP-

спецификации, которую поддерживает приложение. В данном случае WML-

страница совместима с XML 1.0 и описанием типа документа (DTD) версии 1.1,

разработанным ассоциацией WAP Forum. Любая WML-страница, размещаемая

после информации о версии, начинается с тега <WML>. В конце каждой WML-

страницы должен находиться соответствующий тег </WML>, который завершает

элементы WML-страницы. Теги <HEAD> и </HEAD>, располагающиеся после тега

<WML>, позволяют указывать данные о WML-странице, включая метаданные и информацию, управляющую доступом.

Элемент <meta> позволяет определять для WML-страницы метаинформацию. Внашем случае параметр http-equiv=Cache-Control сообщает WAP-браузеру, чтоданная часть метаинформации относится к системе кэширования памяти.


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

Приложение вначале использует элемент <select>, обеспечивающий возможность выбора для ввода минимальной или максимальной цены. На основе сделанного пользователем выбора выполняется ветвление программного кода и переход на определенную локальную карту, которая выдает приглашение пользователю на ввод соответствующих данных. Например, карта GetPriceHigh позволяет пользователю указывать верхнюю границу ценового диапазона. Элемент<input>, расположенный внутри карты GetPriceHigh, используется для выводаприглашения пользователю на форматированный ввод.

После того как пользователь введет необходимую информацию и выберет кнопкупоиска (Find), приложение запускает Peri-сценарий RealEstateWML.pl, который, всвою очередь, находит информацию о домах, чьи цены лежат в указанном пользователем ценовом диапазоне.


Рассмотрение приложения RealEstate.hdml



Рассмотрение приложения RealEstate.hdml

Как и приложение на WML, RealEstate.hdml предоставляет пользователю возможность поиска домов, цена которых попадает в указанный ценовой диапазон, и длявыполнения большей части обработки данных использует Peri-сценарий. Приложение RealEstate.hdml реализуется с помощью следующего программного кода наHDML:

&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="House"&gt

&ltdo type="accept" label="Back"&gt &ltprev/&gt &lt/do&gt

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

MLS #:LV77711&ltbr/&gt $$249,995&ltbr/&gt Las Vegas&ltbr/&gt 4 BR / 2 Ba&ltbr/&gt 4100 SF&ltbr/&gt &lta href="#MoreInfo" title="Info"&gtMore Info&lt/a&gt &lt/p&gt

&lt/card&gt

&ltcard id="MoreInfo"&gt

&ltdo type="accept" label="Back"&gt &ltprev /&gt &lt/do&gt

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

Lot Size: 400X400&ltbr/&gt Year Built: 1998&ltbr/&gt Fireplace: Yes&ltbr/&gt Patio: Yes&ltbr/&gt Pool: Yes&ltbr/&gt Spa: Yes

&lt/p&gt

&lt/card&gt

&lt/wml&gt

Первый элемент в файле сообщает браузеру (или другим программистам) информацию о версии спецификации HDML, поддерживаемой приложением. Крометого, параметр Markable=True определяет, что браузер может устанавливать наHDML-странице закладку, а параметр TTL=0 предписывает браузеру не выполнятькэширование HDML-страницы. Работа приложения начинается с использованияэлемента <Choice>, который позволяет, если это требуется пользователю, вводить минимальную или максимальную допустимую цену. Основываясь на сделанном пользователем выборе, приложение переходит на именованный элемент<Entry>, который выводит на экран приглашение пользователю на ввод соответствующих данных. После того как пользователь введет требуемую информацию,приложение переходит на элемент GetRealEstateResults, который, в свою очередь, запускает Peri-сценарий RealEstateHDML.pl, чтобы найти все дома, удовлетворяющие условиям поиска.



Рассмотрение Реrl-сценария RealEstateWML.pl



Рассмотрение Реrl-сценария RealEstateWML.pl

После указания пользователем верхней и нижней границы цен в приложенииRealEstate, программа запускает Peri-сценарий для поиска домов, цены которыхпопадают в указанный диапазон. Чтобы выполнить данную обработку, Peri-сценарию уже заранее «известна» информация о некотором ограниченном числедомов (в реальном приложении сценарий получал бы необходимую информациюиз базы данных). Чтобы сравнить стоимость известных ему домов с ценовымдиапазоном, сценарий использует серию ветвлений if-else. Если цена на домпопадает в диапазон, сценарий добавляет дом в опции меню.

Perl-сценарий RealEstateWML.pl реализуется с помощью следующего программного кода:

#!/usr/bin/perl

require 'DeckUtils.pl';

%cgiVars = &AppUtils::ParseCGIVars();

$PriceLow = $cgiVars{"PriceLow"}; $PriceHigh = $cgiVars{"PriceHigh"};

$Price1 = 99500; $Price2 = 149995; $Price3 = 249995; $Price4 = 500000; $Price5 = 1500000;

if (($PriceLow &lt= 0) ($PriceHigh &lt= 0) ($PriceLow &gt $PriceHigh))

{ $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=\"Error\"&gt

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

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

Error in price range. Please enter a minimum price and a maximum price.

&lt/p&gt

&lt/card&gt

&lt/wml&gt";

}

else

{

$Option = "";

if (($Price1 &gt= $PriceLow) && ($Price1 &lt= $PriceHigh)) { $Option = $Option . "&ltoption onpick=\"../RealEstate/GV01234.wml \"&gtGV01234 \$\$99,500&lt/option&gt"; }




if (($Price2 &gt= $PriceLow) && ($Price2 &lt= $PriceHigh)) { $Option = $Option . "&ltoption onpick=\"../RealEstate/LV01234.wml \"&gtLV01234 \$\$149,995&lt/option&gt"; }

if (($Price3 &gt= $PriceLow) && ($Price3 &lt= $PriceHigh)) { $Option = $Option . "&ltoption onpick=\"../RealEstate/LV77711.wml \"&gtLV77711 \$\$249,995&lt/option&gt"; }

if (($Price4 &gt= $PriceLow) && ($Price4 &lt= $PriceHigh)) { $Option = $Option . "&ltoption onpick=\"../RealEstate /BC01234.wml\"&gtBC01234 \$\$500,000&lt/option&gt"; }

if (($Price5 &gt= $PriceLow) && ($Price5 &lt= $PriceHigh)) { $Option = $Option . "&ltoption onpick=\"../RealEstate /LV11711.wml\"&gtLV11711 \$\$1,500,000&lt/option&gt"; }

if ($Option eq "")

{ $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=\"Error\"&gt

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

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

No houses match the price range.

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

else

{ $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=\"Pick\"&gt

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

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"../RealEstate /RealEstate.wml\" /&gt &lt/do&gt

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

Pick a house&ltbr/&gt ...MLS#....Price..

&ltselect&gt " . $Option . " &lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

}

print $Deck;

Выполнение сценария начинается с анализа параметров, передаваемых ему WML-страницей Real Estate.wml. Далее, сценарий присваивает переменным, начиная с$Pricel до $Price5, значения в долларовом выражении. Пять переменныхсоответствуют ценам на пять домов, известных сценарию. Затем сценарийиспользует оператор if, чтобы определить введены пользователем минимальнаяи максимальная цены или нет; если это не сделано, сценарий выводит на экрансообщение об ошибке.

Если же пользователь указал ценовой диапазон, программа сравнивает цену каждого из пяти домов с максимальной и минимальной допустимой ценой. Если ценана дом попадает в указанный диапазон, сценарий добавляет информацию о доме(такую, как списочный номер, цена и соответствующий WML-файл) в переменную$0ption. Далее, когда сценарий обработает данные всех пяти домов, будет создансписок домов с желаемой ценой путем размещения переменной $Option внутриэлемента <select>.

Когда позже пользователь выбирает из списка какой-либо дом, приложение загружает соответствующую WML-страницу. Например, WML-страница LV77711.wmlреализуется с помощью следующего программного кода:

Как можно видеть, WML-страница содержит две карты. Когда WML-страница загружает первую карту, приложение выполняет элементы карты House. При выборе пользователем опции More information (Дополнительные данные), приложениезагружает карту Morelnfо.