文档的实体包含在<wml>...</wml>标记中,文档里每个CARD又包含在<card>...</card>标记中,然后实际的文字段落则包含?lt;p>...</p>标记中?/P>
单例子:(x)
<?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="HELLO" title="HELLO"> <p> Hello world! </p> </card> </wml> |
------ HELLO ------ Hello World! |
<?xml version="1.0" encoding="gb2312"?> |
<b>通讯录</b> |
通讯?/TD> |
与XML一P在WML语言中,所有元素都攑֜W号"<" ?">"中,q且包含一个开始标志、一个结束标志和一个内Ҏ(gu)志,或者用自w结束的控制标记。就象这P(x)
<tag>内容</tag> 例如Q?lt;p>Hello World!</p> ? <tag/> 例如Q?lt;br/> ?<go href="#done"/> |
WML同样支持在标志中标出属性。属性是标志的附加信息,与元素的内容不一P它ƈ不在屏幕上显C出来。属性通常在元素的开始标志后指定。如上面最后一个例子?/P>
׃WML是XML的一U应用,因此所有的WML标记和属性都是大写敏感的(<wml>?lt;WML>完全不同Q,而且所有的标记都必L地l束。WML要求属性的值必L在双引号或单引号内。单引号可放在属性标志内或双引号内。字W亦可作为属性的倹{?BR>
WML注释
XML支持q样的注释格式:(x)
<!q句话你在手Z看不?-> |
http://www.itsalon.net/index.wml ? http://www.itsalon.net/index.wml#login |
#next |
提供链接功能的WML元素?个:(x)<go>Q参?A >dQ和<anchor>Q参?A >事gQ?BR>
CDATA
XML支持CDATA的概念,以显CZ需要解释的文本。下面的例子使用CDATA元素在WML面中显CWML命o(h)文本?BR>
<! [CDATA [ <card name="bogus"><p>this is data</p></card> ] ]> |
览器窗口将昄如下内容Q?BR>
<card name="bogus"><p>this is data</p></card> |
用于WAP的标记语a是WMLQWireless Markup LanguageQ?BR> WML的语法跟XML一PW(xu)ML是XML的子集?BR> HTML、XML和W(xu)ML的文件有很多怼之处Q这L(fng)开发者在q去10q中所学的东西今天依然适用?BR>WML面文g的后~?*.WMLQ就象HTML?*.HTML后缀?BR>XML规定定义?jin)一个规范的XML文g的规根{Q何违反这个规定的WML文g?x)出错。WML文g通常使用XML解释器v来解释?BR> 建立|页制作环境 WML文g本n是文本文gQ所以编辑不成问题,手的编辑器都可以用? 当然Q由于目前的览器还都不能显CWML面Q而我们又不能d手机上进行测试(速度太慢Q,所以需要模拟器。现在象NOKIA、ERICSSON、MOTOROLA{手机制造商都生产了(jin)相应的品,你只要下载就行了(jin)。当焉?jin)模拟器以外Q还需要图形制作{换器Q用来制作WAP格式的图形文Ӟ(j)、字W{码器Q汉?lt;=>UNICODEQ等{,本站工具?qing)论坛页面均有说明?BR> WML文gl构 WML的页面通常叫做桌面QDECKQ,׃l互盔R接的卡片QCARDQ组成。当Ud?sh)话讉K一个WML面的时候,面的所有CARD都会(x)从WAP服务器下载到讑֤里。CARD之间的切换由?sh)话内置的计机处理Q不需要再到服务器上取信息?jin)。CARD里可以包含文本、标记、链接、输入控制、Q务(TASKQ、图像等{。CARD之间可以互相链接? 文的实体包含在<wml>...</wml>标记中,文档里每个CARD又包含在<card>...</card>标记中,然后实际的文字段落则包含?lt;p>...</p>标记中?/P> 单例子:(x)
昄l果如下Q?BR>
DECK里面各个l成部分的具体解释在本教E的其他部分有说明?BR> WML字符?BR> WML是XML的子集,l承?jin)XML的字W集讄。WML文档~省的字W集是UTF-8? 要显CZ文,有两U办法。最单的办法是在文头使用encodingQ即把第一行改为:(x)
然而o(h)Z气的是,q种Ҏ(gu)有些手机和模拟器q不支持Q将来会(x)的)(j)Q所以目前第2U方法更普遍Q不改变字符集设|,但是在写中文的时候采用UNICODE代表中文字符Q如Q?BR>
代表Q?
WML元素Q标讎ͼTagQ和属?BR> WML的主要内Ҏ(gu)文本Q由于标C(x)降低与手持设备的通讯速度Q所以WML标准里仅仅用了(jin)很少一部分。用于表格和囑փ的的标记几乎都被排除?jin)? 与XML一P在WML语言中,所有元素都攑֜W号"<" ?">"中,q且包含一个开始标志、一个结束标志和一个内Ҏ(gu)志,或者用自w结束的控制标记。就象这P(x)
WML同样支持在标志中标出属性。属性是标志的附加信息,与元素的内容不一P它ƈ不在屏幕上显C出来。属性通常在元素的开始标志后指定。如上面最后一个例子?/P> ׃WML是XML的一U应用,因此所有的WML标记和属性都是大写敏感的(<wml>?lt;WML>完全不同Q,而且所有的标记都必L地l束。WML要求属性的值必L在双引号或单引号内。单引号可放在属性标志内或双引号内。字W亦可作为属性的倹{?BR>
q些注释在浏览器中ƈ不显C出来?BR>WML不支持嵌套元素注释?BR> 链接QURLQ?BR>WML外部引用方式跟HTML相同
内部引用Q如果next是当前DECK中的一个CARDӞ可以用这U方式:(x)
提供链接功能的WML元素?个:(x)<go>Q参?A >dQ和<anchor>Q参?A >事gQ?BR>
览器窗口将昄如下内容Q?BR>
| |||||||||||
有了(jin)上面的基Q相信大家已l能够做不少事情?jin)。现在我们来深入一下,看看如何提高性能和网l传输效率。首先,需要介l一下http 1.1QRFC2616Q的基础知识。当?dng)如果你已l很熟?zhn)了(jin),可以跌W一部分?BR> 一、HTTP 1.1的简要介l?BR> HTTP 1.1是一个基于文本的互联|实体信息交互主协议,q里的实体可以是WAP兼容览器之cȝ用户l端Q可以是WAP|关之类的代理服务器Q也可以是Java servlet之类的源服务器程序。它们之间的交互信息是两大c:(x)客户端对服务器端的请求(requestQ和服务器端对客L(fng)的响应(responseQ。一ơ完整的交互包括一个请求和对它的响应?BR> 所有的h和响应都采用[RFC822]中定义的标准互联|消息格式,框架如下Q?BR> * 消息定义 * 没有或多个消息头 * CRLFQ空行回车)(j) * 可选的消息本体 其中消息定义不分指定?jin)发送消息的cd。请求和响应都可以包含多个消息头Q用来进一步或者重新定义用L(fng)端和服务器之间的交互。CRLF仅仅用来信息定义和消息本体分开? 1、请?BR> 在消息定义部分可以这样定义请求:(x) hcd URL HTTP/1.1 其中hcd可以是下面的一U:(x) ? OPTIONQ返回请求者和相应者之间可以用的通信选项Q主要用来检服务器处理能力Q?BR> ? GETQ获得以URL标示的文件内Ҏ(gu)者程序执行结果。服务器Ҏ(gu)文g名后~判断服务内容Q比如该URL是静(rn)态文本还是一个程序; ? HEADQ除?jin)不q回响应的信息本体以外,得到的是跟GET一L(fng)信息。一般用来测试链接的有效性、可达性和q期修改Q?BR> ? POSTQ把消息本体中的消息发送到一个URL或者其他类似的服务器端定义行ؓ(f)。通常用来提交一个HTML表单或者一些数据操作活动; ? PUTQ把消息本体中的消息发送到一个URLQ跟POSTcMQ但不常用; ? DELETEQ删除URL指定的资源; ? TRACEQ调用一个远E应用层h消息回\。发?gu)个消息的用户l端除了(jin)收到原来的消息内容以外,q得到消息在Internet上的传送\径? 最常用的请求类?-也是我们在处理WAP应用时最兛_(j)?-是GET和POST。假设有一个WML文档Q我们用UP的浏览器L览的话,׃(x)向服务器发出如下GEThQ?BR>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消息_(d)q里我们忽略?jin)一些与我们关系不大的消息头?BR>accept-charset: 用户l端支持的字W集 accept-language: 用户l端目前使用的语a accept: 用户l端可以接受的MIME文gcd user-agent: 用户l端供应商提供的l端描述信息 host: h信息发送到的域? 2、响?BR> 响应的消息定义部分一般是q样的:(x)HTTP/1.1 状态码状态描q在[RFC2616]中定义了(jin)q?0U不同的状态码Q分?l)(j)。其中最常见的是3个:(x) 200 OK 401 Unauthorized 404 Not Found l箋上面那个例子Q如果该URL合法的话Q服务器的响应会(x)是这L(fng)Q? 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=?.0?gt; <!<!DOCTYPE wml PUBLIC ?//WAPFORUM//DTD WML 1.1//EN? “http://www.wapforum.org/DTD/wml_1.1.xml?gt; …?BR>其它内容 …? q个响应信息里包括了(jin)响应的数字代码和文本描述Q然后是一l消息头。在一个换行符以后是消息本体Q在q里Q消息本体就是www.itsalon.net/index.wml的源代码?BR>Server: 发出响应的服务器 Date: 响应发出的时?BR>Connection: 指示用户l端保持q接 Content-Length: 响应信息的长度,从DECK的第一?<"字符开始计?BR>Content_Type: 响应的MIMEcd Last-Modified: 响应中DECK的最后修Ҏ(gu)? 当用L(fng)端接收到响应以后Q会(x)对其状态信息和消息头进行解码,然后军_对响应做Z么样的动作。如果收到OK响应Q一般会(x)把消息本体里的内Ҏ(gu)C在屏幕上。对于桌面终端,通常是HTMLQ对于WAP览器,则是WML? HTTP是一U很?ch)琐的协议。即使是单没有Q何数据的h和响应都要生数癑֭节的消息。WAP通过WAP|关来解册个问题。WAP|关一个很重要的功能就是把所有的HTTP1.1消息转换成无UQ务协议(Wireless Session Protocol, WSPQ的消息格式。这U格式是压羃的二q制协议Q兼容HTTP1.1。它能解析所有的h和响应消息,q{换成最_的BIT序列? 到这里我们已l介l了(jin)HTTP1.1的主要内宏V当然HTTP1.1q有很多复杂的内容,但是在这里ƈ不打多Ԍ如果你有兴趣Q可以去相关|站查找它的资料。作者只惛_家知道一点:(x)用户l端和服务器之间q有比GET和POSTh更多的互动消息,它们一hh和响应消息头Qƈ且可以包含一些信h影响WAP应用E序的执行和性能。这正是提高WAPq行效率的秘密所在?BR> 二、缓存(CachingQ?BR> Ҏ(gu)[RFC2616]的定义,~存是:(x)"E序中响应消息的本地储存Z?qing)控制这些消息储存、重新获取和删除的子pȝ。缓存保存可以缓存的响应消息以便降低来的响应时间和|络带宽消耗,同样也适用于请求消息? ׃WAP信道带宽的限Ӟ我们在编写WAP应用的时候都希望最大限度地减少消息的传送量。要做到q一点,p量C用缓存,l常C~存中获得以前的消息。幸q的是目前大多数WAP讑֤都有一定别的~存Q在默认情况下,?x)尝试最大化的缓存。几乎所有指向URL的响应都?x)被~存下来?BR> 当WAP用户l端~存一个响应的时候,?x)保存几乎所有的信息QURL、响应文本、消息头以及(qing)其他可以验证响应的内容(参看下一?验证和历史堆?Q。每个被~存的项目都可以Ҏ(gu)它的URLl成部分Q域名、\径、协议、参数、端口等{)(j)唯一的识别?BR> 有两UHTTP消息头可以让你控制WML的DECK~存Q对我们最重要的是Cache-Control消息头。它能够直接通过h/响应链来控制所有的~存实体。所有的~存机制都必遵守这些消息头的定义。Cach-Control消息头通常用来屏蔽一个设备的默认~存行ؓ(f)。他们在消息链中传递时必须直接I过所有的代理服务器和|关而不被改变?BR> * Cache-Control: no-cache。设定这个选项的URL不能被缓存,包括用户l端和所有处于内Ҏ(gu)务器和用L(fng)端之间的其他服务器; * Cache-Control: max-age=<second> * Expired:<date> 在写一个WAP应用的时候,你要先假讄L(fng)端会(x)量最大化~存以便使向内容服务器获取信息的动作减少到最。下面做些解释:(x) 1、永久缓存URL WAP用户l端通常?x)尽量长地在它的~存中保存存取过的URLQ这?量?在Phone.com览器中的定义是大约30天。不q,也许你会(x)x一个URL的缓存时间尽量g长,比如你公司的LOGOQ这hơ打开面的时间就?x)减。用下面两种Ҏ(gu)能够很简单地实现Q? * 指定一个离现在很远的过期日Q比如:(x)Expires: Tue, 01 Jan 2002 00:00:00 GMTQ? * 指定一个很大的~存旉Q如QCache-Control: max-age=3153600。这个例子可以让URL~存一q。用L(fng)端允许的最大整数是2,147,483,647Q所以你可以让一个URL保存过68q之久。当?dng)到那个时候,你的手机早就那报废了(jin)? 2、指定对URL的缓存时?BR> 通常的情冉|对一个URL你只需要缓存一D|间。比如股报L(fng)l,|页可能需?分钟更新一ơ,那么你只要在DECK的HEAD部分指定Cache-Control: max-age=300p?jin)?如果用户?分钟以内再次(g)索该面Q看到的q是~存里的|页。如果在5分钟以后Q就?x)到服务器上获取最新的数据? 另外一U控制缓存时间的Ҏ(gu)是用前面提到过的ExpiresQ不q这U方法只能告诉用L(fng)端:(x)只要q了(jin)指定旉Q无Z么时候访问页面都要刷新。如果你下次要控制时_(d)只能改变Expires里的旉倹{? 3、禁止对URL的缓?BR> 对于快速变化的内容Q一般都?x)希望每ơ都得到最新的数据。所以这个时候要完全止对相关网늚~存。方法有三种Q? * 讑֮Cache-Control: no-cacheQ? * 讑֮最大缓存时间ؓ(f)0QCache-Control: max-age=0Q? * 讑֮~存到期日ؓ(f)一个早pȝ日期QExpires: Mon, 1 Jan 1990 00:00:00 GMT? 实际上,后两U不是最好的选择。首先这样会(x)多占用终端的处理旉Q因为当到q个DECKӞl端需要计一下过期时间。其ơ,q样?x)多占用一些字节,而且在表达上也不够清楚? 三、验证(validationQ和历史堆栈QHistory StackQ?BR> 在HTTP1.1中对~存q一步提Z(jin)验证的概c(din)验证的目的是(g)验缓存项目是否在有效期内。由于历史堆栈的存在QW(xu)APl端上的验证q程变得有点复杂? WAP标准规定所有的WAP讑֤都至要有可以容U?0-个项目的历史堆栈。当用户按下?lt;go> 一般情况下Q所有的前行链接都会(x)被验证,而后退链接则不?x),因?f)它已l在cache里了(jin)。可是我们有时候还是希望当用户按下后退键时依然能够得到最新的数据。如果终端L不予验证的话Q那用户只好扑ֈ主菜单再重新q入那个面? q运的是Q我们用Cache-ControlQmust-revalidate可以强q用L(fng)端在用户按back时对URLq行验证。当?dng)q行验证q不是说该页面会(x)立刻重新dQ而是Ҏ(gu)他是否过期来军_。如果没有过期,验证的结果仍然是昄~存中的面? 如果你需要每ơback都重新读取页面,用Cache-ControlQmust-revalidate, no-cache可以实现。另外,?no-cache换成max-age=300可以在back时对已缓存了(jin)300U的面q行h? 四、HTTP头与meta元素 到这里,大家已经知道HTTP消息头的在WAP面的作用了(jin)。不q要在WML文档里设|这些消息头Q就要用到meta元素Q它只能出现在WML文档<head>D里。下面是几个消息头和它们的表CŞ式:(x) 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"/> 当网兛_WML文档中扫描到元素Ӟ׃(x)把它们{换成WSP{效的HTTP消息_(d)然后用户l端可以据此对~存q行控制?jin)?/TD> |