Best-club - портал хорошего настроения!
→◊ Библиотека ◊←
Меню сайта
  • Драмы
  • Ужасы
  • Фэнтези
  • Боевики
  • Мистика
  • Комедии
  • Триллеры
  • Мелодрамы
  • Фантастика
  • Мультфильмы
  • Приключения
  • Связь с админом
  • Список пользователей
  • Полная статистика сайта
  • ТОП наград
  • Переводчик
  • Конвертер величин
  • Проверка правописания
  • Раздача ICQ
  • Оставить отзыв о сайте
  • Раскрутка сайтов

  • Поиск по сайту
    Введите ключевое слово
    для поиска



    Статистика сайта




    ProfiSmart TOP webgari.com Рейтинг сайтов

    Каталог сайтов

    bodr_top
    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0

    Зарегистрировано:
    Всего: 1117
    Парней: 1070
    Девушек: 47
    Последний: molodoo

    Облако тегов
    Важная информация
    Главная » Статьи » Wap/Web Мастеру » PHP, Perl, ASP

    WAP и ASP
    Потенциал WAP

    По эргономике мобильный телефон едва ли может конкурировать с PC. Экран мобильника может показывать только несколько символов, его пропускная полоса чрезвычайно ограничена, а ввод текста - довольно неуклюжее занятие. Так зачем беспокоиться? Однако имеются два первичных фактора, которые ,как я думаю ,фактически гарантируют успех WAP:
    Вездесущность: Вы можете обращаться к WAP приложению везде, где Вы можете использовать Ваш мобильный. 
    Встроенный механизм оплаты: телефонный счет будет включать расходы обслуживания WAP. 

    Способность производить оплату без необходимости использования кредитной карточки должна породить бум новых WAP-услуг.

    WAP (Wireless Application Protocol) v1.1 - открытая спецификация, которая намеревается стандартизировать путь, с помощью которого мобильные телефоны обращаются к информации и услугам Internet. Спецификация в настоящее время развивается WAP-Форумом, консорциумом, который поддерживает, согласно их статистическим вычислениям, до 80 % мобильной телефонной промышленности. Версия 1.2 ожидается к концу ноября.

    Фундаментальная концепция, стоящая за WAP, - использование концепций и протоколов Internet , что должно существенно упростить развитие службы WAP.

    WAP протокол использует многоуровневую архитектуру, подобную используемому компьютерными сетями, высший уровень протокола - "старый друг " HTTP. Другими словами, если Вы знаете ASP, Вам не надо далеко идти, прежде чем Вы сделаете Ваш первый WAP сервер.

    Конечно, мобильные телефоны предъявляют более строгие требования касательно ширины полосы и возможностей клиента, и HTML не мог остаться на WAP в его существующей форме.

    Решение WAP Форума - WML (Wireless Mark-up Language), основанный на XML язык форматирования текста, который позволяет переходить между различными WML документами, а также между частями одного документа. WML своего рода отполировал и упростил HTML.

    WAP Форум также определил WMLSCRIPT, который является аналогом JavaScript для телефонов WAP. Подобно созданию сценария клиента сети, WMLScript позволит разработчику поддерживать некоторую логику на мобильном телефоне и обращаться к мобильным функциональным возможностям, которые задаются с помощью сценариев. 
    WML

    Хотя я говорил о связи с сервером сети в терминах мобильных телефонов, сам клиент - не мобильный телефон. Программный компонент, ' WAP шлюз ', фактически переводит мобильные телефонные запросы (WAP- запросы) в HTTP запросы и переназначает ответы сервера HTTP на мобильный (снова через WAP). WML файлы преобразуются в двоичный формат WAP шлюзом. Хотя некоторые WAP шлюзы могут переводить HTML в WML, не ожидайте, что произвольный HTML отобразится в WML с разумным содержанием на мобильном.

    Конечно, эмулятор не нуждается в WAP шлюзе, чтобы работать. Он загружает WML файл непосредственно от сервера сети (или открывает сам из локальной файловой системы) и выполняет его в телефонном окне 



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

    Чтобы обращаться к WAP- службе, Вы нуждаетесь в WAP-эмуляторе. Примеры были мной проверены главным образом с Nokia Toolkit . Вы можете свободно загружать его от Nokia website. Вы будете также должны установить Java Virtual Machine 1.2.2 (свободно доступна от Sun). Nokia Toolkit - также среда разработки. Давайте посмотрим на мобильный интерфейс, отображенный эмулятором


    Мобильный дисплей - ваша программа просмотра. Программируемые клавиши используются, чтобы выбрать из меню возможные функции. Нажимая на программирующую клавишу, Вы инициируете функцию, описанную на соответствующей нижней части дисплея, в нашем случае Select и OK. Левая программирующая клавиша обычно служит для выбора параметров.

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

    Кнопка Select используется, чтобы переходить по ссылкам и выбирать параметры. Хотя это полезно, это также с технической точки зрения избыточно, поскольку опция выбора всегда доступна из меню, инициированного левой программирующей клавишей. Знайте, что различные мобильные устройства могут иметь различные интерфейсы и комбинации WML элементов. Это означает, что различные производители могут поддерживать универсальные функциональные возможности WML различными способами.
    WML архитектура

    WML документ составлен из деки, а дека содержит множественные платы (card). Практически, Вы можете думать о деке как о HTML документе, включающем много индивидуально адресованных частей. Синтаксис #label используется, чтобы обратиться к плате в деке. 

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

    Рассмотрим простой WML документ. Я предполагаю,что читатель обладает элементарными знаниями XML. 

    <!DOCTYPE WML PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
    "http://www.wapforum.org/DTD/wml_1.1.xml">

    Дека должна быть допустимым XML документом, и это подразумевает, что WML документ должен запустить со стандарта XML заголовок и справочники к DTD. 
    <wml> <!—корневой элемент -->
    <card id="card1" title="Example 1">
    <p> <!—плата может содержать только P или DO блоки --> 
    <do type="accept" label="go to card 2">
    <go href="#card2"/>
    </do>
    This is the first card.
    </p>
    </card>
    <card id="card2" title="Example 1">
    <p>
    This is the second card.
    </p>
    </card>
    </wml>

    Когда ваш мобильный получает деку, он покажет текст первой платы. Если Вы нажмете левую программирующую клавишу, Вы сможете перейти к следующей плате.

    Первая карта


    Параметры


    Вторая карта

    Основные WML элементы и разметка:

    "p" Элемент

    Отметка <p> разграничивает параграф. Он используется, чтобы перенести по словам любой текст, который Вы желаете показать.

    "do" элемент

    Каждое WAP-приложение должно поддерживать средства навигации и ввода, сопоставляя кнопку программируемой клавиши с "задачей": <do> < .., некоторая задача ... > <do>. Наиболее используемое значение для атрибута type является accept,при этом к списку параметров, инициированных программируемой клавишей, будет добавлена новая опция. Атрибут метки позволяет Вам определять текст, с которым опция будет представлена. Вы можете определить:
    go - переход к другой плате или деке. Он требует атрибута href, который не нуждается в подробном объяснения. Элемент go может использоваться HTML- тэг <A> или как <FORM>, в зависимости от контекста. 
    Prev - переход к предыдущей плате 
    refresh - обновит дисплей& 
    noop - не делает ничего 

    Различные значения возможны для атрибута "type ", элемент, но все они моделируют различное использование меток и переходов.

    Anchor

    Anchor - WML-аналог меток <A> в HTML. Якорь может содержать задачу подобно элементу "do". Единственная разница - якоря не появляются как опция в меню программируемой клавиши, но представлены как связи в потоке WML, в основном как знакомые ссылки HTML:
    <anchor>
    Go to card 2
    <go href="#card2"/>
    </anchor>
    Переменные

    WML определяет концепцию переменных несколько иным способом, чем HTML и JavaScript. Кроме того, что WML переменные могут использоваться WMLSCRIPT, они могут также использоваться непосредственно в WML-документе для ссылок между платами. Другими словами, Вы можете привести состояние платы к значению соответствующей переменной. Переменная может быть установлена или путем ввода пользователя или через элемент setvar. Конечно, переменные могут определяться и путем создания сценария, но не обязательно. Например, Вы могли бы иметь плату, которая требует ввода имени пользователя и затем отобразить плату ' Привет, Luca’ при интерпретации WML код а" Привет, $ (firstname) ". Это невозможно в традиционном HTML.Так как значения переменных сохраняются для всех плат, они часто используются, чтобы поддержать информацию о состоянии и поддерживать комплексное взаимодействие со службой WAP. Проблема в таком подходе - синхронизации передвижения пользователя по деке с ожидаемым состоянием. Для решения этой проблемы разработчикам надо обрабатывать события, когда пользователь достигает платы (onenterforward и onenterbackward) и когда контекст деки должен быть сброшен (newcontext = "true"). Регенерация используется, чтобы обновить внешний вид платы, содержание которой зависит от переменной.
    Ввод Пользователя

    Конечно, чтобы стать действительно мощный инструментом, переменные должны быть способными хранить сгенерированные пользователем входные значения. Это достигнуто через набор входных элементов, который подобны элементам формы HTML:

    · input - подобен HTML. Пользователь может испытать ввод через мобильную клавиатуру. Как Вы можете понять, это не столь практично, как использование клавиатуры PC, и Вы должны попытаться ограничить использование этого элемента и пользоваться элементами выбора всякий раз, когда это возможно. Атрибут name - имя переменной, которая будет установлена, default и size -очевидные атрибуты. Format определяет маску ввода для поля. Возможные маски ввода и другие атрибуты описаны в справочниках, которые идут с инсталляцией Nokia Toolkit. 
    select/option - список вариантов, из которых может выбирать пользователь. Аналогично HTML: 
    <select name='movie'> 
    <option value='1'>Eyes Wide Shut</option>
    <option value='2'>Notting Hill</option> :
    <option value='13'>Buena Vista Social Club</option>
    </select>
    Атрибут multiple=true сообщает устройству пользователя, что множественный выбор возможен. Событие onpick вызывает, когда выбор сделан/отменен. 
    Postfield - подобно скрытым полям в формах HTML. Оно не будет отображено на экране. и может использоваться, чтобы отправить пары названия / значения на сервер. Фактически это намного удобнее скрытых полей: используя переменные с такими же именами, Вы можете собирать контекстную информацию в Postfield и передавать ее пакетом на сервер. 
    Другие элементы

    Элемент Img поддерживается, но Вы перевести ваши изображения в специальный растровый формат WBMP. WAP телефоны ограничены объемом ОЗУ и ПЗУ. Новый формат позволяет WAP устройствам быстро отображать изображения. Перевести изображения в формат WBMP можно с помощью plug-in для Adobe PhotoShop и Paint Shop Pro (см. ссылку в конце статьи).

    Про (чтобы проверить связь(звено) в конце статьи(изделия)). Не забудьте установить правильные типы MIME на вашем сервере (и для изображений и форматов WAP). Вот их список:
    wml text/vnd.wap.wml
    wmlc application/vnd.wap.wmlc
    wmlsc application/vnd.wap.wmlscriptc
    wmlscript text/vnd.wap.wmlscript
    ws text/vnd.wap.wmlscript
    wsc application/vnd.wap.wmlscriptc
    wmls text/vnd.wap.wmlscript
    wbmp image/vnd.wap.wbmp

    И, в заключение, поддериваются некоторые традиционные элементы (em, i, b, small, и т.д.) также как итаблицы со знакомым HTML синтаксисом.Перевод строки выглядит как < br / >, потому что это XML.

    Объект timer начиеает отсчет времени с загрузки платы и вызывает событие ontimer , когда выдержка по времени закончена. Это событие может использоваться, чтобы вызвать любую программу. 
    WAP : Проблемы Развития

    К сожалению, вещи не столь просты, как они, возможно, кажутся. Вы должны знать, что различные телефоны WAP имеют незначительные различия в их исполнении, которые делают функционирование WAP узла совершенно непригодным на некоторых мобильниках. Nokia 7710, например, не поддерживает метод post правильно при посылке данных на сервер, несмотря на тот факт, что он является частью спецификации. В результате, Вы будете должны использовать метод get.

    Одно ограничение, которое надо знать – это максимальный размер деки. Некоторые телефоны (вышеупомянутый 7710) не будут принимать WML деку размером больше 1.4 kb. WAP шлюз сожмет ваш WML в меньший двоичный формат, но не надо ждать чуда. Не один Nokia 7110 не отображает ни таблиц, ни многих других тэгов, используемых для разметки. Кроме того, элемент fieldset игнорируется. Это действует раздражающе, особенно если Вы потратили дни, удовлетворенно глядя на изображение на эмуляторе.

    Хотя эмулятор в Nokia Инструментарие 1.2 cookies поддержек, первое 

    Я использовал Nokia Toolkit 1.2, но можно выбрать и другие, хотя я рекомендую Вам использовали именно его. В нем есть примеры и несколько справочников, которые дадут вам возможность начать работать. 
    Позиция Microsoft

    Имеется пара интересных фактов относительно позиции Microsoft в отношении WAP. Начальный сторонник WAP (Microsoft - член WAP-Форума), Microsoft теперь выдвигает свое собственное предложение. Оно основано на том, что ширина полосы, батарея и возможности мультимедиа у карманных устройств радикально улучшатся за следующие несколько лет и это сделает Windows CE жизнеспособной OS для беспроводных приложений, а беспроводное содержание будет представлено в HTML. В такой перспективе WAP напоминает временную технологию. Однако, согласно многим источникам, это - очень длинный путь, особенно из-за проблемы батареи, а тем временем WAP будет иметь достаточно времени, чтобы развиться.
    ***
    Лучший способ заказать билеты в кино

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

    Для экономии места в программе не не включена обработка ошибок. 

    Для простоты использовалась база данных Access 97 с подключением без DSN, однако использование ADO гарантирует, что переход на другие СУБД не вызовет большого изменения кода. 

    Таблицы Movie и Theater – данные о фильмах и кинотеатрах соответственно. 

    Таблица Show определяет, сколько мест все еще доступны для каждого сеанса кинофильма, а таблица Booking содержит число заказанных мест и идентификатор записи заказа, которая создается, когда пользователь завершает бронирование. Идентификатор возвращается пользователю в конце процесса заказа, и может использоваться персоналом операционной, чтобы отыскать бронь на их PC. 
    Как это протестировать

    Для просмотра примеров необходим WAP эмулятор. Примеры были проверены главным образом с Nokia Toolkit 1.2. Если у Вас есть эмулятор, Вы можете загрузить код и воспроизвести примеры на вашем IIS. Более детальная информация относительно эмулятора доступна в предыдущей статье.

    Выбор кинофильма

    Кинофильм выбирается из списка доступных кинофильмов: 
    <!--#include file="conn.asp" 
    --><% 
    'send the right MIME type
    Response.ContentType = 
    "text/vnd.wap.wml" 
    Эмулятор не воспримет WML без правильной XML декларации. Также необходимо указать праильный MIME тип для WML. 

    >
    <!DOCTYPE wml PUBLIC 
    "-//WAPFORUM//DTD WML 1.1//EN" 
    "http://www.wapforum.org/DTD/wml_1.1.xml"> 
    <wml>
    Экран заставки отображает картинку 5 секунд перед переходом на следующую карту. Этот эффект достигнут запуском таймера, который отсчитывает 50 десятых секунды.Действие, связанное с событием ontimer – простой переход к другой карте. Я создал изображение примера посредством plug-in для Adobe PhotoShop, который Вы можете загрузить бесплатно. 
    <card id="splash" ontimer="#card1" title="Welcome to">
    <timer value="50"/>

    <p align="center">
    <br />
    <img 
    src="logo.wbmp" alt="WAP movies"/>
    </p>
    </card>

    <card id="card1" 
    title="choose a film">

    <% 
    sqlQuery = "SELECT [Movie_ID], 
    [title] FROM Movie"
    set rsMovies = 
    conn.Execute(SQLquery)

    %>
    <p>

    <select 
    name='movie'>
    <%
    Do while not 
    rsMovies.eof
    response.write("<option value='" & rsMovies("Movie_ID") 
    & "'>" & rsMovies("title") & "</option>" & 
    vbcrlf)
    rsMovies.MoveNext
    loop %>
    </select>
    Эта часть - является фокусом приложения. Элементы списка сгенерированы динамически через ASP и ADO из таблицы базы данных, содержащей доступные кинофильмы. Как ASP программиста, этот код ,вероятно, не впечатлит Вас. Что замечательно - та простота, с которой используется ASP для поддержки совершенно нового типа службы, такой как WAP. Я также прибавил бы, что преимущества, которые ASP имеет перед Java servlets в традиционном программировании сети, сохранились и в области WML. 
    <small>
    <anchor title="next!">Next
    <go 
    href="step2.asp" method="get">
    <postfield name="movie" value="$(movie)" 
    />
    </go>
    </anchor>
    </small>
    </p>

    Передача данных формы может быть достигнута или через функциональные возможности программируемой клавиши (do элемент) или через элемент anchor. 

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

    Использование WML переменных дает разработчикам возможность, которая обычно достигается при помощи JavaScript в традиционном Web-программировании. Обратите внимание на использование postfield, чтобы переслать ID кинофильма на сервер. Метод передачи данных формы заслуживает отдельного внимания: WAP спецификация включает поддержку и для метода POST. К сожалению, единственный WAP -телефон на рынке на момент написания статьи (Nokia 7110) не поддерживает его, так что у Вас нет выбора. 

    Выбор сеанса и количества билетов 

    Код, который позволяет пользователям выбирать показ, довольно прост. Производится выборка записей, которые относятся к предварительно выбранному кинофильму и выбодятся названия найденных кинотеатров: 

    movie_id = Request("movie")
    sqlQuery = "SELECT title FROM movie 
    WHERE Movie_id = " & movie_id 
    set rsMovie = 
    conn.Execute(sqlQuery)
    movie_title = rsMovie("title")
    :
    sqlQuery = 
    "SELECT [name], [time], [show_id] FROM Show, Theater " &_
    "WHERE show.movie_id = " & movie_id &_
    " AND theater.theater_id = 
    show.theater_id"

    set rsShows = conn.Execute(SQLquery)
    При ближайшем рассмотрении кода Вы захотите использовать объект ASP Session для хранения информации о кинотеатре вместо обращения всякий раз к базе данных. 

    К сожалению, объект Session использует cookies, и хотя cookies - часть спецификации (и поддержаны инструментарием), Nokia 7110 не поддерживает их. 

    Дальше появляется кое-что интересное: 
    <select 
    name='show'>
    <%
    Do while not 
    rsShows.eof
    response.write("<option value='" & rsShows("show_id") 
    & "'>" & Left(rsShows("name"),cutter) & " (" & 
    rsShows("time") & ")" & "</option>" 
    &vbcrlf)
    rsShows.MoveNext
    loop 
    %>
    </select>

    Переменная cutter определяется как
    Dim 
    cutter
    if InStr(Request.ServerVariables("HTTP_USER_AGENT"), "Nokia7110") 
    then
    cutter = 12
    else 
    cutter = 7
    end if
    Этот код устанавливает элемент option в зависимости от устройства просмотра. Эмулятор Nokia Toolkit 1.2 оставлял только несколько символов от строки. Это ставит под угрозу функциональные возможности службы. Я отрезал последнюю часть названия кинотеатра явно, потому что я хочу сохранить единой каждую строку, соответствующую элементу option.

    Как только я проверил мою программу на реальном Nokia 7110, я понял, что он имеет значительно больший экран, чем эмулятор.

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

    Следующий шаг – выбор количества билетов (я позволил выбрать до 6). Этот участок кода подобен другим. Я запрашиваю ту же самую информацию от базы данных, потому что на объект Session нельзя полагаться в реальных WAP услугах, а также выполняю некоторые проверки, чтобы удостовериться, что пользователи не запрашивают большее количество мест, чем доступно. 
    SQLquery = "SELECT * FROM show WHERE Show_id = " & 
    show_id 
    set rsShow = conn.Execute(SQLquery)
    :
    seats = 
    rsShow("free_seats")
    :

    if seats = 0 then
    Response.write("Sorry, no 
    more seats")
    rsShow.close
    set rsShow = 
    nothing
    Response.write("</p></card></wml>")
    Response.end

    else
    if 
    seats > 6 then 'book up to 6 tickets or max 
    available
    max_seats=6
    else 
    max_seats = seats
    end if
    end 
    if

    %>

    <%=movie_title%> at <% 
    =theater_name%>

    <select name='ticket'>
    <%
    dim i
    i = 
    1
    Do while i <= max_seats 
    response.write("<option value='" 
    & i & "'>" & i & " ticket(s)" & "</option>" 
    &vbcrlf)
    i = i + 1
    loop %>
    </select>
    Резервирование билетов

    Теперь я имею всю информацию, необходимую для того, чтобы сделать бронь и возвратить пользователю номер заказа: 
    tickets = 
    Request("ticket") 
    :
    free_seats = 
    rsShow("free_seats")
    :
    free_seats = free_seats - tickets
    :
    SQLUpdate 
    = "UPDATE Show " &_
    "SET Show.free_seats=" & free_seats & " " 
    &_ 
    " WHERE Show_ID=" & 
    show_id
    conn.Execute(SQLupdate)

    SQLquery = "SELECT max([Booking_ID]) 
    as bookingnumber FROM booking"
    Set rsBooking = 
    conn.execute(SQLquery)
    maxbookid = rsBooking("bookingnumber") + 
    1

    SQLinsert = "INSERT INTO Booking ( show_id, booked_seats ) " & 
    _
    "VALUES ('" & show_id & "', '" & tickets & 
    "')"
    conn.Execute(SQLinsert) %>
    You have booked <%=tickets%> 
    ticket(s) for <%=movie_title%><br />
    The show will take place at 
    <%=theater_name%> (<%=time%>)
    <br />
    Your reference 
    number is <%=maxbookid%>
    Транзакция закончена, и кинолюбители могут забрать их билеты в театре. 

    Некоторые замечания касательно процесса разработки 

    Nokia Toolkit 1.2 уже предоставил среду разработки для WML . 

    Несмотря на то, что много сил было затрачено, чтобы заставить IDE походить на приложение Windows, вы вероятно найдете ее немного странной - не очень удивительно, поскольку приложение на самом деле основано на Java. 

    Если вы начинаете разрабатывать службу WAP на пустом месте, моя рекомендация - сделайте прототип в HTML. Таким образом Вы будете иметь доступ к знакомой среде разработки. Когда приложение заработает на броузере, Вы можете адаптировать его к WAP посредством эмулятора и вашего любимого текстового редактора. Конечно, никогда не забывайте делать HTML приложение простым, пользуясь HTML элементами, которые имеют WML эквивалент. Не забудьте, что у Вас есть WML переменные как дополнительная поддержка при разработке ваших страниц. 

    ***

    В этой статье мы рассмотрим практическое приложение, созданное с использованием WML и ASP. Мы разработаем "корзину" для магазина некой компании по продаже бумаги для печатающих устройств. Предложенное приложение покажет продавцу компании состояние склада, используя его WAP-телефон, и в то же время позволит ему разместить заказ для клиента. Это приложение иллюстрирует некоторые концепции в WML и то, как WML и ASP могут использоваться вместе для создания динамических WAP-приложений. 

    Проектирование БД 

    Компания поддерживает базу данных Stock.mdb, содержащую следующие таблицы: Inventory (Опись), Orders (Заказы) и Staff (Персонал). Отношения для таблиц следующие: 


    Таблица Inventory содержит идентификатор (SKU) изделия и его запас, а также себестоимость и продажную цену. Таблица Orders используется, чтобы фиксировать заказы, сделанные продавцом компании. Таблица Staff содержит информацию входа в систему продавца. 
    Запуск приложения

    Чтобы проверить примеры приложения, описываемые в этой статье, вы можете использовать UP.SDK 4.0 Beta 1 WAP Phone Emulator. UP.SDK доступен для загрузки на сайте Phone.com. Чтобы протестировать приложение, используйте UP.SIMULATOR. 

    WAP Телефоны, поддерживающие UP.BROWSER

    В настоящее время более 20 изготовителей лицензировали UP.BROWSER для своих мобильных телефонов. Среди них Motorola, Ericsson, Nokia и Toshiba. Для получения полного списка мобильных телефонов, поддерживающих UP.BROWSER, посетите http://updev.phone.com/dev/ts/up/phones.html. ;
    Переносимость приложения

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


    Каждому продавцу от нашей гипотетической компании PaperClip присваивается StaffID и пароль для доступа к информации склада. 

    Код для входа продавца: 
    <% Response.ContentType = "text/vnd.wap.wml" %>

    <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
    "http://www.wapforum.org/DTD/wml_1.1.xml">
    <wml>

    <!-- Welcome Screen -->
    <card id="Welcome" title="Welcome">
    <p>
    Welcome to PaperClip WAP Services 
    <img alt="" localsrc="paperclip" src=""/>
    <br/>
    StaffID ? <input name="StaffID" type="text" maxlength="8" />
    Password ? <input name="Password" type="password" maxlength="8" /> 
    <do type="accept" label="Login">
    <go href="Login.asp" method="post">
    <postfield name="StaffID" value="$StaffID" />
    <postfield name="Password" value="$Password" />
    </go>
    </do> 
    </p>
    </card>

    Первая часть кода должна установить тип документа. Вы можете обратить внимание, что вышеупомянутый код содержит только WML-разметку за исключением первой строки: 
    <% Response.ContentType = "text/vnd.wap.wml" %>

    Использование свойства ASP Response.ContentType гарантирует, что тип MIME установлен правильно. 
    <% Response.ContentType = "text/vnd.wap.wml" %>

    <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
    "http://www.wapforum.org/DTD/wml_1.1.xml">

    Обратите внимание на изображение скрепки на экране входа в систему. Оно создано WML–тэгом 
    <img>.

    <img alt="" localsrc="paperclip" 
    src=""/>

    Атрибут localsrc <img> элемента определяет список изображений, доступных телефону локально. Для полного списка доступных изображений, обратитесь к WML Language Reference, стр. 37.
    Большинство элементов WML подобны HTML. Прежде, чем мы перейдем к следующему экрану, рассмотрим этот код: 
    <do type="accept" label="Login"> 
    <go href="Login.asp" method="post"> 
    <postfield name="StaffID" value="$StaffID" /> 
    <postfield name="Password" value="$Password" />
    </go>
    </do> 

    Элемент сопоставляет задачу с клавишей интерфейса пользователя телефона. Для UP.SIMULATOR: 


    После того, как продавец ввел свой StaffID и пароль, он нажимает на клавишу accept (Login), для подтверждения подлинности его идентификации. 

    Идентификация 

    Как только продавец введет StaffID и пароль, приложение перейдет к подтверждению его подлинности. 
    <template>
    <do type="options" label="Search">
    <go href="Search.asp" />
    </do>
    </template>

    <!-- Login Card -->
    <card id="Login" title="Login">
    <p>
    <%
    sqlQuery = "SELECT * FROM Staff WHERE StaffID='" 
    Request.Form("StaffID") & "' AND Password='" 
    Request.Form("Password") & "'"
    set rs = conn.Execute(SQLquery)

    if rs.EOF then
    Response.Write "Invalid Login"
    Response.Write "<do type='accept' label='Retry'>"
    Response.Write " <go href='index.asp'/>"
    Response.Write "</do>"
    '---override the <template> element
    Response.Write "<do type='options' label=''>"
    Response.Write " <go href=''/>"
    Response.Write "</do>"
    else
    Session("StaffID") = Request.Form("StaffID") 
    Session("Password") = Request.Form("Password")
    Response.Write "<strong>Welcome, " &
      rs.Fields("Name") & "! </strong><br/>"
    sqlQuery = "SELECT * FROM Inventory"
    Set rs = conn.Execute(SQLquery)
    %>


    Если продавец не прошел идентификацию, появляется экран, показанный здесь. Заметьте, что, когда пользователь не сумел войти, элемент <template>: 
    <template>
    <do type="options" label="Search">
    <go href="Search.asp" />
    </do>
    </template>
    заменяется на:
    '---override the <template> element
    Response.Write "<do type='options' label=''>"
    Response.Write " <go href=''/>"
    Response.Write "</do>"

    Это гарантирует, что функция поиска недоступна неидентифицированному пользователю. Как только пользователь прошел регистрацию, его StaffID и пароль сохраняются в объекте session. 

    Относительно поддержки Cookies 

    В этом приложении был использован объект Session в ASP. Поскольку объект Session требует поддержки cookies на стороне клиента, предположим, что платформа, которая используется, чтобы выполнить это приложение, поддерживает cookies. В частности, при разработке приложений, которые будут развернуты в реальном мире, гарантируйте, что Ваш WAP шлюз использует поддержку cookies. UP.SIMULATOR поддерживает cookies, и, таким образом, мы можем использовать их для создания двух переменных сессии: 
    Session("StaffID") = Request.Form("StaffID")
    Session("Password") = Request.Form("Password")

    Эти две переменные сессии могут использоваться повсюду в приложении для идентификации пользователя, который его запустит. Если платформа не поддерживает cookies, то StaffID и пароль должны передаваться от входной формы до их повторного использования при помощи методов get или post (элементы <go> и <postfield >). 
    Получение списка описи


    Как только пользователь идентифицирован, сценарий ASP начнет генерировать список доступных изделий. Для простоты изложения ограничим число предметов в списке десятью предметами. 
    <anchor>
    View Cart 
    <go href="cart.asp" />
    </anchor>
    <br/>Stock List:
    <select name="stockID">
    <% 
    while not rs.EOF 
    %> 
    <option value="<% =rs("SKU") %>">
    <% =rs("SKU") %>-<% =rs("Name") %>(<% =rs("OnHand") %>)
    $$<% =rs("CostPrice") %> - $$<% =rs("SellPrice") %>
    </option>
    <%
    rs.MoveNext 
    Wend
    %>
    </select>
    <do type="accept" label="Order">
    <go href="cart.asp" method="get">
    <postfield name="SKU" value="$stockID" />
    </go> 
    </do>

    Мы будем использовать элемент <anchor> для создания гиперсвязи просмотра содержания корзины покупок. Что касается списка предметов, доступных в таблице описи, будем использовать элементы <select> и <option>.  

    В этом примере информация о товаре выводится в одну строку. На UP.SIMULATOR длинные строки переводятся на следующую строку. Однако внимательный читатель может заметить, что различные WAP - броузеры имеют различную обработку длинных строк и могут просто обрезать все избыточные символы, которые не помещаются на той же самой строке. Поэтому с самого начала рассмотрите платформу, на которой будет выполняться ваше приложение. 

    Ввод для функций «Заказ» и «Поиск» соответственно: 
    >do type="accept" label="Order"<
    >go href="cart.asp" method="get"<
    >postfield name="SKU" value="$stockID" /<
    >/go< 
    >/do<
    >template<
    >do type="options" label="Search"<
    >go href="Search.asp" /<
    >/do<
    >/template<

    Обратите внимание, что здесь был использован элемент < template >, чтобы отделить параметр «Поиск». Элемент template определяет связи на уровне деки и относится ко всем платам в деке.
    Если пользователь щелкает на клавише Up, «фокус» переходит на ссылку View Cart.
    Формат отображенного товара - SKU-Название- (Количество -Себестоимость-Цена Продажи). 


    Клавиша accept теперь изменена на Link. Щелчок по клавише accept покажет содержимое корзины.

    Добавление товара а корзину

    Для добавления товара в корзину просто выберем элемент и нажмем на клавишу accept. 


    При добавлении товара отображается содержание корзины. Изображенный ниже код добавляет товар в корзину: 
    sqlQuery = "INSERT INTO Orders (StaffID, SKU, Qty, OrderDate) "
    sqlQuery = sqlQuery + "Values ('" & Session("StaffID") & "','" & " 
    sqlQuery = sqlQuery + "Request.QueryString("SKU") & "',1,'" & date & "')"" 
    On Error Resume Next '---prevent duplicate items from crashing my program--- 
    set rs = conn.Execute(sqlQuery) 
    rs.Close 'Displaying the Cart Content

    Следующий код показывает содержание корзины: 
    '---Displays the cart content---
    Response.Write "<br/><strong>Cart Contents</strong>"
    sqlQuery = "SELECT * FROM Orders INNER JOIN Inventory ON 
    Orders.SKU=Inventory.SKU WHERE StaffID='" & 
    Session("StaffID") & "'"
    set rs = conn.Execute(sqlQuery)
    if not rs.EOF then
    Response.Write "<select name='CartItem'>"
    While not rs.EOF 
    Response.Write "<option value='" & rs("SKU") & "'>" & rs("SKU") & _
    "-" & rs("Name") & "(" & rs("qty") & ")</option>" 
    rs.MoveNext
    Wend
    Response.Write "</select>"
    rs.Close
    %>
    <do type="option" label="Qty">
    <go href="EditCart.asp" method="get"> 
    <postfield name="SKU" value="$CartItem" />
    </go>
    </do>
    <%
    else
    %>
    <br/>Cart is empty!
    <do type="accept" label="Main">
    <go href="login.asp" method="post"> 
    <postfield name="StaffID" value="<% =Session("StaffID") %>" />
    <postfield name="Password" value="<% =Session("Password") %>" />
    </go>
    </do>
    <%
    end if
    %>

    Заметьте, что, если тележка пуста, клавиша ACCEPT будет отображена как Main и возвратит пользователя к основной экранной странице. 


    В корзине две ссылки [Главная] и [Поиск], и два параметра: Delete и Qty (чтобы изменить количество товара). Чтобы удалить товар, щелкните на клавише ACCEPT (Delete). 
    <template>
    <do type="accept" label="Delete">
    <go href="Cart.asp" method="get">
    <postfield name="delete" value="$CartItem" />
    </go>
    </do>
    </template>

    Чтобы изменить количество товар, щелкните на клавише option (Qty). 
    <do type="option" label="Qty">
    <go href="EditCart.asp" method="get"> 
    <postfield name="SKU" value="$CartItem" />
    </go>
    </do>
    Изменение количества товара в корзине

    Когда пользователь нажимает на клавишу option (Qty), исполняется файл EditCart.asp. 
    <card id="GetQty" title="Get Qty"> 
    <p>
    Qty? <input name="Qty" type="text" maxlength="3" />
    <do type="accept" label="Set">
    <go href="EditCart.asp" method="get">
    <postfield name="SKU" value="<% =Request.QueryString("SKU")%>" />
    <postfield name="qty" value="$Qty" />
    </go>
    </do>
    </p>
    </card>


    Чтобы изменить количество, введите число и нажмите на клавишу accept ( Set ).  
    sqlQuery = "UPDATE Orders SET Qty=" & 
    Request.QueryString("qty") & _ 
    " WHERE StaffID='" & 
    Session("StaffID") & "' AND SKU='" & _
    Request.QueryString("SKU") 
    & "'" 
    set rs = conn.Execute(sqlQuery) 
    'response.write 
    sqlquery 
    '---display the content of the 
    cart--- 
    Response.Redirect "cart.asp" 


    После изменения количества WAP – броузер перенаправит на cart.asp, где отобразится обновленное содержание корзины. 
    Удаление товара из корзины


    Для этого нажмите на кнопку accept (Delete). 
    '---check to see if this is a deletion?---
    ItemToDelete = Request.QueryString("delete")
    if ItemToDelete<>"" then 
    '---delete an item---
    sqlQuery = "DELETE FROM Orders WHERE StaffID='" & Session("StaffID")" 
    sqlQuery = sqlQuery + " & "' AND SKU='" & ItemToDelete & "'"" 
    set rs = conn.Execute(sqlQuery)
    'rs.Close
    Поиск товара

    Поиск можно производить из основной страницы и со страницы корзины 


    Для поиска введите SKU товара и нажмите на кнопку accept (Locate). 

    sqlQuery = "SELECT * FROM Inventory WHERE SKU LIKE '%" & SearchStr & "%'"
    Set rs = conn.Execute(SQLquery)
    Выведем результаты поиска 
    Response.Write "<select name='stockID'>"
    While not rs.EOF
    Response.Write "<option value='" & rs("SKU") & "'>" & rs("SKU") & "-" _ 
    & rs("Name") & "(" & rs("OnHand") & ") $$" & rs("CostPrice") & "-$$" _ 
    & rs("SellPrice") & "</option>"
    rs.MoveNext
    Wend
    Response.Write "</select>"


    Со страницы поиска можно заказать товар или перейти на главную страницу 
    Отладка WAP-программы

    Немногие симуляторы позволяют удобно работать с отлаживаемым WAP-приложением. Однако, в UP.Simulator во все время работы открыто окно Phone Information Window. 


    Окно Phone Information представляет полезную информацию для WAP разработчика. В нем отображены все HTTP запросы и WML страницы, которые вы загружаете с сервера. Наиболее полезная особенность - способность показать неправильно созданную WML страницу. Пример ниже: 
    <% Response.ContentType = "text/vnd.wap.wml" %>

    <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
    "http://www.wapforum.org/DTD/wml_1.1.xml">
    <wml>

    <!-- Welcome Screen -->
    <card id="Welcome" title="Welcome">
    <p>
    Welcome to PaperClip WAP Services <img alt="" localsrc="paperclip"
    src=""/>
    <br>
    StaffID ? <input name="StaffID" type="text" maxlength="8" />
    Password ? <input name="Password" type="password" maxlength="8" /> 
    <do type="accept" label="Login">
    <go href="Login.asp" method="post">
    <postfield name="StaffID" value="$StaffID" />
    <postfield name="Password" value="$Password" />
    </go>
    </do>
    </p>
    </card>

    Обычная ошибка - пропущено "/" после <br>. 


    В окне Phone Information мы получим 
    ======================= WML Errors =====================
    WML translation failed.
    (10) : error: Expected tag end(>) instead of <newline>
    (10) : error: Expected </ instead of TEXT ''
    (10) : error: Invalid element 'PCDATA' in content of 'br'. Expected closing tag
    (10) : error: Invalid element 'input' in content of 'br'. Expected closing tag
    (11) : error: Invalid element 'PCDATA' in content of 'br'. Expected closing tag
    (11) : error: Invalid element 'input' in content of 'br'. Expected closing tag
    (12) : error: Invalid element 'do' in content of 'br'. Expected closing tag
    (18) : error: Close tag 'p' does not match start tag 'br'
    (19) : error: Close tag 'card' does not match start tag 'p'
    (29) : error: Close tag 'wml' does not match start tag 'card'
    (29) : error: Expected the end of root element instead of end of file

    ======================= End Errors =====================
    ************************ Current WML ******************************************


    <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
    "http://www.wapforum.org/DTD
    /wml_1.1.xml">
    <wml>

    <!-- Welcome Screen -->
    <card id="Welcome" title="Welcome">
    <p>
    Welcome to PaperClip WAP Services <img alt="" localsrc="paperclip" src=""/

    <br>
    StaffID ? <input name="StaffID" type="text" maxlength="8">
    Password ? <input name="Password" type="password" maxlength="8">

    <do type="accept" label="Login">
    <go href="Login.asp" method="post">
    <postfield name="StaffID" value="$StaffID">
    <postfield name="Password" value="$Password">
    </go>
    </do>
    </p>
    </card>
    </wml>
    Заключение

    В этой статье Вы увидели, как типичное приложение E-коммерции может быть адаптировано для WAP устройств. Очевидно , что размер экрана накладывает серьезные ограничения на разрабатываемые приложения. Однако есть и хорошие новости. Навыки программирования HTML и ASP существенно помогают при создании приложений WAP. Очевидно, в ближайшие месяцы компании будут писать две различные версии приложений для Интернет: одну для Web, а другую для WAP. Другая проблема – совместимость броузеров для WAP.Это напоминает создание страниц под Microsoft Internet Explorer и Netscape Navigator.  

    Категория: PHP, Perl, ASP | Добавил: Admin | Дата: 06.09.2009 | Просмотры: 1434 | Рейтинг:
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Вход на сайт
    Гость, добро пожаловать на best-club! Тапки в углу, пиво в холодильнике. Располагайся:) Для получения большего комфорта войди как пользователь или зарегистрируйся.



    Обмен музыкой [?]
    Открыть в новом окне

    Партнёры





    Опрос

    Какой поисковик чаще используете?
    Всего ответов: 40

     
    Best-club team © 2008 - 2024

    SiteMap Партнёры и друзья Поддержать проект
    Третий Мир: Война Королей - Форум
    Администрация сайта не несёт ответственности за материалы опубликованные на сайте! Все материалы исключительно для ознакомления!
    Мини профиль