用ASP技術進行動態WAP網站開發實例
第一節:WAP的潛能這些日子,我們常聽到WAP技術,一種手機上網的技術。從技術上講,移動電話不可能和PC來競爭,移動電話的屏幕隻能容下很少的字符,它的帶寬也是很受限製,而且輸入也很笨拙。那我為什麼還要 介紹它了,嘿嘿,這裏有兩個主要的我認為WAP一定有成功的因素。
隨處性:
隻要你有手機,你到哪裏都可以訪問wap網站。
帳單機構:
在不久的將來,我們就能通過我們的手機來支付我們的一切費用,查詢很多的信息。隻是我們的手機費用中又多了一項費用"WAP服務費"。
這樣我們就能用手機支付我們的商品費用,信用卡都不用了,它一定能夠成為新消費方式。
第二節:WAP基礎
WAP (Wireless Application Protocol) v1.1是一種開放性規範,它試圖規範移動電話訪問信息和服務行業。這個規範是由
WAP Forum來開發的,一個民間組織。1.2版本的WAP協議將會被認為是最後的WAP規範。
關於wap最基本的概念就是重複利用internet協議,這個協議必須很清楚地在現有的技術上輕鬆地調用wap服務。
WAP協議利用一種很像我們電腦網絡的分層結構。較低層次不太像我們常用的web應用,但是頂層還是我們的老朋友----HTTP。
數據一樣是從服務器上發出,從服務器上接收,信息能夠儲存在服務器上,調用也可能用CGI,也可以用其它的方法,比如ASP.也就
是說隻要你會ASP,那麼你就可以在輕鬆地寫出你的第一個WAP應用程序了。
當然,就手機的帶寬和用戶能力方麵來看,手機需要不同(更嚴格)的設備,所以在目前的條件下HTML就不能適應WAP所能提
供的帶寬。
WAP Forum 的定位是WML (Wireless Mark-up Language),一種xml格式的語言。WML是精簡的HTML。
WAP Forum同時也指定了WMLScript,很像JavaScript,隻是用於手機而已,它能夠處理客戶端的程序。
第三節:WML
盡管我已經講解了手機與服務器的通訊,但是真正的客戶端不是手機。一個軟件(wap gateway),實際上允當了這個角色。它
將手機的請求轉換為HTTP請求,同時也將服務器的回應返回給手機,WML文件此時就被WAP GateWay編譯成二進製文件。盡管有些
WAP geteway能夠將HTML直接轉換為WML,但是也不要指望它們能任意地將HTML轉換為我們在手機上能看懂的東東。
當然,仿真器就不需要WAP gateway來工作了,它會直接從服務器下載WML文件(或者直接在本地機上打開WML),同時將它顯示
在手機的屏幕上。圖一WAP 結構
WAP 仿真器
為了使用WAP服務,像吾等窮人買不起手機,就需要一個wap 仿真器。你可以去Nokia website下載一個 Nokia Toolkit
1.2,同時你也得裝上Java Virtual Machine 1.2.2,可以免費從SUN公司下載,這裏是個例子。
WML 結構
一個WML文檔是由板塊組成的,一個板塊包含有許多的卡片。在實際中,你可以把一個板塊看成一個由許多有名字的標簽組成的
HTML。
手機下載一個完整的板塊,但是在一次隻能顯示一個卡片。通過鏈接瀏覽不同的地方。
我們將會看到一個簡單的WML文檔,你得懂點最基本的XML。
<?xml version="1.0"?> <!DOCTYPE WML PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "https://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <!-- root element --> <card 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 title="Example 1"> <p> This is the second card. </p> </card> </wml> |
一旦手機接收了這個塊,它就會顯示第一個卡片,當你按下左邊的軟鍵時,就會看到第二個卡片。
第四節:另一種預訂你電影票的方法
在上一節中,我講解了最基本的WAP和WML的概念,這一節我們就來看看ASP和WAP是如何結合的.
現在在奧斯陸,電影院提供了一種基於電話係統的來銷售門票,這個係統是很複雜的,還必須給用戶一些說明才能指導用戶買票,而且用戶還必須在報紙上找到某種電影的代碼,這個很煩,我們來介紹另一種方法。
這裏這將給你展示一個簡單的讓手機用戶訂票的WAP應用:一個肯定讓人叫好的服務。用戶不必記住那些煩人的代碼,他們能夠直接從菜單中選取電影和電影院,並且用戶也不需要認證。在這個例子中用戶被要求在電影開始前40分鍾交費,但是在真正的生活中,用戶同樣可以通過手機來結帳.
此應用程序想像的條件是一個電影能夠在同一時間在多個電影院上映,一個電影院不同的時間上演不同的電影。
這裏我沒有過多的考慮錯誤處理的問題,因為這不是本章節的重點,你喜歡你可以自己加上.
為了簡單,我使用了Access 97來做為數據庫,當然真正的係統不會用它了,其它的數據庫如SQL Server,也不必改動多少代碼.
數據庫圖表

