用于WAP的標(biāo)記語(yǔ)言就是WML(Wireless Markup Language)。 WML的語(yǔ)法跟XML一樣,WML是XML的子集。 HTML、XML和WML的文件有很多相似之處,這樣網(wǎng)頁(yè)開(kāi)發(fā)者在過(guò)去10年中所學(xué)的東西今天依然適用。 WML頁(yè)面文件的后綴是 *.WML,就象HTML的 *.HTML后綴。 XML規(guī)定定義了一個(gè)規(guī)范的XML文件的規(guī)格。任何違反這個(gè)規(guī)定的WML文件會(huì)出錯(cuò)。WML文件通常使用XML解釋器起來(lái)解釋。 建立網(wǎng)頁(yè)制作環(huán)境 WML文件本身就是文本文件,所以編輯不成問(wèn)題,順手的編輯器都可以用。 當(dāng)然,由于目前的瀏覽器還都不能顯示W(wǎng)ML頁(yè)面,而我們又不能總在手機(jī)上進(jìn)行測(cè)試(速度太慢),所以需要模擬器?,F(xiàn)在象NOKIA、ERICSSON、MOTOROLA等手機(jī)制造商都生產(chǎn)了相應(yīng)的產(chǎn)品,你只要下載就行了。當(dāng)然除了模擬器以外,還需要圖形制作轉(zhuǎn)換器(用來(lái)制作WAP格式的圖形文件)、字符轉(zhuǎn)碼器(漢字=>UNICODE)等等,本站工具及論壇頁(yè)面均有說(shuō)明。 WML文件結(jié)構(gòu) WML的頁(yè)面通常叫做桌面(DECK),由一組互相鏈接的卡片(CARD)組成。當(dāng)移動(dòng)電話訪問(wèn)一個(gè)WML頁(yè)面的時(shí)候,頁(yè)面的所有CARD都會(huì)從WAP服務(wù)器下載到設(shè)備里。CARD之間的切換由電話內(nèi)置的計(jì)算機(jī)處理,不需要再到服務(wù)器上取信息了。CARD里可以包含文本、標(biāo)記、鏈接、輸入控制、任務(wù)(TASK)、圖像等等。CARD之間可以互相鏈接。 文檔的實(shí)體包含在wml>.../wml>標(biāo)記中,文檔里每個(gè)CARD又包含在card>.../card>標(biāo)記中,然后實(shí)際的文字段落則包含在p>.../p>標(biāo)記中。 簡(jiǎn)單例子:
顯示結(jié)果如下:
DECK里面各個(gè)組成部分的具體解釋在本教程的其他部分有說(shuō)明。 WML字符集 WML是XML的子集,繼承了XML的字符集設(shè)置。WML文檔缺省的字符集是UTF-8。 要顯示中文,有兩種辦法。最簡(jiǎn)單的辦法就是在文檔頭使用encoding,即把第一行改為:
然而令人喪氣的是,這種方法有些手機(jī)和模擬器并不支持(將來(lái)會(huì)的),所以目前第2種方法更普遍:不改變字符集設(shè)置,但是在寫(xiě)中文的時(shí)候采用UNICODE代表中文字符,如:
代表:
WML元素:標(biāo)記(Tag)和屬性 WML的主要內(nèi)容是文本,由于標(biāo)記會(huì)降低與手持設(shè)備的通訊速度,所以WML標(biāo)準(zhǔn)里僅僅使用了很少一部分。用于表格和圖像的的標(biāo)記幾乎都被排除了。 與XML一樣,在WML語(yǔ)言中,所有元素都放在符號(hào)"" 和 ">"中,并且包含一個(gè)開(kāi)始標(biāo)志、一個(gè)結(jié)束標(biāo)志和一個(gè)內(nèi)容標(biāo)志,或者使用自身結(jié)束的控制標(biāo)記。就象這樣:
WML同樣支持在標(biāo)志中標(biāo)出屬性。屬性是標(biāo)志的附加信息,與元素的內(nèi)容不一樣,它并不在屏幕上顯示出來(lái)。屬性通常在元素的開(kāi)始標(biāo)志后指定。如上面最后一個(gè)例子。 由于WML是XML的一種應(yīng)用,因此所有的WML標(biāo)記和屬性都是大小寫(xiě)敏感的(wml>跟WML>完全不同),而且所有的標(biāo)記都必須正確地結(jié)束。WML要求屬性的值必須放在雙引號(hào)或單引號(hào)內(nèi)。單引號(hào)可放在屬性標(biāo)志內(nèi)或雙引號(hào)內(nèi)。字符亦可作為屬性的值。
這些注釋在瀏覽器中并不顯示出來(lái)。 WML不支持嵌套元素注釋。 鏈接(URL) WML外部引用方式跟HTML相同
內(nèi)部引用,如果next是當(dāng)前DECK中的一個(gè)CARD時(shí),可以用這種方式:
提供鏈接功能的WML元素有2個(gè):go>(參見(jiàn)任務(wù))和anchor>(參見(jiàn)事件)。
瀏覽器窗口將顯示如下內(nèi)容:
| |||||||||||
有了上面的基礎(chǔ),相信大家已經(jīng)能夠做不少事情了。現(xiàn)在我們來(lái)深入一下,看看如何提高性能和網(wǎng)絡(luò)傳輸效率。首先,需要介紹一下http 1.1(RFC2616)的基礎(chǔ)知識(shí)。當(dāng)然,如果你已經(jīng)很熟悉了,可以跳過(guò)第一部分。 一、HTTP 1.1的簡(jiǎn)要介紹 HTTP 1.1是一個(gè)基于文本的互聯(lián)網(wǎng)實(shí)體信息交互主流協(xié)議,這里的實(shí)體可以是WAP兼容瀏覽器之類(lèi)的用戶終端,可以是WAP網(wǎng)關(guān)之類(lèi)的代理服務(wù)器,也可以是Java servlet之類(lèi)的源服務(wù)器程序。它們之間的交互信息就是兩大類(lèi):客戶端對(duì)服務(wù)器端的請(qǐng)求(request)和服務(wù)器端對(duì)客戶端的響應(yīng)(response)。一次完整的交互包括一個(gè)請(qǐng)求和對(duì)它的響應(yīng)。 所有的請(qǐng)求和響應(yīng)都采用[RFC822]中定義的標(biāo)準(zhǔn)互聯(lián)網(wǎng)消息格式,框架如下: * 消息定義 * 沒(méi)有或多個(gè)消息頭 * CRLF(空行回車(chē)) * 可選的消息本體 其中消息定義不分指定了發(fā)送消息的類(lèi)型。請(qǐng)求和響應(yīng)都可以包含多個(gè)消息頭,用來(lái)進(jìn)一步或者重新定義用戶終端和服務(wù)器之間的交互。CRLF僅僅用來(lái)將信息定義和消息本體分開(kāi)。 1、請(qǐng)求 在消息定義部分可以這樣定義請(qǐng)求: 請(qǐng)求類(lèi)型 URL HTTP/1.1 其中請(qǐng)求類(lèi)型可以是下面的一種: ①. OPTION:返回請(qǐng)求者和相應(yīng)者之間可以使用的通信選項(xiàng),主要用來(lái)檢測(cè)服務(wù)器處理能力; ?、? GET:獲得以URL標(biāo)示的文件內(nèi)容或者程序執(zhí)行結(jié)果。服務(wù)器根據(jù)文件名后綴判斷服務(wù)內(nèi)容,比如該URL是靜態(tài)文本還是一個(gè)程序; ?、? HEAD:除了不返回響應(yīng)的信息本體以外,得到的是跟GET一樣的信息。一般用來(lái)測(cè)試鏈接的有效性、可達(dá)性和近期修改; ?、? POST:把消息本體中的消息發(fā)送到一個(gè)URL或者其他類(lèi)似的服務(wù)器端定義行為。通常用來(lái)提交一個(gè)HTML表單或者一些數(shù)據(jù)操作活動(dòng); ⑤. PUT:把消息本體中的消息發(fā)送到一個(gè)URL,跟POST類(lèi)似,但不常用; ⑥. DELETE:刪除URL指定的資源; ⑦. TRACE:調(diào)用一個(gè)遠(yuǎn)程應(yīng)用層請(qǐng)求消息回路。發(fā)出這個(gè)消息的用戶終端除了收到原來(lái)的消息內(nèi)容以外,還得到消息在Internet上的傳送路徑。 最常用的請(qǐng)求類(lèi)型--也是我們?cè)谔幚鞼AP應(yīng)用時(shí)最關(guān)心的--是GET和POST。假設(shè)有一個(gè)WML文檔,我們用UP的瀏覽器去瀏覽的話,就會(huì)向服務(wù)器發(fā)出如下GET請(qǐng)求: GET www.itsalon.com/wap/index.wml HTTP/1.1 accept-charset: UTF-8 accept-language: ch accept: text/vnd.wap.wml, */*, image/bmp, text/html user-agent: UP.Browser/3.1-UPG1 UP.Link/3.2 host: www.itsalon.net …… 其中粗體的部分是HTTP消息頭,這里我們忽略了一些與我們關(guān)系不大的消息頭。 accept-charset: 用戶終端支持的字符集 accept-language: 用戶終端目前使用的語(yǔ)言 accept: 用戶終端可以接受的MIME文件類(lèi)型 user-agent: 用戶終端供應(yīng)商提供的終端描述信息 host: 請(qǐng)求信息發(fā)送到的域名 2、響應(yīng) 響應(yīng)的消息定義部分一般是這樣的:HTTP/1.1 狀態(tài)碼狀態(tài)描述在[RFC2616]中定義了近40種不同的狀態(tài)碼(分成5組)。其中最常見(jiàn)的是3個(gè): 200 OK 401 Unauthorized 404 Not Found 繼續(xù)上面那個(gè)例子,如果該URL合法的話,服務(wù)器的響應(yīng)會(huì)是這樣的: HTTP/1.1 200 OK Server: www/5.0 Date: Fri, 26 Oct 2000 12:15:23 GMT Connection: Keep-Alive Content-Length: 1211 Content_Type: text/vnd.wap.wml Last-Modified: Mon, 22 Oct 2000 18:19:24 GMT ?xml version=”1.0”> !!DOCTYPE wml PUBLIC “-//WAPFORUM//DTD WML 1.1//EN” “http://www.wapforum.org/DTD/wml_1.1.xml”> …… 其它內(nèi)容 …… 這個(gè)響應(yīng)信息里包括了響應(yīng)的數(shù)字代碼和文本描述,然后是一組消息頭。在一個(gè)換行符以后就是消息本體,在這里,消息本體就是www.itsalon.net/index.wml的源代碼。 Server: 發(fā)出響應(yīng)的服務(wù)器 Date: 響應(yīng)發(fā)出的時(shí)間 Connection: 指示用戶終端保持連接 Content-Length: 響應(yīng)信息的長(zhǎng)度,從DECK的第一個(gè)""字符開(kāi)始計(jì)算 Content_Type: 響應(yīng)的MIME類(lèi)型 Last-Modified: 響應(yīng)中DECK的最后修改時(shí)間 當(dāng)用戶終端接收到響應(yīng)以后,會(huì)對(duì)其狀態(tài)信息和消息頭進(jìn)行解碼,然后決定對(duì)響應(yīng)做出什么樣的動(dòng)作。如果收到OK響應(yīng),一般會(huì)把消息本體里的內(nèi)容顯示在屏幕上。對(duì)于桌面終端,通常是HTML,對(duì)于WAP瀏覽器,則是WML。 HTTP是一種很煩瑣的協(xié)議。即使是簡(jiǎn)單沒(méi)有任何數(shù)據(jù)的請(qǐng)求和響應(yīng)都要產(chǎn)生數(shù)百字節(jié)的消息。WAP通過(guò)WAP網(wǎng)關(guān)來(lái)解決這個(gè)問(wèn)題。WAP網(wǎng)關(guān)一個(gè)很重要的功能就是把所有的HTTP1.1消息轉(zhuǎn)換成無(wú)線任務(wù)協(xié)議(Wireless Session Protocol, WSP)的消息格式。這種格式是壓縮的二進(jìn)制協(xié)議,兼容HTTP1.1。它能解析所有的請(qǐng)求和響應(yīng)消息,并轉(zhuǎn)換成最精簡(jiǎn)的BIT序列。 到這里我們已經(jīng)介紹了HTTP1.1的主要內(nèi)容。當(dāng)然HTTP1.1還有很多復(fù)雜的內(nèi)容,但是在這里并不打算多講,如果你有興趣,可以去相關(guān)網(wǎng)站查找它的資料。作者只想大家知道一點(diǎn):用戶終端和服務(wù)器之間還有比GET和POST請(qǐng)求更多的互動(dòng)消息,它們一樣有請(qǐng)求和響應(yīng)消息頭,并且可以包含一些信號(hào)來(lái)影響WAP應(yīng)用程序的執(zhí)行和性能。這正是提高WAP運(yùn)行效率的秘密所在。 二、緩存(Caching) 根據(jù)[RFC2616]的定義,緩存是:"程序中響應(yīng)消息的本地儲(chǔ)存區(qū)以及控制這些消息儲(chǔ)存、重新獲取和刪除的子系統(tǒng)。緩存保存可以緩存的響應(yīng)消息以便降低將來(lái)的響應(yīng)時(shí)間和網(wǎng)絡(luò)帶寬消耗,同樣也適用于請(qǐng)求消息。" 由于WAP信道帶寬的限制,我們?cè)诰帉?xiě)WAP應(yīng)用的時(shí)候都希望最大限度地減少消息的傳送量。要做到這一點(diǎn),就要盡量地使用緩存,經(jīng)常地從緩存中獲得以前的消息。幸運(yùn)的是目前大多數(shù)WAP設(shè)備都有一定級(jí)別的緩存,在默認(rèn)情況下,會(huì)嘗試最大化的緩存。幾乎所有指向URL的響應(yīng)都會(huì)被緩存下來(lái)。 當(dāng)WAP用戶終端緩存一個(gè)響應(yīng)的時(shí)候,會(huì)保存幾乎所有的信息:URL、響應(yīng)文本、消息頭以及其他可以驗(yàn)證響應(yīng)的內(nèi)容(參看下一節(jié)"驗(yàn)證和歷史堆棧")。每個(gè)被緩存的項(xiàng)目都可以根據(jù)它的URL組成部分(域名、路徑、協(xié)議、參數(shù)、端口等等)唯一的識(shí)別。 有兩種HTTP消息頭可以讓你控制WML的DECK緩存,對(duì)我們最重要的是Cache-Control消息頭。它能夠直接通過(guò)請(qǐng)求/響應(yīng)鏈來(lái)控制所有的緩存實(shí)體。所有的緩存機(jī)制都必須遵守這些消息頭的定義。Cach-Control消息頭通常用來(lái)屏蔽一個(gè)設(shè)備的默認(rèn)緩存行為。他們?cè)谙㈡溨袀鬟f時(shí)必須直接穿過(guò)所有的代理服務(wù)器和網(wǎng)關(guān)而不被改變。 * Cache-Control: no-cache。設(shè)定這個(gè)選項(xiàng)的URL不能被緩存,包括用戶終端和所有處于內(nèi)容服務(wù)器和用戶終端之間的其他服務(wù)器; * Cache-Control: max-age=second> * Expired:date> 在寫(xiě)一個(gè)WAP應(yīng)用的時(shí)候,你要先假設(shè)用戶終端會(huì)盡量最大化緩存以便使向內(nèi)容服務(wù)器獲取信息的動(dòng)作減少到最少。下面做些解釋?zhuān)? 1、永久緩存URL WAP用戶終端通常會(huì)盡量長(zhǎng)地在它的緩存中保存存取過(guò)的URL,這個(gè)"盡量長(zhǎng)"在Phone.com瀏覽器中的定義是大約30天。不過(guò),也許你會(huì)想把一個(gè)URL的緩存時(shí)間盡量延長(zhǎng),比如你公司的LOGO,這樣每次打開(kāi)頁(yè)面的時(shí)間就會(huì)減少。用下面兩種方法能夠很簡(jiǎn)單地實(shí)現(xiàn): * 指定一個(gè)離現(xiàn)在很遠(yuǎn)的過(guò)期日,比如:Expires: Tue, 01 Jan 2002 00:00:00 GMT; * 指定一個(gè)很大的緩存時(shí)間,如:Cache-Control: max-age=3153600。這個(gè)例子可以讓URL緩存一年。用戶終端允許的最大整數(shù)是2,147,483,647,所以你可以讓一個(gè)URL保存超過(guò)68年之久。當(dāng)然,到那個(gè)時(shí)候,你的手機(jī)早就那報(bào)廢了。 2、指定對(duì)URL的緩存時(shí)間 通常的情況是對(duì)一個(gè)URL你只需要緩存一段時(shí)間。比如股票報(bào)價(jià)系統(tǒng),網(wǎng)頁(yè)可能需要5分鐘更新一次,那么你只要在DECK的HEAD部分指定Cache-Control: max-age=300就行了。 如果用戶在5分鐘以內(nèi)再次檢索該頁(yè)面,看到的還是緩存里的網(wǎng)頁(yè)。如果在5分鐘以后,就會(huì)到服務(wù)器上獲取最新的數(shù)據(jù)。 另外一種控制緩存時(shí)間的方法是使用前面提到過(guò)的Expires,不過(guò)這種方法只能告訴用戶終端:只要過(guò)了指定時(shí)間,無(wú)論什么時(shí)候訪問(wèn)頁(yè)面都要刷新。如果你下次要控制時(shí)間,只能改變Expires里的時(shí)間值。 3、禁止對(duì)URL的緩存 對(duì)于快速變化的內(nèi)容,一般都會(huì)希望每次都得到最新的數(shù)據(jù)。所以這個(gè)時(shí)候要完全禁止對(duì)相關(guān)網(wǎng)頁(yè)的緩存。方法有三種: * 設(shè)定Cache-Control: no-cache; * 設(shè)定最大緩存時(shí)間為0,Cache-Control: max-age=0; * 設(shè)定緩存到期日為一個(gè)早就過(guò)去的日期,Expires: Mon, 1 Jan 1990 00:00:00 GMT。 實(shí)際上,后兩種不是最好的選擇。首先這樣會(huì)多占用終端的處理時(shí)間,因?yàn)楫?dāng)碰到這個(gè)DECK時(shí),終端需要計(jì)算一下過(guò)期時(shí)間。其次,這樣會(huì)多占用一些字節(jié),而且在表達(dá)上也不夠清楚。 三、驗(yàn)證(validation)和歷史堆棧(History Stack) 在HTTP1.1中對(duì)緩存進(jìn)一步提出了驗(yàn)證的概念。驗(yàn)證的目的就是檢驗(yàn)緩存項(xiàng)目是否在有效期內(nèi)。由于歷史堆棧的存在,WAP終端上的驗(yàn)證過(guò)程變得有點(diǎn)復(fù)雜。 WAP標(biāo)準(zhǔn)規(guī)定所有的WAP設(shè)備都至少要有可以容納10-個(gè)項(xiàng)目的歷史堆棧。當(dāng)用戶按下由go> 一般情況下,所有的前行鏈接都會(huì)被驗(yàn)證,而后退鏈接則不會(huì),因?yàn)樗呀?jīng)在cache里了。可是我們有時(shí)候還是希望當(dāng)用戶按下后退鍵時(shí)依然能夠得到最新的數(shù)據(jù)。如果終端總是不予驗(yàn)證的話,那用戶只好找到主菜單再重新進(jìn)入那個(gè)頁(yè)面。 幸運(yùn)的是,我們用Cache-Control:must-revalidate就可以強(qiáng)迫用戶終端在用戶按back時(shí)對(duì)URL進(jìn)行驗(yàn)證。當(dāng)然,進(jìn)行驗(yàn)證并不是說(shuō)該頁(yè)面會(huì)立刻重新讀取,而是根據(jù)他是否過(guò)期來(lái)決定。如果沒(méi)有過(guò)期,驗(yàn)證的結(jié)果仍然是顯示緩存中的頁(yè)面。 如果你需要每次back都重新讀取頁(yè)面,用Cache-Control:must-revalidate, no-cache可以實(shí)現(xiàn)。另外,把 no-cache換成max-age=300就可以在back時(shí)對(duì)已緩存了300秒的頁(yè)面進(jìn)行刷新。 四、HTTP頭與meta元素 到這里,大家已經(jīng)知道HTTP消息頭的在WAP頁(yè)面的作用了。不過(guò)要在WML文檔里設(shè)置這些消息頭,就要用到meta元素,它只能出現(xiàn)在WML文檔head>段里。下面是幾個(gè)消息頭和它們的表示形式: Expires: Mon, 10 Jan 2000 00:00:00 GMT Cache-Control: max-age=300 Cache-Control: no-cache meta http-equive="Expires" content=" Mon, 10 Jan 2000 00:00:00 GMT"/> meta http-equive="Cache-Control" content="max-age=300"/> meta http-equive="Cache-Control" content="no-cache"/> 當(dāng)網(wǎng)關(guān)在WML文檔中掃描到元素時(shí),就會(huì)把它們轉(zhuǎn)換成WSP等效的HTTP消息頭,然后用戶終端就可以據(jù)此對(duì)緩存進(jìn)行控制了。 |
標(biāo)簽:西雙版納 拉薩 宿遷 寧夏 德州 黃石 果洛 益陽(yáng)
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《WML語(yǔ)言的基本情況》,本文關(guān)鍵詞 WML,語(yǔ)言,的,基本情況,WML,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。