學習自然語言的最好方法就是溶入相應的語言環境在交流中學習,學習一種編程語言的最好方法就是看例程。為了幫助大家建立WML應用的第一印象,所以請大家先看第一個例子:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<template>
<do type="prev" label="back">
<prev/>
<!--provide a button you can clink to back a step-->
</do>
</template>
<card id="friends" title="Hot link">
<p>
<a >Sina WAP</a><br/>
<a href="#nextcard">Next Card</a>
</p>
</card>
<card id="nextcard">
<p>
this is the second card.
</p>
</card>
</wml>
通過以上示例大家應該了解到以下內容:
1、語法:WML的語法與HTML相似,仍然是一種標記語言,而且延續了xML語法規則
2、元素:在XML和WML 語言中,語言的基本元素稱之為"標簽"
標簽必須被 < 和 > 括起來。
大多數標簽都包括"起""止"兩部分,例如:<p>…</p>
某些特殊標簽可以只有一個標簽,但是必須有結束標記,例如:<prev/>
3、屬性:XML語言的標簽可以包含很多屬性,給標簽提供必要的附加信息
屬性內容通常在起始標簽內使用
屬性只作為參數為標簽提供必要的信息,不會被瀏覽器顯示
屬性的值需要被引號括起來,可以是單引號或者雙引號,引號可以成對嵌套使用
例如:<card id="friends" title="Hot link">
4、注釋
注釋內容是方便制作者閱讀源代碼,不會被瀏覽器顯示
WML不支持注釋嵌套
例如:<!-- This is a comment. -->
5、文檔結構
WML文檔是由Card和Deck構成的,一個Deck是一個或多個Card的集合。在得到客戶終端的請求之后,WML從網絡上把Deck發送到客戶的瀏覽器,訪問者可以瀏覽Deck內包含的所有Card,而不必從網上單獨下載每一個Card。
其他一些示例中沒有涉及到的基本內容:
6、大小寫敏感
無論是標簽元素還是屬性內容都是大小寫敏感的,這一點繼承了XML的嚴格特性,任何大小寫錯誤都可能導致訪問錯誤,這是WML制作者必須注意的問題。
7、躲避語法檢查的方法-CDATA
CDATA內的數據內容都會被當作文本來處理,從而避開語法檢查,直接作為文本顯示。
示例:
< ! [ CDATA [ this ia <b> a test ] ] >
顯示結果為
this ia <b> a test
8、定義變量
WML可以使用變量供瀏覽器和Script使用,通過在Deck中的一個Card上設置變量,其他Card不必重新設置就可以直接調用。
變量的語法如下:
$identifier
$(identifier)
$(identifier:conversion)
如果變量內容包含空格就需要用圓括號括起來。由于變量在語法中有最高的優先級,包含變量聲明字符的字符串會被當作變量對待,所以如果要顯示$,就一定要連續使用兩個$。
示例:
<p> Your account has $$15.00 in it.</p>
顯示結果為:Your account has $15.00 in it
XML是一種語法非常嚴格的語言,WML也繼承了這種規則,任何地不規范語法都會導致錯誤。
WML文件的概念WML Decks
這里簡單介紹一個關于WML文件的概念,其他的細節問題會在后面的章節還詳細介紹。
聲明
由于WML語言繼承于XML,所以一個有效的WML文檔必須包含一個XML聲明和一個文件類型聲明。
以下就是一個最常用的聲明,由于WML語法要求非常嚴格,為了避免出錯,制作者可以直接拷貝粘貼到制作文檔。
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml">
注:<?xml version="1.0"?> 語句必須出現在一個Deck的首行,而且必須頂頭寫,插入任何字符哪怕是空格都會造成語法錯誤。
主體結構
這是一個最簡單的WML文件:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.com/DTD/wml_1.1.xml">
<wml>
<card title="sample">
<p>Hello WAP!</p>
</card>
</wml>
任務與導航-賦值與數據交換
這一部分簡單講解WML的變量賦值和數據提交方法,在后面的章節中有專門講解。
變量賦值(Setvar)
Setvar給瀏覽器的當前頁面內變量賦值,該變量可以在當前Dock中的任意Card中調用。
相關屬性:
1. name 變量名,作為訪問變量的標識
示例:<setvar name=$bogus value=$bear>
2. value變量的值
數據交換(Postfield)
Postfield通過URL申請與CGI交換數據。
相關屬性:
name & value 交換參數用的變量的名字和值。
示例:<postfield name=$bogus value=$bear>
一個綜合應用的例子
示例:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml">
<wml>
<card id="Start" title="Sina WAP">
<do type="accept">
<setvar name="MyCGI" value="/cgi-bin/count.pl">
<go href="$MyCGI" method="post">
<postfield name="one" value="one one"/>
<postfield name="two" value="two two"/>
</go>
</do>
<p>Hello World!</p>
</card>
</wml>
上例相當于產生一個count.pl?one="one one"&two="two two"的Post申請。
跳轉和傳遞參數
go的基本屬性和應用
實現Card之間跳轉的一個基本方法是go,go和do、anchor等標簽的結合是WML高級應用的一個基礎。
相關屬性:
href:聲明鏈接的URL
sendreferer:表示是否傳遞調用href所指定的URL的頁面的URL,也就是當前頁的URL,即HTTP頭中的HTTP_REFERER,默認值為false,可選值為true
method:WML的method與HTTP提交表單的方法類似,同樣有Post和Get兩種,缺省參數為Get。
Post與Get的不同:Post在發送前要進行編碼處理,然后分組發送,發送過程相對安全,適合大數據量的處理;而Get方法不進行任何處理,一次性發出,適合小數據量交換。除非你肯定你提交的數據可以一次性提交,否則請盡量用Post方法。
accept-charset:定義瀏覽器與服務器之間收發信息的字符集類型,例如:accept-charset="UTF-8,US-ASCII,ISO-8859-1"。
示例:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml">
<wml>
<card id="Start">
<do type="accept" label="next">
<go href="#nextCard"/>
</do>
<p>This is the First Card!</p>
</card>
<card id="nextCard">
<do type="prev" label="before">
<prev/>
</do>
<p>This is the last card!</p>
</card>
</wml>
Go結合Postfield交換參數
標簽Go可以包含一個或多個Postfield標簽,用這些標簽攜帶參數與服務器進行數據交換。
示例1:產生一個"quote.pl?stock=00001"Get申請
<go href="/cgi-bin/quote.pl">
<postfield name="stock" value="00001"/>
</go>
示例2:產生一個"stockname=證券&page=1"Post申請
<go href="/cgi-bin/query.pl" method="post">
<postfield name="stockname" value="證券"/>
<postfield name="page" value="1"/>
</go>
?
任務和任務屏蔽
內部任務
返回<prev>
用來將當前頁面的URL壓入URL歷史堆棧,并打開此前的URL,若該URL不存在,則<prev>無效。語法類似<go>,<prev>和</prev>之間可加入一句或多句<setvar name="name" value="value"/>,若不加,則必須以<prev/>的形式出現。
刷新<refresh>
用來刷新當前的頁面,從而使得頁面內的變量刷新或置空,語法與prev相同。<refresh> <setvar name="name" value="value"/> </refresh>,或<refresh/>。
無動作<noop>
表示什么也不做,該標簽不能用在<anchor>中,一般用在覆蓋DECK級的<do>。
任務屏蔽(Task Shadowing)
WML的Task有兩個級別,Deck級和Card級。通常人們還習慣把設置在某些條件中的任務成為第三級,在這里先不討論,后面有專門的描述。
Deck Level:把通用的Task設置在template中,這個Deck中所有的Card都自動繼承并使用這些task。
Card Level:只在當前的Card中有效,并替換掉Deck Level的相同屬性的Task。
示例:
<wml>
<template>
<do type="options" name="general" label="Back">
<prev/>
</do>
</template>
<!-- a deck level task-->
<card id="Card1">
<p>Hello , this is a test <br/>
<a href="#card2">the second</a>
<p>
</card>
<card id="Card2">
<!-- This Card override the deck level task by noop -->
<do name="general" type="options" label="none">
<noop/>
</do>
<p>nothing happend here</p>
</card>
</wml>
動作和鏈接
設置動作(Do)
Do是WML語言中最有有價值的元素之一,它給用戶提供一種在當前Card上進行"動作"的通用方法。這種動作通常被定位在用戶終端界面的特定部件上,例如WAP手機的功能鍵(Cancel,Option,Accept),特定的圖標,語音識別功能等等。Do可以設置在Deck的Template上或者Card上,當他們重名的時候Card上的Do會覆蓋Template上的同名元素(參看任務屏蔽說明)。
屬性列表:
type:訴瀏覽器動作的意圖。
WML總共聲明了9個類型的動作,最常用的動作類型是"accept"和"option"。
1.1 accept,接受、確認
1.2 prev,返回上一個歷史堆棧中的URL
1.3 help,請求幫助
1.4 reset,清除或者重置狀態
1.5 options,根據當前頁面的功能設置選項。
1.6 delete,刪除選擇條目
1.7 unknow,相當于空白字串
1.8 還有兩個屬性還沒有最后確定。
label:設置按鈕標題,顯示在瀏覽器定義好的屏幕位置,不同瀏覽器地顯示位置不同。如果不設置標題,按鈕會按照瀏覽器的缺省格式顯示,不同瀏覽器的缺省格式不同。
name:按鈕名稱,可以用Card級的動作覆蓋template上的同名動作,重新賦予那些動作新的任務。
optional:來定義一個按鈕是否顯示,設置為True時會被瀏覽器忽略
示例:
<do type="accept" label="Accept" name="accept1" optional="false">
{Content}
</do>
鏈接(Anchor)
archor是WML定義鏈接的基礎方式,與其他標簽結合可以滿足很多應用,anchor必須與go結合。
相關屬性:
title 鏈接的文本顯示內容。
示例:
<anchor title="Click"> click me <go href="#clickedMe"/> </anchor>
簡化的鏈接形式(a)
a是anchor的簡化形式,不需要Go語句配合。為了提高效率,推薦使用<a>。
相關屬性:
1. href 超級鏈接的目標Url
示例:
<a href="#clickedMe">click me</a>
?
WML的事件
內部事件(Onevent)
相關屬性:
type:內部事件的觸發條件,當前瀏覽器狀態滿足觸發條件時,瀏覽器就會觸發這個條件下設置的Task,內部事件總共有4種觸發條件。
1 ontimer 滿足時鐘設置的條件時,該條件成立。關于時鐘設置問題,后面還有專門的說明。
2 onenterbackward 通過Prev或其他外部命令返回到當前Card,該條件成立。
3 onenterforward 當瀏覽器通過鏈接進入當前Card,該條件成立
4 onpick 在使用Option控件列表的時候,任何點擊控件的行為都會觸發本事件,包括選擇和去掉選擇。
示例:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml">
<wml>
<!-- this deck can't use in Ericsson r320sc ,because r320sc haven't accept button-->
<card id="start">
<do type="accept" label="next">
<go href="#two"/>
</do>
<p>This is the first card.</p>
</card>
<card id="two">
<do type="accept" label="next">
<go href="#three"/>
</do>
<onevent type="onenterbackward">
<go href="#temp"/>
</onevent>
<p>This is the second card.</p>
</card>
<card id="three">
<do type="accept" label="back">
<prev/>
</do>
<p>This is the thired card.</p>
</card>
<card id="temp">
<do type="accept" label="start">
<go href="#first"/>
</do>
<p>haha, you are lost!</p>
</wml>
WML文檔結構祥解
1、聲明(Prologue)
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml">
2、元素(Element)
WML首先定義一個Deck,然后在Deck內封裝信息和Card。
3、文件頭(Head Element)
頭信息包含與Deck有關的信息,包括meta數據和控制元素。
3.1、訪問權限設置(Access)
該元素用于設置有訪問當前Deck權限的列表。如果Deck內不包含Access Element信息,該Deck下的Access Element處于無效狀態,其他所有的Deck都可以訪問該Deck。
相關屬性:
domain:假如設置 <access domain="sina.com.cn"/> 那么 http://www.sina.com.cn/ 將有訪問權限, 而 http://www.sino.com.cn/ 和 http://www.sina.net.cn/ 就沒有.
path:工作原理與Domain非常相似,例如設置<access path="/internal"/> 那么"/internal/wml" 將獲得訪問權限,而"/internal-wml"就沒有。
示例:
做如下設置 <access domain="sina.com.cn" path="/wap"/>
那么以下幾個Url具有訪問權限:
http://www.sina.com.cn/wap/goto.cgi
http://www.sina.com.cn/wap/index.wml
http://www.sina.com.cn/wap/cgi-bin/create_report.cgi?name=123&pwd=234
以下的幾個Url沒有訪問權限:
http://www.sina.com/wap/getuid.cgi
http://www.sina.com.cn/internal/wap/getuid.cgi
3.2、頭元素設置(Meta)
<meta 屬性 content="值" scheme="格式" forua="true|false"/>和HTML中的類似,提供了該DECK的meta信息。
例如:<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
content屬性是必選的,其內容根據屬性而定。scheme屬性目前尚不支持。forua為可選屬性,指定在該wml文件傳到客戶端之前,<meta>標簽是不是被中間代理刪除(因為傳輸的協議可能改變),默認值為false。
目前支持的meta數據:
<meta http-equiv="Cache-Control" content="max-age=0"/>指定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"/>。
4、模板(Template)
為了節省資源,可以把每個Card中都要用到的Task設置在模板中,供當前Deck中所有Card使用,加入個別Card不需要該模板內容,可以Override掉它(詳見任務屏蔽)。
5、卡片(Card)
適用事件
以下事件適用于Card和Template,參見前面的相關說明。
1. onenterbackward
2. onenterforward
3. ontimer
卡片屬性(Card)
id:同一Deck內Card的唯一標識,可以作為標簽被使用。(#nextcard).
title:卡片標題。不同的瀏覽器處理標題處理title的原則不一樣,有的瀏覽器會顯示標題,如果當前卡片沒有設置標題,當前卡片的URL會被顯示在標題位置。有些瀏覽器為了節省顯示區域會忽略標題。
newcontext:默認值為false,用來指示當跳轉到本CARD時,手機是不是要清除以前保留的信息,包括變量,堆棧里的歷史記錄,重新設置手機狀態等。
ordered 布爾變量,聲明Card是否有序。通常可以用來開發自動播放的幻燈片效果。
示例:
<?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 domain="sina.com.cn" path="/wap"/>
</head>
<template>
<do type="accept" name="accept1" label="OK">
<go href="#accept"/>
</do>
</template>
<card id="start" title="Start Here">
<p> Start Here. </p>
</card>
<card id="accept" title="Okay Card">
<do type="accept" name="accept1" label="Okay">
<go href="#accept2"/>
<!-- override the same task in template-->
</do>
<p> Card Accept </p>
</card>
<card id="accept2" title="OK Card" >
<do type="accept" >
<go href="#start" />
</do>
<p> Card Accept2 </p>
</card>
</wml>
Select List 控件
對表單的控制能力可以證明一個HTML設計者是否夠專業,而且很多交互功能也必須依賴表單。WML沒有表單屬性,但是WML可以直接使用控件,同樣可以達到使用表單的效果。因此,使用控件的水平可以體現一個WML設計者的制作水平。
WML控件有Select List和Input Box兩個系列,每個系列另外包含幾個子系列,基本可以滿足表單設計的需求。
選擇列表控件(Select List)
Select有兩對很重要也很容易混淆的屬性:name, value , iname , ivalue。這四個屬性的區別和用途不太容易描述清除,看了后面的例子會很容易理解。
每個Select是一個或多個Option的集合,Option地結果返回給Select元素的name和iname。
示例:
<select name="name" iname="iname value="value" ivalue="ivalue">
<option value="S">sina</option>
<option value="Y">yahoo</option>
</select>
相關屬性:
1. multiple 這個布爾變量的值決定是否允許多重選擇,值為True時Select控件允許復選,否則相反。
2. name & Value 這一組變量的主要作用是獲取于該option的返回值,value提供name的缺省值。
3. iname & ivalue 與上一組參數功能相似,不同的是ivalue返回有效Option的序列號。被選中的控件用它的序號表示,0代表沒有option被選中,假如第二個和第三個同時被選中就表示為 2;3
4. title 作為標題參數提供給瀏覽器,但是不同的瀏覽器處理方式有所不同,有些瀏覽器直接顯示選項內容不顯示標題,有的瀏覽器顯示標題,按選擇鍵進入選擇界面。
5. tabindex 提供給瀏覽器的控件序號參數。
2、選項控件
Option只有包含在Select內才有意義,無法單獨使用。
相關屬性:
1. value Option的返回值,假如當前Option被選擇,這個Value的值會被傳送到Select元素的Name變量。
2. title 供瀏覽器顯示的選項標題。
3. onpick 如果當前Option被點選,瀏覽器跳轉到指定的Url。
示例1:
<card>
<p>Please choice your favourite Web.<br/>
<select name="X">
<option value="S">sina</option>
<option value="Y">yahoo</option>
</select>
<p>
</card>
上例是一個基本的單選列表,選擇的結果被賦值給X。
示例2:
<card>
<p>Please choice all your favourite Web.<br/>
<select name="X" iname="I" ivalue="1;3" multiple="true">
<option value="S">sina</option>
<option value="Y">yahoo</option>
<option value="N">netease</option>
</select>
<p>
</card>
上例是一個使用了iname和ivalue的多選列表,I被預置為 1;3 。假如用戶選擇了sina和yahoo,X被賦值為 S;Y,I被賦值為 1;2。假如用戶不做任何選擇,I等于1;3,X內容為空。
示例3:
<card>
<p>Jump to your favourite Web.<br/>
<select>
<option onpick="http://wap.sina.com.cn">sina</option>
<option onpick="http://wap.chnmobile.net">china mobile</option>
</select>
<p>
</card>
上例演示了Option的onpick功能,不管Option的狀態如何,只要它被點選,瀏覽器就會跳轉到指定的Url。
示例四:
<card>
<p>Please choice your favourite Web.<br/>
<select name="X">
<option value="S">sina</option>
<option value="Y">yahoo</option>
<option value="S;Y">both</option>
</select>
<p>
</card>
上例演示了一個通過單選功能完成多選需求的示例。
分組選擇控件(Optgroup)和復雜實例
相關Option分組產生層級,對最終用戶來說可能沒有什么意義,但是對于制作者來說,Option分組可以提供很多方便。
相關屬性:
1. title 標題,通常這種標題無法被顯示
示例:
<card>
<p> What OS You Use Now?
<select name="OS">
<optgroup title="microsoft">
<option value="dos">dos</option>
<option value="windows">windows</option>
</optgroup>
<optgroup title="others">
<option value="unix">unix</option>
<option value="linux">linux</option>
</optgroup>
</select>
</p>
</card>
上例演示了一個基本的Optgroup元素的應用,由于Optgroup沒有變量參數,所以只能提供有限的應用。
一個比較復雜的例子:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<template>
<do type="options" label="Back">
<prev/>
</do>
</template>
<card id="lists">
<p>
<select title="Pick Lists">
<option onpick="#JY">Jin Yong</option>
<option onpick="#GL">Gu Long</option>
</select>
</p>
</card>
<card id="JY">
<onevent type="onenterbackward">
<prev/>
</onevent>
<do type="accept">
<go href="#display_fav"/>
</do>
<p> Pick your fav Book:
<select name="fav" title="Stooges">
<option value="Xiao">Xiao ao jiang hu</option>
<option value="She">She diao ying xiong</option>
<option value="Lu">Lu ding ji</option>
<option value="Shen">Shen diao xia lv</option>
</select>
</p>
</card>
<card id="GL">
<onevent type="onenterbackward">
<prev/>
</onevent>
<do type="accept">
<go href="#display_fav"/>
</do>
<p> Pick your fav Book.
<select multiple="true" title="Gu Long" name="fav" >
<option value="Gu">Gu xing zhuan</option>
<option value="Da">Da di fei ying</option>
<option value="Tian">Tian ya ming yue dao</option>
<option value="feng">Lu xiao feng</option>
</select>
</p>
</card>
<card id="display_fav">
<p> Your fav was $fav. </p>
</card>
</wml>
posted on 2006-03-17 10:59
kelven 閱讀(473)
評論(0) 編輯 收藏 所屬分類:
WML