第一節(jié):wap的潛能
這些日子,我們常聽到wap技術(shù),一種手機(jī)上網(wǎng)的技術(shù)。從技術(shù)上講,移動電話不可能和pc來競爭,移動電話的屏幕只能容下很少的字符,它的帶寬也是很受限制,而且輸入也很笨拙。那我為什么還要 介紹它了,嘿嘿,這里有兩個主要的我認(rèn)為wap一定有成功的因素。
隨處性:
只要你有手機(jī),你到哪里都可以訪問wap網(wǎng)站。
帳單機(jī)構(gòu):
在不久的將來,我們就能通過我們的手機(jī)來支付我們的一切費(fèi)用,查詢很多的信息。只是我們的手機(jī)費(fèi)用中又多了一項費(fèi)用"wap服務(wù)費(fèi)"。
這樣我們就能用手機(jī)支付我們的商品費(fèi)用,信用卡都不用了,它一定能夠成為新消費(fèi)方式。
第二節(jié):wap基礎(chǔ)
wap (wireless application protocol) v1.1是一種開放性規(guī)范,它試圖規(guī)范移動電話訪問信息和服務(wù)行業(yè)。這個規(guī)范是由wap forum來開發(fā)的,一個民間組織。1.2版本的wap協(xié)議將會被認(rèn)為是最后的wap規(guī)范。
關(guān)于wap最基本的概念就是重復(fù)利用internet協(xié)議,這個協(xié)議必須很清楚地在現(xiàn)有的技術(shù)上輕松地調(diào)用wap服務(wù)。
wap協(xié)議利用一種很像我們電腦網(wǎng)絡(luò)的分層結(jié)構(gòu)。較低層次不太像我們常用的web應(yīng)用,但是頂層還是我們的老朋友----http。數(shù)據(jù)一樣是從服務(wù)器上發(fā)出,從服務(wù)器上接收,信息能夠儲存在服務(wù)器上,調(diào)用也可能用cgi,也可以用其它的方法,比如asp.也就是說只要你會asp,那么你就可以在輕松地寫出你的第一個wap應(yīng)用程序了。
當(dāng)然,就手機(jī)的帶寬和用戶能力方面來看,手機(jī)需要不同(更嚴(yán)格)的設(shè)備,所以在目前的條件下html就不能適應(yīng)wap所能提供的帶寬。
wap forum 的定位是wml (wireless mark-up language),一種xml格式的語言。wml是精簡的html。
wap forum同時也指定了wmlscript,很像javascript,只是用于手機(jī)而已,它能夠處理客戶端的程序。
第三節(jié):wml
盡管我已經(jīng)講解了手機(jī)與服務(wù)器的通訊,但是真正的客戶端不是手機(jī)。一個軟件(wap gateway)實(shí)際上允當(dāng)了這個角色。它將手機(jī)的請求轉(zhuǎn)換為http請求,同時也將服務(wù)器的回應(yīng)返回給手機(jī),wml文件此時就被wap gateway編譯成二進(jìn)制文件。盡管有些wap geteway能夠?qū)tml直接轉(zhuǎn)換為wml,但是也不要指望它們能任意地將html轉(zhuǎn)換為我們在手機(jī)上能看懂的東東。
當(dāng)然,仿真器就不需要wap gateway來工作了,它會直接從服務(wù)器下載wml文件(或者直接在本地機(jī)上打開wml),同時將它顯示在手機(jī)的屏幕上。
[align=center][/align]
wap 仿真器
為了使用wap服務(wù),像吾等窮人買不起手機(jī),就需要一個wap 仿真器。你可以去nokia website下載一個 nokia toolkit 1.2,同時你也得裝上java virtual machine 1.2.2,可以免費(fèi)從sun公司下載,這里是個例子。
[align=center][/align]
[align=center]wml 結(jié)構(gòu)
一個wml文檔是由板塊組成的,一個板塊包含有許多的卡片。在實(shí)際中,你可以把一個板塊看成一個由許多有名字的標(biāo)簽組成的html。
手機(jī)下載一個完整的板塊,但是在一次只能顯示一個卡片。通過鏈接瀏覽不同的地方。
我們將會看到一個簡單的wml文檔,你得懂點(diǎn)最基本的xml。
< ?xml version="1.0"? >
< !doctype wml public "-//wapforum//dtd wml 1.1//en" "http://wapforum.org/dtd/wml_1.1.xml" >
< wml >
< !-- root element -- >
< 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 >
一旦手機(jī)接收了這個塊,它就會顯示第一個卡片,當(dāng)你按下左邊的軟鍵時,就會看到第二個卡片。[/align]
[align=center] [/align]
[align=center][/align]
[align=center][/align]
wml基本的語言
"p" element
作用與html一樣,只是如果你想顯示文字這個就是必須的。
"do" element
實(shí)際上每個wap應(yīng)用必須支持導(dǎo)航條。do標(biāo)簽最主要的type屬性的值就是accept,這個意味著當(dāng)你按下軟鍵一個新的選項會被加到列表中來。label屬性指定顯示的文字。另外是一些選項:
go - 導(dǎo)航到另外一個卡片或板塊中去。他需要href 屬性。
prev - 導(dǎo)航到上一個卡片中去
refresh - 刷新顯示。
noop - 無
anchor
作用和html中的一樣的。在wml中anchor鏈接的作用和do差不多,唯一的不同就是anchor不以選項的形式顯示。
< anchor >
go to card 2
< go href="#card2"/ >
< /anchor >
變量 wml結(jié)合變量的辦法有一點(diǎn)不同于html和javascript。wml的變量不僅可以被wmlscript來調(diào)用,還可以通過card直接用于wml文檔。換句話說就是變量不僅可以由用戶直接輸入,同時也可以由setvar元素來設(shè)置。當(dāng)然變量能夠被腳本來操作,但這個不是必須的!這個觀點(diǎn)必須被更進(jìn)一步的強(qiáng)調(diào)和闡明。例如,你可能需要一個card來獲得用戶的名字,下一個card就顯示"hello,飛刀",我們就可以這樣"hello,$(firstname)",有點(diǎn)像php,是不是,這個在傳統(tǒng)的html中是不可能辦到的!
既然變量的值能夠在各個card之間保存,那么它們就經(jīng)常被用于保存狀態(tài)信息,支持一些復(fù)雜的交互式wap服務(wù)。這種方法的一個問題就是當(dāng)整個deck不得不重新引用時,這些狀態(tài)可能與用戶的瀏覽不能保持同步。所以,一些事件和屬性就被用來捕獲這些事件(onenterofrward 和 onenterbackward).刷新則根據(jù)一些變量的值被用做更新card.
用戶輸入
當(dāng)然,為了使你的頁面變得更加的強(qiáng)大,變量就需要儲存(接收)用戶的標(biāo)準(zhǔn)輸入。這一切通過一些類似于html的元素來完成.
input - 很像html,用戶通過手機(jī)的鍵盤來輸入。你能夠想像,這種輸入就不像我們使用pc上的鍵盤一樣實(shí)用,所以我們應(yīng)當(dāng)盡量簡化這種輸入方式,有可能盡量使用select元素來供用戶選擇。name屬性是這個變量的名字,缺省值和大小的屬性顯然也是必須的。format為輸入入口指定了一個輸入面具。其它的請查看其它資料,在這我就不一一講述了!
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事件發(fā)生于一個選項被選擇/被取消時.
postfield - 很像html中的hidden屬性,它將不顯示在屏幕中。它能同時將name與value傳送給服務(wù)器.
fieldset - 包含一大堆的信息強(qiáng)迫手機(jī)在一個屏幕中顯示,當(dāng)然這得看手機(jī)的能力了
其它的元素
img元素也同樣被支持,但是你得使用一種特殊的圖片格式,名叫wbmp.因為wap手機(jī)擁有有限的內(nèi)存和儲存空間。這種新的格式能夠讓wap設(shè)備快速的理解和生成圖片。wireless bitmaps的生成,可以通過下載一個photoshop和paint shop pro的插件就可以搞定了。最后大家要記住在你的服務(wù)器上設(shè)置正確的mime類型,下面我列出了所有與wap有關(guān)的mime:
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
一些傳統(tǒng)的強(qiáng)調(diào)元素也被支持,比如:em,i,b,small,strong等等,用法也和html一樣。br也同樣被支持,不過寫法有點(diǎn)不同,畢竟是xml嘛,要寫成這樣
最后我們來看看time對象和ontimer事件,time對象保存著至card被調(diào)用至今的時間,如果我們定了ontimer事件,那么ontimer事件就會被激發(fā).
還有很多我也懶得寫了,希望對你們建設(shè)wml網(wǎng)頁沒有什么影響.
wap 的開發(fā)問題
很不幸的是,事情并不是我們想像的那么簡單,不同的wap手機(jī)總是有一些小的不同的地方,就像m$的javascript與ns的不同一樣。例如,nokia 7710這樣第一部在挪威出售的wap手機(jī),就不能正確的支持post方法。
另一個限制就是deck的大小的問題。有些手機(jī)(nokia 7110)就是不支持超過1.4k的wml文檔,wap網(wǎng)關(guān)能夠?qū)⒛愕膚ml文檔壓縮成更小的二進(jìn)制格式,但是你也不要希望奇跡出現(xiàn)。這時不僅是nokia 7110支持的東東不能顯示,一些強(qiáng)調(diào)標(biāo)幟也被忽略了,另外fieldset標(biāo)幟也很輕松地被它忽略了,是不是很煩?。亢俸?,當(dāng)你在仿真器上做出很cool的頁面,然后再到手機(jī)上一看,嘿嘿,砸了手機(jī)是你的第一選擇.
雖然nokia toolkit 1.2仿真器上支持cookies,但是第一批wap手機(jī)就是不支持,這就意味著你將和你的asp中的session,說再見,至少也是很長的一段時間
下一節(jié),我們將真正做一個wml與asp相結(jié)合的網(wǎng)站.
第四節(jié):另一種預(yù)訂你電影票的方法
在上一節(jié)中,我講解了最基本的wap和wml的概念,這一節(jié)我們就來看看asp和wap是如何結(jié)合的.
現(xiàn)在在奧斯陸,電影院提供了一種基于電話系統(tǒng)的來銷售門票,這個系統(tǒng)是很復(fù)雜的,還必須給用戶一些說明才能指導(dǎo)用戶買票,而且用戶還必須在報紙上找到某種電影的代碼,這個很煩,我們來介紹另一種方法。
這里這將給你展示一個簡單的讓手機(jī)用戶訂票的wap應(yīng)用:一個肯定讓人叫好的服務(wù)。用戶不必記住那些煩人的代碼,他們能夠直接從菜單中選取電影和電影院,并且用戶也不需要認(rèn)證。在這個例子中用戶被要求在電影開始前40分鐘交費(fèi),但是在真正的生活中,用戶同樣可以通過手機(jī)來結(jié)帳.
此應(yīng)用程序想像的條件是一個電影能夠在同一時間在多個電影院上映,一個電影院不同的時間上演不同的電影。
這里我沒有過多的考慮錯誤處理的問題,因為這不是本章節(jié)的重點(diǎn),你喜歡你可以自己加上.
為了簡單,我使用了access 97來做為數(shù)據(jù)庫,當(dāng)然真正的系統(tǒng)不會用它了,其它的數(shù)據(jù)庫如sql server,也不必改動多少代碼.
數(shù)據(jù)庫圖表
[align=center][/align]
數(shù)據(jù)庫圖表
.movie 和theater表是顯然需要的。show表用于追蹤現(xiàn)在還有多少空位可以出售。
怎樣調(diào)試這個程序
為了訪問這個wap服務(wù),你需要一個wap仿真器,這個程序主要是在nokia toolkit 1.2上調(diào)試,詳細(xì)情況請查看上一章節(jié)。
選擇電影
在list表中選擇一個電影:
[align=center][/align]
[align=left]這里是代碼:
< !--#include file="conn.asp" -- >< % 'send the right mime type
response.contenttype = "text/vnd.wap.wml"
第一件事就是聲明wml,仿真器如何不在正確的地方聲明xml,它是不會接受wml的盡管nokia 7110可以忽略這一點(diǎn),但是不能保證其它的手機(jī)也行,所以你不得不做這事。同樣你也得設(shè)置好mime類型。
< ?xml version="1.0"? >
< !doctype wml public "-//wapforum//dtd wml 1.1//en" "http://wapforum.org/dtd/wml_1.1.xml" >
< wml >
在進(jìn)入下一個card以前會有一個閃爍的屏幕來顯示一個圖片wbmp一種新的格式。這個事件是由timer屬性決定的,這里我們設(shè)置的時間為5秒.ontimer事件引發(fā)后將帶你去另一個card.(wmbp的photoshop插件可以從網(wǎng)上免費(fèi)下載).
< 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 >
這一部分是本文的焦點(diǎn)。從數(shù)據(jù)庫中讀出需要的數(shù)據(jù)顯示出來,作為一個asp程序員,這個沒有什么特別的,但是就是這個簡單的程序現(xiàn)在被用于一種全新的服務(wù)器就顯得不一樣了。這也使得我更加認(rèn)為在基于wml的商業(yè)站的網(wǎng)絡(luò)編程asp更勝于java servlet.
< small > < anchor title="next!" >next
< go href="step2.asp" method="get" >
< postfield name="movie" value="$(movie)" / >
< /go >
< /anchor >
< /small >
< /p >
表單的提交也可以通過軟開關(guān)函數(shù)(do 和 anchor)來完成。在這里,我是通過簡單的內(nèi)嵌鏈接來完成的,因為我覺得這樣能夠使用戶感覺直觀和友好。postfields大至和html中的hidden差不多,但是wml的變量不像html中的那樣需要在javascript中傳送,它可以直接寫在wml中,這一點(diǎn)上一節(jié)已經(jīng)講解了.在這里的傳遞的方法是get,post方法在wap的規(guī)范也是被支持的,仿真器也能識別它,但是很不幸,在nokia 7110中,這個post不被支持,所以你沒得選擇.[/align]
該文章在 2010/7/22 22:55:28 編輯過