Лучший способ заказать билеты в кино
Я собираюсь показать Вам простое 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>
<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")set rsShows = conn.Execute(SQLquery)
При ближайшем рассмотрении кода Вы захотите использовать объект ASP Session для хранения информации о кинотеатре вместо обращения всякий раз к базе данных.Дальше появляется кое-что интересное:
<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
Как только я проверил мою программу на реальном 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-коммерции.