數據庫圖表
.Movie 和Theater表是顯然需要的。Show表用於追蹤現在還有多少空位可以出售。
怎樣調試這個程序
為了訪問這個WAP服務,你需要一個WAP仿真器,這個程序主要是在Nokia Toolkit 1.2上調試,詳細情況請查看上一章節。
選擇電影
在list表中選擇一個電影:

這裏是代碼:
< !--#include file=/"conn.asp/" -- >< % 'send the right MIME type Response.ContentType = /"text/vnd.wap.wml/" 第一件事就是聲明wml,仿真器如何不在正確的地方聲明XML,它是不會接受WML的盡管Nokia 7110可以忽略這一點,但是不能保證其它的手機也行,所以你不得不做這事。同樣你也得設置好MIME類型。 < ?xml version=/"1.0/"? > < !DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/" /"https://www.wapforum.org/DTD/wml_1.1.xml/" > < wml > 在進入下一個card以前會有一個閃爍的屏幕來顯示一個圖片WBMP一種新的格式。這個事件是由timer屬性決定的,這裏我們設置的時間為5秒.ontimer事件引發後將帶你去另一個card.(wmbp的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)來完成。在這裏,我是通過簡單的內嵌鏈接來完成的,因為我覺得這樣能夠使用戶感覺直觀和友好。Postfields大至和HTML中的hidden差不多,但是wml的變量不像html中的那樣需要在javascript中傳送,它可以直接寫在wml中,這一點上一節已經講解了.在這裏的傳遞的方法是get,post方法在WAP的規範也是被支持的,仿真器也能識別它,但是很不幸,在Nokia 7110中,這個post不被支持,所以你沒得選擇.
選擇電影院和上映時間
這部分代碼讓用戶來選擇看什麼時間的電影,所有的記錄根據前一頁所選的電影來決定。在這裏來選擇電影院和上映時間.
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) |
如果你仔細研究了這個代碼,你就會想用Session來保存電影信息,再在這頁進行查詢更簡單。同樣很不幸,Session是需要cookies的支持,雖說在WAP規範中也是被支持的,但是在Nokia 7110中也是不被支持,這就是說現在我們還不能把session用在WAP服務中。
下麵有一些有趣的事情:
< 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 Toolit 1.2仿真器喜歡把砍掉我的的選項到隻有幾個字符,而我們要顯示電影名字和上映時間,所以我們就不得不減少電影名字的字符。在真的手機中不會出現這種問題,所以我們就必須先判斷設備的類型.
一旦我有機會(飛刀我很窮,沒有錢,這是僅僅是遙遠的夢想.......)在真的Nokia 7110上測試我的代碼,我們會立即感到我們有比我們想像更大的屏幕。實際上,有些電影院的名字很古怪,而且這些長名字會占用很大屏幕空間,我們沒有必要浪費這些顯示空間,盡量把這些名字簡化。
下一步就是讓用戶選擇需要的票數.這部分的代碼很像其它的部分。我將從數據庫中查詢相同的數據,因為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% > |
下麵是顯示:
Figure 4:完成交易.
交易已經完成了,電影院可以坐著電影院門口收錢了.
結論
WAP現在才剛剛走出它的第一步,然而它是最近幾年內最有革命性的IT發展之一。在這篇文章中我介紹了怎樣用asp寫WAP應用程序,並對你們提出了一些警告,希望對你們以後的發展有用。多媒體技術依然不能太多的用於WAP,但是它的可移動性卻是重要的,也為商家提供了不少的商機。
最後更新:2017-04-02 00:06:41