WAP и ASP - Часть II
 

Лучший способ заказать билеты в кино

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

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

Рис 1. Схема базы даных.

Схема базы даных

Таблицы 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.

Рис.2

<?xml version="1.0"?> <!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="pix/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) не поддерживает его, так что у Вас нет выбора.

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

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

Рис.3: Выбор сеанса

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%>

Это - то, что они будут видеть:

Рис.4.Завершение транзакции.

Транзакция закончена, и кинолюбители могут забрать их билеты в театре.

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

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

Заключение

WAP технология все еще делает первые шаги, однако она обещает быть одной из наиболее революционных IT новаций последних лет. В этой статье я объяснил, как использовать ASP, чтобы производить услуги для телефонов WAP. Я смоделировал примерное приложение и предупредил Вас относительно возможных проблем и ловушек, с которыми Вы столкнетесь, если будете формировать службу WAP в ближайшем будущем. Даже при том, что возможности мультимедиа Internet далеки от имеющихся на портативном компьютере, явное преимущество WAP - встроенный опознавательный механизм мобильных телефонов, который открывает новые горизонты для E-коммерции.

WAP и ASP - Часть I
WAP и ASP - Часть II
WAP и ASP - Часть III

 
Автор: Luca Passani
 
Оригинал статьи: http://www.woweb.ru/publ/60-1-0-209