前言
移動通信和互聯網的迅速發展,使得互聯網從固定向移動轉移(即移動互聯網)成為一種必然的趨勢。由于手機終端本身的限制條件和無線鏈路的特點,現有無線傳送技術的效率和可靠性會越來越難以令用戶滿意。如何讓手機上網是WAP協議所要解決的問題。
一、認識WAP協議
無線應用協議WAP(Wireless Application Protocol)也稱為無線應用程序協議,是在數字移動電話、Internet及其他個人數字助理機PDA、計算機應用之間進行通信的開放性全球標準。WAP由一系列協議組成,用于標準化無線電通信設備,也可用于Internet訪問,包括收發E-mail、訪問WAP網站上的頁面等等。WAP將移動網絡和Internet以及企業的局域網緊密地聯系起來,提供了一種與網絡類型、運行商和終端設備都獨立的、無地域限制的移動增值業務。通過這種技術,無論用戶身在何地、何時,只要通過WAP手機,即可享受無窮無盡的網上信息資源。
利用WAP實現的網絡業務以其移動性、靈活性、個人化、信息實時性、信息簡短實用而受到廣大數字移動電話用戶的普遍歡迎。據預測,到2002年,中國Internet用戶將達6500萬,其中移動上網的用戶可達3000萬,超過使用PC上網的用戶;到2004年,全球Internet用戶將突破10億,其中約有3.5億用戶將通過移動方式接入Internet。顯然,用于解決無線移動接入的WAP技術將發揮愈來愈重要的作用。
二、WAP的前世今生
1. wap 1.x
WAP1.0版本是WAP的第一個版本,在1998年夏被通過。這一版本推介出了WAP的核心內容、i.e.WAP協議條款、WML以及WMLScript等。
WAP1.1版本于1999年夏推出,這是1.0版本的改良版,是對以前的版本進行歸納反饋的結果。1.1版是第一個商業版,在這一版本中的主要變化仍然是用XHTML對WML進行編排以得出W3C的詳細說明。這一版本支持WBMP格式的圖像操作,從而提高了無線電話應用(WTA)-規格及WML的所有標記,現在它已用小寫取代了大寫。
WAP1.2版本現已被通過,這一版本采用了WAP推進架構、用戶代理結構(UAPROF)、WDP通道、提高無線電話應用(WTA)規格以及包括支持附加的用戶網絡技術。
2. wap推陳出新
1 WAP2.0于2001年8月正式發布,它在WAP1.x的基礎上集成了Internet上最新的標準和技術,并將這些技術和標準應用到無線領域。這些新技術和標準包括XHTML、TCP/IP、超文本協議(HTTP/1.1)和傳輸安全層(TLS)。在這些新技術的支持下,新增加了數據同步、多媒體信息服務、統一存儲接口、配置信息提供和小圖片等新的業務和應用,同時加強了無線電話應用、Push技術和用戶代理特征描述等原有的應用。這些新的業務和應用將會帶來一種全新的使用感受,并極大地激發人們對無線應用服務的興趣,從而推動移動互聯網的發展。
3. wap2.0最新的標準和技術
3.1 對XHTML的支持
XHTML是由萬維網聯盟W3C制定的一項新標準,它是在HTML4.0的基礎上產生的,是現在和將來要產生的文檔類型和模塊的集合。這些文檔類型是在HTML4.0基礎上的擴展、改進或者是其子集的某一部分;XHTML是基于XML的,其最終將會在基于XML的用戶代理環境中執行。
在XML中引入新元素和新屬性相對簡單一些,在XHTML集合中的擴展是通過使用XHTML的各種模塊和采用開發基于XHTML模塊的技術來實現的。這樣,在進行內容開發和用戶代理設計時,在這些模塊中就能夠將原來和現有的特征集合組合在一起。
利用XHTML的好處有以下3點:XHTML文檔符合XML的標準,可以使用標準的XML工具對其進行瀏覽、編輯和驗證;XHTML文檔可以在XHTML的用戶代理中執行,也可以在現存的HTML4.0的用戶代理中執行;XHTML文檔可以開發基于HTML文檔對象模型的應用,也可以開發基于XML文檔對象模型的應用。隨著XHTML集合的演進,基于XHTML的文檔更容易在各種各樣的XHTML環境中或者它們之間進行互操作。通過利用XHTML,內容開發商能夠逐步進入XML,同時還能保持它們內容的前后兼容。
XHTMLBasic文檔類型包括了保持XHTML語言特征的最小的模塊集合。此外它還包括了圖像、窗體、基本表格和對象支持等,文檔類型豐富,但它不包括全部的XHTML集合,因為有些網絡客戶端不支持全部的XHTML特征,如移動電話、PDA、尋呼機和機頂盒等設備。XHTMLBasic被設計成能擴展的通用的基本集合,例如,其中事件模塊比傳統的XHTML4.0的事件系統更加通用,而且能通過另外的XHTMLModularization模塊集合進行增減和功能擴展。XHTMLBasic的目標是能夠支持各種各樣的用戶代理的通用語言。XHTMLBasic是WML2.0的基礎。
WAP2.0利用XHTML和CSSMobileProfile等標準,同時保持了對WML1.x的向后兼容,減少了開發、測試一種應用和為多種設備編制內容的時間,減少了開發成本。另外,XHTML的模塊化架構可以很容易、很快地適應不同的硬件環境的應用。通過使用級聯樣式單(Cascading Style Sheets,CSS),開發商可以將實際編碼和一個或多個XML文檔的樣式屬性分離開,減少了在瀏覽器緩存中的代碼量。
我們可以利用現有的開發固定互聯網內容和應用的工具和資源來開發WAP2.0的內容和應用,允許開發商使用通用的語言子集和開發工具同時為PC和WAP客戶端開發應用。因此支持WML2.0的瀏覽器同樣能夠支持XTHML,也能夠支持HTML。另外,支持WAP2.0的手機完全可以瀏覽現有的Internet內容。這樣,可以大大豐富WAP2.0的應用。
3.2 對TCP/IP協議棧的支持
互聯網工程任務組(IETF)一直致力于TCP/IP協議的優化研究,并特別制定了針對無線鏈路的TCP/IP協議。WAP論壇吸收了IETF的最新的技術成果,除了繼續支持原有WAP1.x的協議棧以外,在WAP2.0中還采用了如下IETF規范。
在傳輸層,WAP2.0采用具有無線特征的WP-TCP/IP協議,以使得網絡可以基于IP進行數據傳輸。WP-TCP提供面向連接的服務,它被優化用于無線環境,可與互聯網上的標準TCP應用充分交互操作。IETF PILC小組推薦使用一些在長距離瘦網絡中的TCP實現機制。這些機制已經被Standards Track RFC收錄,并作為有效的性能穩定的機制被互聯網組織接受。
在會話層,WAP2.0采用具有無線特征的HTrP協議(WP-HTTP),WP-HTTP規范針對無線環境的HTTP的協議子集,完全能夠與HTTP/1.1共同使用。WAP設備和WAP代理服務器/WAP服務器之間交互工作的基本模型是HTTP請求/回應處理機制。WP-HTTP支持回應的信息體壓縮和安全通道的建立。這樣,在WAP2.0中不一定需要WAP代理服務器,因為在客戶端和源服務器端通過使用HTTP/1.1就可以直接完成。
WAP2.0增加了更多的安全保證措施,包括采用TLS協議,提供改進的端到端的安全,集成有線Internet等,以保證使用移動商務和移動銀行應用等移動業務的安全。TLS協議的無線協議子集允許針對安全傳輸的交互操作。TLS的協議子集包括加密簇、驗證字格式、簽名規則和會話恢復等安全措施。
4. 新增加和增強的業務和應用
WAP2.0規范能夠幫助內容開發商向移動互聯網用 戶提供更豐富和更安全的移動互聯網服務。WAP2.0在世界標準領域是一個巨大進步,它允許應用開發商利用他們已經非常熟悉的開發Intemet應用的技術和工具開發各種移動應用。據Cahners ln-Stat Group預測,無線互聯網的用戶從2000年的3000萬可以發展到2005年的74200萬,WAP2.0通過新的應用和下一代的設備將極大地促進這一進程。在WAP2.0中聽融合的新技術將會使用戶切身體驗到WAP2.0中的新業務。
(1)推服務(WAP Push)
這種業務是一種基于服務器的應用,利用推代理服務器(Push Proxy)將內容送到或者推到手機設備中。這種功能在WAP2.0發行版中得到了加強,這種推的功能實際上是將像短消息、股票價格和交通信息之類的實時應用信息發給用戶:沒有這種推功能時,需要這種實時應用信息的用戶就要去詢應用最務器以得到最新的信息,在無線環境里這種詢操作效率不僅低,而且還浪費了無線網絡的資源。
(2)用戶代理特征描述(User Agent Profile,UAProf)
這種壹務羹供了一種機制,這種機制是將客戶的能力和用戶的喜好描述提供給應用服務器。WAF2。0是以W3C的能力組合/喜好特征(CC/PP)工作成果為基礎的。UAProf支持客戶機、服務器交互模式,用戶可以請求向服務器端發送客戶端或者用戶信息。服務器可以根據這些信息準備定制的內容響應給客戶端或者用戶,這種業務模型允許直接增加一些業務適配層。插人中間代理來提供增值業務。
考慮到用戶隱私的重要性,所以這種業務模型能夠由用戶控制其請求中的個人信息。
(3)無線電話應用(Wireless Telephony Application, WTA)
這種業務提供了一種可以開發一系列高級電話應用的工具。其中的高級電話應用可以在支持傳統數據功能的應用環境里運行。這些電話應用所有的呼叫處理服務,如呼叫建立、呼叫應答、呼叫掛起和呼叫轉移,可以和數據業務無縫地結合,這一點可以使得小區電話成為充分整合互聯網和語音業務得平臺。
(4)外部功能接口(External Functionality Interface,EFI)
EFI定義了WAE和WAE范圍之外所能運行的應用程序中的各組件或者實體之間得接口,類似于提供了一種插件,這種插件擴展和增強了終端瀏覽器或者終端中其他應用的功能。EFI的框架結構能夠支持WAP設備的未來發展和可擴展能力,而且還可以用來定義接人外部設備(如智能卡、GPS設備、醫療保健設備和數字相機)的特定接口。
(5)統一客戶存儲界面(Persistent Storage Interface)
這種能力規定了一套標準接口的存儲設備,通過這個接口可以在無線設備或其他相連的存儲設備上進行數據的組織、存取、存儲和采集。
(6)數據同步(Data Synchronization)
數據同步是指各種網絡設備(包括手機終端、PDA、PC)和各種網絡服務器之間某些數據集合保持一致的過程。這些數據集合包括名片信息、約會信息和公司的銷售賬單等。WAP論壇在WAP2.0中的數據同步的解決方案是采用SyncML發起組的工作成果,選擇SyncML語言作為數據同步解決方案的。在WAP和HTTP/1.1協議中均可以支持SyYncML的消息。
(7)多媒體信息服務(Multimedia Messaging Service,MMS)
MMS為實現豐富多彩的多媒體信息的傳遞提供了整體架構,它的特點和功能就是能夠傳送各種類型的內容。根據這種業務模型,MMS允許消息的快速發送(如SMS)和消息的存儲轉發(如E-mail)或兩種模式同時運行。這種靈活性使用戶和運營商可以根據合理的使用體驗定制服務。結合其他的WAP服務,如UAProf和Push服務,MMS還提供了一種高效的信息服務的解決方案,它可以提供消息公告,即主動調整服務,以將需要發送的信息組合在一個表格中,終端接收設備可以利用這個表格高效地接收信息。
(8)配置信息提供(Provisioning)
這種業務提供了一種標準方法,利用這種方法可以給WAP客戶端提供在無線網絡上進行操作所必要的初始化信息。這就使得運營商可以利用一套通用的工具管理其網絡上的終端設備;
(9)小圖片(Pictogram)
用戶可以使用像笑臉符之類的小圖像進行信息的傳遞,有時候比文字更加有效,也更生動活潑。
三、WAP應用
3.1 WAP應用優勢
與普通Internet相比,應用WAP協議的無線Internet在終端、接入方式、帶寬、穩定性以及商業運作模式之間存在巨大差異。無線Internet可以通過掌上服務,把每個用戶個體與Internet緊密地結合在一起,因此用戶可以得到比傳統的Internet更多的個性化信息服務。從WAP的組成和特點來看,它具有以下應用優勢:
(1) 適用于無線數據的傳輸機制;
(2) 獨立于網絡標準;
(3) 開放的標準,并獨立于各生產廠商;
(4) 可以用作Internet瀏覽器,支持超文本鏈接,具有較強的交互能力;
(5) 可以從服務器上直接下載應用,從而可以快速提供新的服務。這一點也是WAP與嵌入式軟件明顯不同的地方。
3.2 WAP應用限制
盡管WAP具有較強的應用優勢,但目前也有一些條件限制了WAP的應用。這主要表現在ISP環節、網頁顯示內容、無線接入及通信速度等方面。
隨著無線技術、Internet接入和內容服務的日益相互融合,許多廠商都想盡快解決在手持設備上顯示各種信息的方法。雖然說這對無線上網用戶而言是個好消息,但令人遺憾的是,用戶要享受到這樣的服務,必須經由無線ISP這個重要的環節,也就是說在目前的技術條件下,這個環節是不能越過的,解決這個問題還有待時日。
手持設備的顯示屏幕非常小,單屏顯示信息有限,這在一定程度上限制了WAP技術的應用。不過,為了使手持設備用戶可以訪問盡可能多的網站,獲取盡可能多的信息,許多廠商都在想辦法研究信息的表現形式。例如,美國Digital Paths公司開發出了Digital Paths技術。利用這種技術,服務商可以把所有信息以一種簡單實用的文本形式顯示在手機設備上,這可以大大改善網頁內容的可讀性。
另外,Digital Paths公司還采用一臺服務器作為網站與用戶之間取得聯系的中介。服務器上的應用軟件可以根據用戶手持設備的類型,對截獲的網頁內容重新進行格式處理,以實現較好的顯示效果。這種方法突破了普通手持設備160×160像素的分辨率和手機屏幕5行顯示空間的限制。不過這種技術真正達到標準化并獲得廣泛普及,恐怕還需要一段時間。
除了上述幾點外,無線接入問題目前一時難以解決,也會限制WAP應用。例如,Palm VII這種設備就必須通過一個采用802.11技術的基站進行無線電連接,雖然說已有一些廠商推出了802.11基站設備,但種類和數量都十分有限,與市場要求的標準還有很大差距。
而且,WAP手機在收發E-mail、瀏覽網站信息等功能之外,很難提供更復雜的通信應用,比如在線采購和視頻會議等。其關鍵是目前移動通信網的運行速度根本無法達到要求。只有將來移動通信網進行全面“提速”,并使Internet實現快速移動后,更高級的WAP應用功能才可成為現實。
3.3 WAP未來
1999年全球有1.35億移動電話用戶,根據IDC公布的調查報告,到2005年,全球無線電通信用戶預計將達到10億。調查中還發現了一個值得注意的現象,即許多手機用戶,往往同時也是Internet用戶,這些人在本國內的所占比例,通常決定了該國的通信市場大小。一般來說,這些人所占比例越高,他們國家的通信市場就越發達。比如日本,由于對移動電話技術和相應的基礎設施進行了巨額投資,使得日本移動電話的用戶很早便享受到了互動信息業務,雖然一時還不完備,但卻極大地刺激了市場的發育。據預測,到2002年日本的手機用戶數將會達到全世界移動電話用戶數的10%。同樣,歐洲的情況也非常令人樂觀。未來幾年中,歐洲移動電話市場的增長速度可能達到300%以上。早在1999年,Ellison,這位美國Oracle公司的CEO便在瑞士日內瓦舉行的“TELECOM 99”展覽會上指出,Internet將取代PC在歷史舞臺上扮演主角,利用無線終端與Internet連接的用戶將很快超過使用PC與Internet連接的用戶。
中國信息產業部電子信息中心和藍田市場研究公司聯合進行的全國性大范圍調查,形成了國內信息產業多層面的基礎數據(簡稱ITD2000)。結果顯示,我國移動電話用戶絕對數量超過5000萬戶,無線尋呼用戶超過7000萬戶,已經成為名副其實的移動通信大國。據ITD2000顯示,10年來,我國移動電話的發展從無到有,空前迅猛。移動電話用戶數量一直保持高速增長。1999年我國移動電話用戶達到4000萬戶,目前已超過5000萬戶,僅次于美國和日本,居世界第三位,增長速度居世界第一。而且,國產移動通信制造業已取得群體性突破。在移動通信市場上,中興、大唐、華為、金鵬等民族通信企業迅速崛起,并獲得移動設備入網證。國產品牌手機占領的市場份額日益增大。
基于WAP的移動通信設備上網將為我們展示一個全新的空間。雖然WAP技術本身仍在不斷地完善和發展,但隨著技術的不斷進步和用戶市場的日益成熟,所有的問題都會逐步加以解決,與之相應,在移動通信設備中發生的這場信息術革命,也將變得更加轟轟烈烈。
WAP目前已經成為通過移動電話及其他無線移動終端使用無線信息服務的全球性的技術與工業標準,它不但使現有移動網絡的許多應用得到了迅速發展,同時也催生更多的全新的增值業務,而且這些應用還將由純信息的服務逐漸向更加交互化和電子商務化的方向發展。
如果說移動電話的出現使我們擺脫了地理位置的束縛,那么Internet的出現則給我們提供了一片廣闊的信息天地;移動電話與Internet的結合,不僅使人們對于信息的獲取能獨立于所處的地理位置,而且還可以獨立于信息的來源。所以WAP技術必將給我們帶來一個全新的未來,人類最終將超越時間和空間對溝通的束縛,進入更為激動人心的美好時代。
四、WML 編程
WML(Wireless Markup Language - 無線標記語言)這種描述語言同我們常聽說的HTML語言同出一家,都屬于X ML語言這一大家族。HTML語言寫出的內容,我們可以在我們的PC機上用IE或是Netscape等瀏覽器進行閱讀,而 WML語言寫出的文件則是專門用來在手機等的一些無線終端顯示屏上顯示,供人們閱讀的,并且同樣也可以向使用者提供人機交互界面,接受使用者輸入的查詢等信息,然后向使用者返回他所想要獲得的最終信息。
1.基本規則
* WML使用XML文檔字符集,目前支持 Unicode 2.0,和HTML不同,WML的所有標簽,屬性和規定的可接收值必須小寫,CARD的名字和變量也是區分大小寫的。和HTML一樣,對于連續的空字符,只顯示一個空格。標簽內屬性的值必須用"或者'括起來,屬性名,=和值之間不能有空格。對于不成對出現的標簽,必須在 > 前加 / ,比如<br/>。在對變量的引用上和HTML基本相同,有:
$(var1:esc)
$(var1:noesc)
$(var1:unesc)
三種形式,具體含義參見前面HTML的相關部分。在對保留字符的處理上也基本相同,對應的取代字符有:
< <
> >
' '
" "
& &
$ $$
空格
- ­
這里要指出的是在URL的傳遞過程中,用來連接參數的 & 必須轉化為 &。
2.基本格式和文件頭
wml文件的一般格式:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<access/>
<meta..../>
</head>
<card>
Some contents...
</card>
<wml>
結構看上去和HTMl文件很類似,對于每一個DECK(板塊),在其文檔開頭必須指明以下的類型聲明:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
千萬注意字母的大小寫。對于一個DECK,其文件大小最好不要超過1.2K。
<wml>標簽和HTML中的<html>標簽一樣,用來表明這是一個 WML的DECK,它有一個可選的xml:lang屬性來制定文檔的語言,比如<wml xml:lang="zh">表示文檔語言為中文。
和HTML一樣<head>標簽包含了該DESK的相關信息。<head> 標簽之間可以包含一個<access>標簽和多個<meta>標簽。
<access domain="域" path="/路徑" />相當于HTML中的<BASE>標簽,指定該DECK的訪問控制信息,它用兩個可選的屬性,domain用來指定域,默認值為當前域, path用來指定路徑,默認值為"/",即根目錄。由于 <access>單獨使用,所以要用/結尾,以后對于類似的情況不再贅述。
<meta 屬性 content="值" scheme="格式" forua="true|false"/> 和HTML中的類似,提供了該DECK的meta信息。屬性是必選的,包括一下三種情況
name="name" UP.Link Server忽略meta數據
http-equiv="name" UP.Link Server將meta 數據轉為 HTTP 響應頭(同HTML)
user-agent="agent" UP.Link Server 直接將 meta 數據傳給手機設備,content屬性也是必選的,其內容根據屬性而定。scheme屬性目前尚不支持。forua 為可選屬性,指定在該wml文件傳到客戶端之前,<meta>標簽是不是被中間代理刪除(因為傳輸的協議可能改變),默認值為false。
目前支持的meta數據:
<meta http-equiv="Cache-Control" content="max-age=3600"/>指定DECK在手機內存緩存中的存儲時間段,默認的為30天(除非內存耗盡),在該期間,手機對于訪問過的DECK直接從緩存里調用。如果信息是對時間敏感的,可以用max-age指定DECK在緩存里的生存期,最小單位是秒, 如果指定為0, 則每次都需通過連接服務器來調用該DECK。
<meta user-agent="vnd.up.markable" content="false"/>和<meta user-agent="vnd.up.bookmark" content="指定的URL"/> 類似于普通瀏覽器的書簽功能。當用戶將一個CARD做了書簽后,手機瀏覽器首先用一個標記記錄該CARD,這個標記默認的是<card>標簽中的title屬性(以后會講到),然后當用戶選擇了該書簽以后,瀏覽器就會打開被記錄的URL。但是因為在默認的情況下,手機會記錄所有的DECK,所以,一般<meta>被用來使手機不要記錄當前的URL,即
<meta user-agent="vnd.up.markable" content="false"/>。此外, 如果要為書簽指定不同于當前DRECk的 URL,用<meta user-agent="vnd.up.bookmark" content="指定的URL"/>。
一個DECK可以包含多個CARD,每個CARD的內容可能不止一屏顯示,注意DECK,CARD和屏幕顯示范圍的關系。一個CARD用<card>和</card>包含。<card>可以包含以下可選的屬性:
<card id="name" title="label" newcontext="false" ordered="true" onenterforward="url" onenterbackward="url" ontimer="url">
*id屬性用來指定CARD的名字,可用來在CARD間跳轉,相當于在HTML中在頁內跳轉時用<A NAME="jumpHere">。
*title屬性用來作為書簽的標記,該屬性一般不會顯示在屏幕上。
*newcontext屬性,默認值為false, 用來指示當跳轉到本CARD時,手機是不是要清除以前保留的信息,包括變量,堆棧里的歷史記錄,重新設置手機狀態等。
*ordered屬性,默認值是true,表明該CARD里的內容是按固定的順序顯示, 還是按用戶的選擇來顯示。這點和HTMl不同,CARD 頁面里的內容可以按一定的順序顯示,默認的是按線性順序顯示,即按代碼的順序,但是,要注意的是,以下三個標簽必須按以下順序來寫<onevent> <timer> <do>, (這和以后要講的“事件”有關)。這樣做是為了方便填表單,當ordered設置為true時,如果一個表單的內容不能在一屏里顯示完,就分成多屏顯示;當ordered設置為false時,手機可以顯示一個概要CARD來總結有效的選項,用戶可以從中選取表單選項來填寫。
*onXXX屬性,類似于HTML標簽中的onXXX屬性,用來捕捉事件,當事件被觸發時執行指定的操作(任務),在這里是轉向某個URL。
3.顯示文本
在文本的顯示上WML基本和HTML相同。文字段落包含在<p align= "alignment" mode=" wrapmode">和</p>之間,align屬性指定該段文字的對齊方式,默認的是left,其他可選擇right和center;mode屬性指定當一行顯示不下所有的文字時是否自動換行,默認的是自動換行wrap,如果選nowrap,則在一行中顯示,瀏覽器會通過類似于水平滾動條的機制來顯示所有文字。
換行標簽也一樣為<br/>,這里先替一下,在標單中如果有多個<input>或者<select>,其間不要用<br/>,否則會使手機瀏覽器認為是斷點而把表單分頁顯示。
文字的修飾標簽有<b>、<i>、<u>、<em>、<strong>、<big>和<small>,意義和HTML里的相同。
表格的顯示標簽也和HTML相近,使用<table title="name" align="left|right|center" columns="列數">、<tr>和<td>來顯示,<table>的title屬性用來給表格取個名字,columns屬性指定表的列數,不能為0,可選的align屬性和前面提到的一樣是對齊方式。表格中可以包含文字和圖片。
test1.wml
--------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card>
<p align="center">
<i>Hello</i><br/>
<b><i>World!</i></b>
<table title="mytable" align="right" columns="2">
<tr>
<td>1-1</td>
<td>1-2</td>
</tr>
<tr>
<td>2-1</td>
<td>2-2</td>
</tr>
</table>
</p>
</card>
</wml>
4.顯示圖片
顯示圖片(1位黑白BMP圖片)的標簽一樣類似于HTML,<img alt="text" src="url" localsrc="icon" align="left" height="n" width="n" vspace="n" hspace="n"/>,屬性中alt和src是必須要有的,其他可選。另外要注意的是<img>要放在<p>里,不能放在<do>和<option>等功能健標簽和選單標簽里。
*alt屬性用來指定當手機不支持圖片顯示時用來顯示的文字。
*src屬性指定圖片的URL,但當有了以下的localsrc屬性時,手機瀏覽器就忽略src屬性。
*localsrc屬性用來指定顯示存在手機ROM中的圖標,如果找不到,則到UP.Link Server上去找。
*可選的align屬性用來表明圖片同當前行文本的對齊方式,默認值為bottom,可選to和middle。
*height、width、vspace、hspace屬性分別指定圖片的長寬和距環繞文字的間距,目前不是所有的WAP手機都支持這些屬性。
test2.wml
---------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card>
<p align="center"><img alt=":)" src="xxx.bmp" localsrc="smileyface"/></p>
</card>
</wml>
5.錨和任務
連接是 HTML 頁面里最基本的功能, 在 WML 里也一樣用 <a href="url" title="label"> 和 </a>來包括用來建立連接的文字,必選屬性href指定了要打開的URL,可選的title屬性給該連接取個標記名字,這個名字將作為軟按鈕之一的ACCEPT鍵(詳見以前的HDML入門文章)的標記顯示在屏幕的軟按鈕區,所以通常可以將屬性作為提示文字是用。
然而,以上的連接在WML里只是任務的一種情況,為了能夠使用其它任務,所以引進了新的標簽<anchor title="label">任務標簽 文本</anchor>,<a>其實是當任務標簽為<go/>時的簡單表示方式。
test3.wml
---------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card>
<p>
<anchor title="Link1"><go href="test1.wml"/>News</anchor><br/>
<a title="Link2" href="test2.wml">Sports</a>
</p>
</card>
</wml>
WML里的任務標簽有以下幾種,除了用于<anchor>,還可以用在事件中:
1)<go>用來指示瀏覽器顯示指定的URL,包括DECK的第一個CARD或者指定的CARD。語法如下:
<go href="url" sendreferer="false|true" method="get|post" accept-charset="charset">
<postfield name="name" value="value"/>
<setvar name="name" value="value"/>
</go>
其中href屬性為必選,其他為可選。sendreferer屬性表示是否傳遞調用href所指定的URL的頁面的URL,也就是當前頁的URL,即 HTTP 頭中的HTTP_REFERER,默認值為false,可選值為true。method和HTML中的表單FORM的method屬性一樣,指定表單是以get的方式還是post的方式遞交,以便cgi處理,默認的值為get,但如果未指定method但<go></go>間存在<postfield>,手機自動以post方式傳遞。accept-charset 屬性可覆蓋在HTTP頭里指定的字符集,可以寫多個字符集,如accept-charset="UTF-8,US-ASCII, ISO-8859-1"。
<postfield name="name" value="value"/>可以看作是HTML表單FORM中的<INPUT TYPE="HIDDEN" NAME="變量名" VALUE="值">,通過它可以向指定的URL傳遞以“變量名/值”形式的數據。name和value屬性都是必選的。注意只有這里的變量是用來遞交給CGI程序的。
除了<postfield>,還可以在<go>和</go>間加入一句或者多句<setvar name="name" value="value"/>,該語句的意思是,當觸發某一事件時,給變量賦值。
要注意的是,當<go>和</go>之間沒有任何語句時,要用<go/>的形式,這點比較特別,比如<anchor title="Link1"><go href="test.wml"/>News</anchor>。
2)<prev>用來將當前頁面的URL壓入URL歷史堆棧,并打開此前的URL,若該URL不存在,則<prev>無效。語法類似<go>:<prev><setvar name="name" value="value"/></prev>,<prev>和</prev>之間可加入一句或多句<setvar name="name" value="value"/>,若不加,則必須變成<prev/>的形式。
3)<refresh>用來刷新當前的頁面,從而使得頁面內的變量刷新,語法為<refresh><setvar name="name" value="value"/></refresh>。
4)<noop>,表示什么也不做,該標簽不能用在<anchor>中,一般用在覆蓋DECK級的<do>(以后會說明)
6.顯示表單
類似于HTML的<FORM>,<fieldset>可用來包括一組表單選項,但不是必須的。前面說過,當<card>的ordered設置為false時,手機可以顯示一個概要CARD來總結有效的選項,方便用戶從中選取表單選項來填寫,概要CARD就是根據<fieldset>和獨立的輸入框<input>以及選單<select>來總結的。語法為, <fieldset title="label">表單內容</fieldset>,可選的title屬性除了可用來表示表單的名字外,還在概要CARD里作為選擇項的標題。表單內容可以是嵌套的<fieldset>,輸入框<input>,選單<select>和必要的提示文本。
<input name="variable" title="label" type="type" value="value" default="default" format="specifier" emptyok="false|true" size="n" maxlength="n" tabindex="n"/>,用來輸入文本,除了name屬性是必要的,其他可選。
*name屬性,指定了用來存儲該輸入文本的變量名字。
*title屬性,該輸入框的名字,同樣可被用來作為概要CARD頁中的選項名。
*type屬性,默認值為text,如選擇password,則輸入的數據顯示為*。
*value屬性,在語法和行為上等同于下面的default屬性,
*default屬性,指定輸入框的默認值,即name屬性指定變量的默認值,當用戶輸入新值時,該值無效,如果該值不符合以下format屬性的規定,則手機也忽略該默認值。
*format 屬性,用來格式化輸入的數據,可用的標記如下,使用時可用“一位數字標記”和“*標記”的形式,前者代表N個標記型字符,如3X, 后者代表任意個(小于maxlength屬性的值)標記型字符。
標記 描述
A 任何符號或者大寫字母(不包括數字)
a 任何符號或者小寫字母(不包括數字)
N 任何數字(不包括符號或者字母)
X 任何符號、數字或者大寫字母(不可改變為小寫字母)
x 任何符號、數字或者小寫字母(不可改變為大寫字母)
M 任何符號、數字或者大寫字母(可改變為小寫字母)或者多個字符,默認為首字大寫
m 任何符號、數字或者小寫字母(可改變為大寫字母)或者多個字符,默認為首字小寫
*maxlength屬性,指定了用戶可輸入的最大字符長度,最大限制為256個字符。
*emptyok屬性,表示用戶可否不填輸入框,默認為false,即要填。
*size屬性,輸入框顯示長度,目前未被支持。
*tabindex屬性,類似于在HTML表單中按TAB鍵后,焦點落在哪個選項上,該值決定了這個選擇順序,數字大的排在后面。目前未被支持。
test4.wml
---------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="card1" ordered="false">
<p>
USERNAME:<input name="userName" title="User Name" type="text" value="YourNameHere" format="*M" emptyok="false" maxlength="12" tabindex="1"/>
PASSWORD:<input name="password" title="Password" type="password" format="8x" emptyok="false" maxlength="8" tabindex="2"/>
COMMENTS:<input name="comments" title="comment" type="text" value="YourCommentsHere" format="*M" emptyok="true" maxlength="30" tabindex="3"/>
</p>
</card>
</wml>
將上例<card>中的odered的值改為"true"試試看,然后再在<p>和</p>內加入<fieldset title="field1">和</fieldset>試試看。
<select>選單類似于HTML表單中的<SELECT>,<select>和</select>間可包含<optgroup>和<option>標簽,語法如下,所有屬性都為可選:
<select title="label" multiple="false|true" name="variable" default="default" iname="index_var" ivalue="default" tabindex=" n">
<optgroup title="label">選單內容</optgroup>
<option title="label" value="value" onpick="url">
事件或者文本
</option>
</select>
*title屬性,如以上<input>的title屬性。
*multiple屬性,指定用戶可否進行多項選擇,默認值為false。
*name屬性,用來存儲用戶選擇項的變量名,其值為 <option>標簽的value屬性,若用戶沒有選擇又沒有用 default 屬性指定默認值,則手機將改變量賦值為空字符串"",對于多項選擇,每個值用“;”分開。
*default屬性,可為name屬性指定的變量賦默認值。
*iname屬性,用來記錄用戶選擇項的位置,相應的值從 1 開始。 若沒選,則該值為0。
*ivalue屬性,用來記錄默認值所在的位置。
<optgroup>可用來將多個<option>分組,<optgroup>和</optgroup>間還可包括<optgroup>和<option>,該標簽目前尚未被支持。
<option>,類似于HTML中選單的<OPTION>,用來表示選單的可選項。<option>和</option>間可包括事件(見下節)和選單的顯示文本。<option> 的屬性為可選,其中value屬性用來提供值,當選到該項后,將該值賦給<select> 的name屬性所指定的變量。onpick屬性,用來指定用戶選到該項并按ACCEPT鍵后所打開頁面的URL。
test5.wml
---------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="card0" ordered="false">
<p>
Please select a city...
<select title="Cities List" name="city">
<option title="Beijing" value="c1">Beijing</option>
<option title="Shanghai" value="c2">Shanghai</option>
<option title="Hongkong" value="c3">Hongkong</option>
</select>
Please select columns...
<select title="Column List" multiple="true" name="col">
<option title="Hot News" value="l1">News</option>
<option title="Cool Sports" value="l2">Sports</option>
<option title="Pop Enter,,," value="l3">Entertainment</option>
</select>
</p>
</card>
</wml>
WML的事件基本上分為兩大類,一類是鍵盤(包括軟硬按鈕)輸入事件,用<do>標簽來處理,另一類是相關頁面內部的事件,用<onevent>標簽來處理。
<do>的語法如下:<do type="type" label="label" name="name" optional="false|true">任務</do>,任務就是以前提到的四種任務。<do>的屬性中,type是必選的,其他為可選。
*label屬性,指定了軟按鈕在屏幕上的顯示文本。目前type屬性為delete,help,prev時該屬性無效。
*name屬性,為<do>取個名字,同一的CARD里的<do>不能重名。如果CARD級的<do>和DECK級的<do>同名,則覆蓋DECK級的<do>。
*optional屬性,指定手機是不是可以忽略這個事件,默認值是false。
*type屬性,指定觸發的事件,具體如下;
type值 觸發原因
accept 調用ACCEPT按鈕機制
delete 調用DELETE按鈕機制
help 調用HELP按鈕機制
options 調用選擇按鈕機制
prev 調用PREV按鈕機制
reset 調用清除和重新設定手機狀態時的RESET機制(目前不支持)
unknown 調用unknown機制,等于type=""(目前不支持)
vnd. co-type 調用廠商特定的機制(目前不支持)
X-*, x-* 供以后使用(不保留)(目前不支持)
test6.wml
---------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0"/>
</head>
<card id="card0" ordered="false">
<do type="accept" label="InputName" name="do1">
<go href="#card01"/>
</do>
<p>
NAME:<input name="userName" title="User Name" type="text" format="*M" emptyok="false" maxlength="12"/>
</p>
</card>
<card id="card01">
<p>
You name is $(userName:noesc).
</p>
</card>
</wml>
<onevent>的語法如下,<onevent type="type">任務</onevent>,必選屬性type的取值如下:
type值 如果用戶執行了以下操作就執行任務
onpick 用戶選擇或不選一個<option>項時。
onenterforward 用戶使用<go>任務到達一個CARD時。
onenterbackward 用戶使用<prev>任務返回到前面的CARD時,或者按BACK按鈕時。
ontimer 當<timer>過期時。
test7.wml
---------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0"/>
</head>
<card id="card0" ordered="false">
<p>
Please select a city...
<select title="Cities List" name="city">
<option title="Beijing" value="Beijing">
<onevent type="onpick">
<go href="#card01"/>
</onevent>Beijing</option>
<option title="Shanghai" value="Shanghai" onpick="#card01">Shanghai</option>
<option title="Hongkong" value="Hongkong" onpick="#card01">Hongkong</option>
</select>
& lt;/p>
</card>
<card id="card01">
<p>
You are Living in $(city:noesc)
</p>
</card>
</wml>
<timer/>可以用來在用戶不進行任何操作的一段時間后,自動執行一個任務,任何激活CARD頁面的任務和用戶操作都會啟動<timer/>,而任務進行時,<timer/>就停止。每個CARD只能有一個<timer/>,一個<timer/>只能觸發一個任務。語法如下:<timer name="variable" value="value"/>,其中name為可選屬性,指定為一個變量名,當退出該CARD時,該變量存儲此時定時器的值,當定時器超時時,手機將該變量設為0;value為必選屬性,用來設置定時器的定時值,最小單位為0.1秒。
test8.wml
---------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0"/>
</head>
<card id="card1" ontimer="#card2">
<timer name="time1" value="50"/>
<p align="center">
After 5s, goto card2
</p>
</card>
<card id="card2">
<onevent type="ontimer">
<go href="#card1"/>
</onevent>
<timer name="time2" value="50"/>
<p align="center">
Here is card2!
</p>
</card>
</wml>
再提一下,<onevent> <timer> <do>三者必須按以上順序寫。
此外在DECK級還可以加入<template>,用來將事件捆綁在DECK級上,語法如下:
<template onenterforward="url" onenterbackward="url" ontimer="url">
<do>或者<onevent>
</template>
test9.wml
---------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0"/>
</head>
<template>
<do type="accept" label="deckPress" name="do1">
<go href="#card01"/>
</do>
</template>
<card id="card0" ordered="false">
<do type="accept" label="cardPress" name="do1">
<go href="#card02"/>
</do>
<p>
Press ACCEPT...
</p>
</card>
<card id="card01">
<p>
Here is card01
</p>
</card>
<card id="card02">
<p>
Here is card02
</p>
</card>
</wml>
7.編程
1)在WEB服務器上添加WML的MIME類型
對于IIS4,可在其管理器里的站點屬性中加入新的MIME類型,后綴.wml和 MIME類型text/vnd.wap.wml。
對于PWS,可修改注冊表,先在 HKEY_CLASSES_ROOT層加入主鍵.wml,再加入串值Content Type為text/vnd.wap.wml,然后在HKEY_LOCAL_MACHINE\Software\CLASSES\MIME\Database\Content Type\中加入主鍵text/vnd.wap.wml,再加入串值Extension為.wml。
以前提到的HDML也用類似的方法。
2)以http方式訪問wml文件
在手機瀏覽器的URL欄里輸入http://localhost/test.wml,就可以訪問WML文件了。
3)CGI設計
和普通CGI變成的方式差不多,只是返回結果時,先要輸出Content-Type為text/vnd.wap.wml,然后再輸出WML內容。
test10.wml
---------------
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0"/>
</head>
<card id="card0">
<do type="accept" label="Input Name" name="do1">
<go href="http://localhost/test.asp" method="post">
<postfield name="uid" value="123456"/>
<postfield name="uname" value="$(userName:esc)"/>
</go>
</do>
<p>
NAME:<input name="userName" title="User Name" type="text" format="*M" emptyok="false" maxlength="12"/>
</p>
</card>
test10.asp
---------------
<%
uid=Request.Form("uid")
userName=Request.Form("uname")
Response.ContentType="text/vnd.wap.wml"
%>
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card>
<p>
USERNAME:<%=userName%>
USER__ID:<%=uid%>
</p>
</card>
</wml>
五、流行的手機瀏覽器
1.YoYo手機瀏覽器是一款可以運行于大多數手機上的受瀏覽器,具有快速、穩定、省流量、方便、快捷等特點。
2.UCWEB UCWEB是一款國產手機網絡瀏覽器,擁有眾多的功能,安裝過程方便快捷且不過多占用手機中寶貴存儲資源,在兼容性和網頁支持方面較出色。
3.Opera 著名瀏覽器的手機版本,在全球約有兩千萬用戶,擁有很好的人性化設計和兼容性。
4. GO瀏覽器是3G門戶獨立開發的一款手機瀏覽器軟件,可以在手機上實現瀏覽WAP、WWW網頁。
六、jsp技術在WAP開發中的應用
1 jsp技術
使用jsp(java server api)技術可以簡單而快速地在wap終端上生成動態的wap頁面,而且能夠利用jsp的諸多功能,實現復雜的wap應用。我們仍以wml為例,講解jsp技術在wap開發中的應用。
2 基本規則
使用jsp技術前,首先要建立它的開發環境。一般是在windows nt上安裝并建立java server web development kit(jswdk),其版本可為1.01版或更高的版本。
為了測試和瀏覽jsp實現的wap應用,還需要安裝wap模擬器(瀏覽器),如nokia wap toolkit,并安裝java runtime environment (jre) 1.2.2或以上版本。
安裝配置好tomcat
完成以上準備工作之后,就可以按照以下的基本規則使用jsp編寫wml程序了。
(1) wml的標簽和語句均可直接寫在jsp程序中。
(2) 如果想使用jsp來處理wml的標簽和語句,則需要使用“<%”和“%>”引起來,格式為:
<%
……(jsp編寫的wml語句行);
%>
例如,以下幾行語句就是利用jsp的out.println來輸出wml的標簽和語句:
<%
out.println("<p>");
out.println("hello from script code!<br/>");
out.println("</p>");
%>
(3) jsp編寫的wml語句要用引號(" ")引起來,然后再用括號括起來,而且后面還要加上分號( ; ),格式為:
jsp對象.方法/關鍵字(" ……wml標簽或語句行 ");
例如,下面就是反映jsp書寫wml語句格式的例子:
out.println("hello from script code!<br/>");
(4) wml的文件類型可以使用jsp的response對象進行聲明,也可以在聲明頁面語言時一塊兒聲明,它們的格式分別如下:
<% response.setcontenttype("text/vnd.wap.wml"); %>
或 <%@ page language="java" contenttype="text/vnd.wap.wml" %>
(5) 最后的程序文件保存時要采用“.jsp”的擴展名,即保存為jsp的程序文件。jsp將被編譯成java源文件,最后成為servlet。
了解了以上基本規則,我們下面給出一個利用jsp向wap瀏覽器顯示“hello from script code!”信息的簡單程序,通過該程序大家可以進一步認識利用jsp開發wml頁面的具體方法。
<?xml version="1.0"?>
<!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/ wml_1.1.xml">
<% response.setcontenttype("text/vnd.wap.wml"); %>
<wml>
<card id="start">
<do type="accept">
<go href="index.jsp#test"/>
</do>
<p>jsp test:<br/>
press accept to continue!<br/>
</p>
</card>
<card id="test">
<do type="prev">
<prev/>
</do>
<%
out.println("<p>");
out.println("hello from script code!<br/>");
out.println("</p>");
%>
</card>
</wml>
3 程序舉例
我們下面利用jsp和wml實現一個為移動用戶定時更新約會的例子。該例的應用程序共包括兩個頁面。第一個頁面的文件是pick_appointment.jsp,它提供了一個選擇卡片,當用戶選擇了其中某一個約會時間時,瀏覽器就會帶著本次約會的id號進入到第二個頁面,即文件名為show_appointment_data.jsp的頁面。我們在第二個頁面編寫了兩個卡片,其中第一個卡片用于顯示會面的時間,第二個卡片用于顯示數據輸入,讓用戶通過輸入id而取消約會。
程序中動態的約會數據是通過java bean的實例來取得的,具體過程其實是通過jdbc連接到數據庫的過程。取消約會的操作是通過servlet實現的。由于用戶可能隨時取消某個約會,所以我們需要對pick_appointment.jsp頁面進行定時刷新。下面我們就給出這一應用程序的源程序。
pick_appointment.jsp頁面文件的程序代碼如下:
<%@ page language="java" contenttype="text/vnd.wap.wml" %>
<jsp:usebean id="appointmentbean" class="mwebber.samples.appointmentbean" scope
="application" />
<%!
// 下面創建針對每次約會的選項<option>元素
private string getoptions(mwebber.samples.appointmentbean appointmentbean) {
stringbuffer sb = new stringbuffer();
int[] appointmentids = appointmentbean.getappointmentids();
for(int i=0; i<appointmentids.length; i++) {
sb.append("<option onpick=\"show_appointment_data.jsp?id=");
sb.append(i);
sb.append("\">");
sb.append(appointmentbean.getappointmenttime(i));
sb.append("</option>");
}
return sb.tostring();
}
%>
<%! string strxmlprologue = "<?xml version=\"1.0\"?>"; %>
<%-- wml內容開始 --%>
<%= strxmlprologue %>
<!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/ wml_1.1.xml">
<wml>
<card id="pick" title="appointments">
<!-- 每分鐘刷新一次卡片組 -->
<onevent type="ontimer">
<go href="pick_appointment.jsp"/>
</onevent>
<timer value="600"/>
<!-- 回顯卡片 -->
<do type="prev">
<prev/>
</do>
<!-- 為要選擇約會而顯示"select" -->
<p>
<select title="appointments">
<%= getoptions(appointmentbean) %>
</select>
</p>
</card>
</wml>
<%-- wml內容結束 --%>
show_appointment_data.jsp頁面文件的程序代碼如下:
<%@ page language="java" contenttype="text/vnd.wap.wml" %>
<jsp:usebean id="appointmentbean" class="mwebber.samples.appointmentbean" scope="application" />
<%
// 使用request對象的方法獲取"id"參數的值
int intappointmentid = integer.parseint(request.getparameter("id"));
%>
<%! string strxmlprologue = "<?xml version=\"1.0\"?>"; %>
<p>
<%-- wml內容開始 --%>
<%= strxmlprologue %>
<!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/ wml_1.1.xml">
<wml>
<card id="main_data" title="main data">
<p align="center">
<b>
<%= appointmentbean.getappointmenttime(intappointmentid) %>
</b>
</p>
<p>
<br/>
<%= appointmentbean.getappointmentdetails(intappointmentid) %>
<br/>
<a href="#check_off">check off this appointment</a><br/>
<a href="http://localhost:8080/pick_appointment.jsp">back to appointments list</a>
</p>
</card>
<card id="check_off" title="check off">
<!--設置向服務器發送輸入數據的選擇項 -->
<do type="accept">
<go href="/servlet/processcheckoff" method="post">
<postfield name="check_off_code" value="$check_off_code"/>
</go>
</do>
<p>
<input name="check_off_code" emptyok="false" maxlength="6"/>
</p>
<p>
<a href="#main_data">back to appointment data</a>
<br/>
<a href="http://localhost:8080/pick_appointment.jsp">back to appointments list</a>
</p>
</card>
</wml>
<%-- wml內容結束 --%>
結束語
WAP2.0將世界上最新的標準和技術集成在一個移動環境中,提供了更多的移動業務和應用,是一個具有更豐富移動體驗的平臺:在WAP2.0的支持下,設備制造商有機會開發支持經過優化的具有WAP2.0特征的WAP應用的手機設備,這些WAP2.0的特征包括彩色顯示、多媒體信息、大文件下載以及改善的導航功能、優化的用戶界面等。而網絡運營商將會在支持WAP的這些新業務中受益。可以相信,WAP2.0的推出必定會推動移動互聯網的發展。
文章列表