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

         

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



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

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

&ltdo type="accept" label="Pick"&gt &ltgo href="../waplibcgi/RestCallTypeWML.pl ?$(RestType)" /&gt &lt/do&gt

&ltp align="center"&gt

Restaurants

&lt/p&gt

&ltp align="left"&gt



&ltselect name="RestType"&gt

&ltoption value="American"&gtAmerican&lt/option&gt &ltoption value="Chinese"&gtChinese&lt/option&gt &ltoption value="FastFood"&gtFast Food&lt/option&gt &ltoption value="HealthFood"&gtHealth Food&lt/option&gt &ltoption value="Italian"&gtItalian&lt/option&gt &ltoption value="Mexican"&gtMexican&lt/option&gt &ltoption value="Seafood"&gtSeafood&lt/option&gt

&lt/select&gt

&lt/p&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, управляющеекэшированием, предназначено для телефона и не должно удаляться каким-либопромежуточным агентом.

Для отображения разных типов ресторанов WML-страница использует элемент<select>. После того как пользователь сделает свой выбор, WML-страница запускает Peri-сценарий RestCallTypeWML.pl, который выводит на экран список соответствующих типов ресторанов. Сценарий RestCallTypeWML.pl реализуется с помощью следующего программного кода:

#!/usr/bin/perl

$RestType = $ENV{'QUERY_STRING'};

if ($RestType eq "American")

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

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallAmerWML.pl? \$(RestName)\" /&gt &lt/do&gt

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

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt American&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"AllStar\"&gtAll Star Cafe&lt/option&gt &ltoption value=\"MarysDiner\"&gtMary\'s Diner&lt/option&gt &ltoption value=\"Timberline\"&gtTimberline Inn&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "Chinese")

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

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallChineseWML.pl? \$(RestName)\" /&gt &lt/do&gt

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

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Chinese&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt



&ltoption value=\"ChinaGarden\"&gtChina Garden&lt/option&gt &ltoption value=\"GoldenDragon\"&gtGolden Dragon&lt/option&gt &ltoption value=\"PlumTree\"&gtPlum Tree Inn&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "FastFood")

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

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallFastFoodWML.pl? \$(RestName)\" /&gt &lt/do&gt

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

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Fast Food&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"BurgerKing\"&gtBurger King&lt/option&gt &ltoption value=\"McDonalds\"&gtMcDonald's &lt/option&gt &ltoption value=\"TopSpot\"&gtTop Spot &lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "HealthFood")

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

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallHealthFoodWML.pl? \$(RestName)\" /&gt &lt/do&gt

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

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Health Food&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"GeneralNutrition\"&gtGeneral Nutrition&lt/option&gt &ltoption value=\"HealthExpress\"&gtHealth Express&lt/option&gt &ltoption value=\"LivingHealthy\"&gtLiving Healthy&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "Italian")

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

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallItalianWML.pl? \$(RestName)\" /&gt &lt/do&gt

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

&ltp align=\"center\"&gt



Restaurants&ltbr/&gt Italian&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"Marios\"&gtMario's&lt/option&gt &ltoption value=\"OliveGarden\"&gtOlive Garden&lt/option&gt &ltoption value=\"PapaMurphys\"&gtPapa Murphy's&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "Mexican")

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

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallMexicanWML.pl?\ $(RestName)\" /&gt &lt/do&gt

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

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Mexican&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"BajaFresh\"&gtBaja Fresh&lt/option&gt &ltoption value=\"Guadalajara\"&gtGuadalajara Grill&lt /option&gt &ltoption value=\"LaVilla\"&gtLa Villa&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "Seafood")

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

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallSeafoodWML.pl?\ $(RestName)\" /&gt &lt/do&gt

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

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Seafood&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"KPSeafood\"&gtK \& P Seafood&lt/option&gt &ltoption value=\"FishCompany\"&gtLas Vegas Fish Company&lt/option&gt &ltoption value=\"SevenSeas\"&gtSeven Seas&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

print $Deck;

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

После выбора пользователем конкретного ресторана вновь сформированнаяWML-страница вызывает отвечающий типу кухни сценарий, такой, как RestCallltalian или RestCallMexican, и передает сценарию название желаемого ресторана.


Сценарий, в свою очередь, находит название ресторана и формирует для ресторана

#!/usr/bin/perl

$RestName = $ENV{'QUERY_STRING'};

if ($RestName eq "Marios")

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

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"RestCallTypeWML.pl?Italian\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Italian&ltbr/&gt

&lt/p&gt

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

Mario's&ltbr/&gt 111 North Rainbow&ltbr/&gt Las Vegas, NV&ltbr/&gt &lta href=\"wtai://wp/mc;7025551212\" title=\"Call\"&gt702-555-1212&lt/a&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt";

}

elsif ($RestName eq "OliveGarden")

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

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"RestCallTypeWML.pl?Italian\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Italian&ltbr/&gt

&lt/p&gt

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



Olive Garden&ltbr/&gt 7890 West Sahara&ltbr/&gt Las Vegas, NV&ltbr/&gt &lta href=\"wtai://wp/mc;7025551212\" title=\"Call\"&gt702-555-1212&lt/a&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt";

}

elsif ($RestName eq "PapaMurphys")

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

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"RestCallTypeWML.pl?Italian\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Italian&ltbr/&gt

&lt/p&gt

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

Papa Murphy's&ltbr/&gt 123 Main Street&ltbr/&gt Las Vegas, NV&ltbr/&gt &lta href=\"wtai://wp/mc;7025551212\" title=\"Call\"&gt702-555-1212&lt/a&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt";

}

print $Deck;

Как можно видеть, сценарий просто определяет название ресторана, затем формирует соответствующую WML-страницу. Наиболее интересной частью данногопрограммного кода является существующий для каждого ресторана элемент привязки (anchor - анкер) <а>, который позволяет пользователю автоматическизвонить в ресторан:

&lta href=\"wtai://wp/mc;7025551212\" title=\"Call\"&gt702-555-1212&lt/a&gt

Внутри данного анкера код wtai определяет, что программа будет использоватьфункцию из интерфейса приложений для беспроводных телефонов (WTAI-Wireless Telephony Application Interface).Код wp сообщает, что функция находится в общей библиотеке, а код тс представляет собой имя выполняемой функции(make call-телефонный вызов).


Содержание раздела