眾所周知,delphi有創建HTML文件的能力。然而,你知道嗎?delphi也能用來創建一些新的WAP(Wireless Application Protocol) 設備所需要的WML文件。
這篇文章中,你將學習到如何創建一個快速的,使用一個wap電話或者是一個模擬系統的定制查詢系統。現在來讓我們來超越一下我們自己,來,讓我們從頭開始。
WAP是最新的可支持WAP的第三代移動電話所使用的協議。很多人都認為:WAP將把internet帶入移動電話中去,這不完全正確;畢竟,現在我們還不能使用WAP來實現網上沖浪。WAP所能做到的無非是讓你檢索到和顯示為WAP電話而專門開發的特殊文件。這些文件是使用WML語言來編制的。
WML語言和html語言類似,盡管還有很多格式化操作例如:嵌套表,層,顏色,還有不一樣的打印字體等,這些還不能應用到WML中。但WML確實允許開發人員定義簡單的文本格式,如:圖像,鏈接,和文本輸入的字段。它之所以只有這麼簡單應用,關鍵原因在硬件上。因為現在的移動電話還不能先是如此豐富的格式化操作。現在的移動電話只是使用很少的像素顯示(大約是200*200),並且剛開始只能使大約4種灰色調,現在可以顯示彩色了。這時,就需要一個新的標記語言來做這種電話的軟件應用,因為,當前的HTML文件不能適合這樣的屏幕了。這就是WML.協議。
WAP設備是通過標准的URL( Uniform Resource Locator ,在Internet的WWW服務程序上用於指定信息位置的表示方法)來訪問的。當WAP設備的使用者在他的WAP移動電話或者是其他設備上輸入URL的時候,這台設備開始跟一個為它服務的WAP網關通過無線電波聯系。
一個這樣的網關通常會是由移動通訊設備操作人員的一台主機來代替,例如:MCIWorldCom或者是Sprint(截稿時,這兩家公司的合並正懸而未決,但股東們已經基本同意了)。這台網關計算機除了接收移動電話的請求,並通過HTTP協議把它轉到通常的INTERNET上去。在這裡,那些設備提供WEB服務,它響應這些請求,並且把相關的WML數據返回到這台網關計算機上。這時,這個網關計算機在把相應的WML文件返回到發出請求的移動電話,最終在WAP移動電話的使用者面前顯示這些文件。這就是整個通訊的全過程。
注:MCIWorldCom和Sprint都是美國著名的通訊公司,而在中國,是由中國移動通訊公司扮演該角色。
由於在INTERNET上使用HTTP協議來訪問WML文件,所以WAP技術不需要設備提供商提供特殊的軟件和硬件設備。一般的WEB服務,例如Apache和IIS(Microsoft Internet Information Server),都可以配置成適當的WML文件。而且,一個單一的WEB服務可以同時服務HTML和WML頁面,正如WEB服務可以服務於各種不同類型的文件,例如:gif,jpeg,zip等。然而,應當制定一個單獨的(虛擬的)WEB服務來為WAP服務,因為這樣能使的用戶更容易的記著那些URL.語言
---- WML是一種使用XML語法的語言。這意味著WML可以使用任何文本編輯器來寫,甚至可以使用Notepad。而且,WML類似於HTML,許多WML標識符,例如:< b >, < i >, < big >, 和< a >都和在HTML中有著幾乎完全相同的意義。以下代碼是一個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="welcome" title="Welcome to" newcontext="true"
ontimer="#login" >
< timer value="30"/ >
< p align="center" >
< big >MAs On-line< /big >< br/ >
< em >Order Query System< /em >
< /p >
< /card >
< /wml >
---- 以上是一個使用WML 1.1版本編程的例子
---- 有一點WML和HTML不一樣的地方是:在WML中一個文件不是像在HTML中叫做文件,而是叫做卡片組(deck),一個卡片組是有一個或者更多的卡片(card)組。WAP手機屏幕上一次只能顯示一張卡片,而且它僅僅能顯示幾行文本。
---- 現在的WAP手機一次只能處理小於1K字節的WML代碼。所以,用WML寫出來的代碼必須非常小。並且,由於在WAP手機屏幕上顯示的文本數量很有限,所以每一個WML代碼必須很短。
---- 如果一個WAP卡片上的數據不適合屏幕大小的話,用戶被迫滾動滾動條才能看清楚屏幕上的內容。現在最好的WAP手機不需要擴展的滾動條,與之相適應的是上面提供的都是小塊的信息。用戶現在可以在不同的窗口中通過前後翻屏的的操作浏覽網頁。
---- 浏覽時用戶可以使用一般的超文本鏈接,就像在WINDOWS中稱之為任務條的東西,它可以使用一些特殊的用WML標識符編寫的< do > 命令。
---- 例如,標識符< do type=accept > < prev/ > < /do > 將允許用戶在WAP設備中向後浏覽網頁。
---- 為了使用更為豐富的命令,而不僅僅是向前或者是向後浏覽網頁,WML可以被擴展成一種腳本語言,成為WMLScirpt. WMLScript就類似於在html世界中的JavaScirpt腳本。但是當然了,它的功能還很有限,但他仍然能夠滿足用戶的輸入,進行簡單的計算,或者設置WAP浏覽狀態等的要求。開發工具為幫助用戶實現WAP的解決方案,Nokia已經開發了一個基於java的wap 開發工具。它可以用來創建,測試,或者是調試wap設備。(請看下圖)
---- 一個wap開發工具模擬一個真正的wap手機和微型浏覽器。這個開發工具允許從磁盤或者是interner上載入任何類型的的wml 文件。當載入後,這個wap仿真系統處理該文件並將它顯示在屏幕上。這時,開發人員可以使用移動電話的按鈕來輸入文本,選擇選項和進行wap設備的定位。
---- 導航條可以通過使用書簽來實現,這是這個開發工具本來就支持的。事實上,書簽只是使得開發者的工作變得簡單化的一個簡單例子。例如:這個開發工具允許實時監視使用WML和WMLScirpt語言創建的各個變量。正如同在delphi中的watch窗口。雖然這個開發工具提供的功能非常有限,毫無疑問的,這個實時查看變量的功能使得開發者調試WML代碼更加容易。
---- 由於這個開發工具允許開發者在標准HTTP協議下載入任何類型的文件,所以說,這個仿真系統是一個相當棒的測試運行在一台WEB服務器上的交互式系統的工具。當然了,這些頁面都可以動態創建。DELPHI5通過內嵌的WebBroker技術來對構建web解決方案提供了很好的支持。通常, webbroker技術是用來創建動態的html解決方案,現在有很多流行的web服務器都采用。然而,由於它的靈活性,webbroker技術也可以用來創建WML。
---- DELPHI的解決方案
---- 又一個可提供下載的例程:是一個ISAPI的DLL程序。它可以在IIS3.0或者是更新的版本上運行,詳細介紹這個ISAPI 的DLLS的文件超出了本文的范圍,但是你可以在INTERNET上找到關於ISAPI的詳細信息。其中最好的源代碼是在 http://www.delphizine.com/include/Click_Redir.asp?Url=http://msdn.microsoft.com/. 上的Microsoft Developer Network (MSDN) 。需要查看調試ISAPI的DLLS的信息,請訪問: http://www.delphizine.com/features/ 2000/04/di200004jj_f/di200004jj_f.asp#SidebarOne 在其中查看工具條"Debugging ISAPI DLLs."
---- ISAPI DLLS的缺省返回的是一般的HTML代碼,它可以人工創建,也可以在DELPHI中的頁面處理控件使用。當然了,最大的優點是DELPHI允許它很容易的連接到數據庫,它可以查詢到插入到HTML代碼中的數據。我們的例程確實是這樣實現的,它查詢一個數據庫,創建一個包含信息的WML,並且將查詢的結果返回給用戶。直接的說,例程使用的是在DELPHI中的DBDEMOS數據庫別名。
---- 這個DBDEMOS數據庫允許訪問一個關於海上冒險的潛水設備轉售的虛擬用戶和訂單數據庫。這個例程允許WAP手機用戶來浏覽一個實時的給出的用戶的訂單信息。這個例程的名字叫:"海上冒險訂單在線查詢系統",或者簡稱為MAOOQS(關於下載的詳細信息,請看本文結尾的詳細細節) 。
---- 登錄到海上冒險程序
---- 當你想使用MAOOQS的時候,在你的WAP手機上(或者是在WAP的開發工具中)輸入http://myserver/login.wml,這時WML浏覽器交要的顯示一個"Welcome to" 屏幕,然後會出現一個登錄屏幕,"Welcome to" 和登錄卡的WML源代碼如下所示:
< card id="welcome" title="Welcome to" newcontext="true"
ontimer="#login" >
< timer value="30"/ >
< p align="center" >
< big >MAs On-line< /big >< br/ >
< em >Order Query System< /em >
< /p >
< /card >
< card id="login" title="Login" newcontext="true" >
< p >
< em >Enter your ID:< /em >< br/ >
< input name="custid" value="1221" maxlength="4"
format="*N" emptyok="false"/ >
< em >Enter your password:< /em >< br/ >
< input name="password" value="HI" maxlength="10"
format="*M" emptyok="true"/ >
< br/ >
< do type="accept" label="Login" >
< go method="post" href="/scripts/ma_ooqs.dll/login" >
< postfield name="custid" value="$(custid)"/ >
< postfield name="password" value="$(password)"/