查看: 3131|回复: 0

[手机服务] 《WAP教程》

[复制链接]
发表于 2009-4-15 13:38:23 | 显示全部楼层 |阅读模式
《WAP教程》 <br /><br /><br />第一卷 第一章 <br /><br />WML的基本情况  [TOP]   <br /><br />用于WAP的标记语言就是WML(Wireless  Markup  Language)。 <br /><br />WML的语法跟XML一样,WML是XML的子集。 <br /><br />HTML、XML和WML的文件有很多相似之处,这样网页开发者在过去10年中所学的东西今天依然适用。 <br /><br />WML页面文件的后缀是  *.WML,就象HTML的  *.HTML后缀。 <br /><br />XML规定定义了一个规范的XML文件的规格。任何违反这个规定的WML文件会出错。WML文件通常使用XML解释器起来解释。 <br /><br />建立网页制作环境  [TOP] <br /><br />WML文件本身就是文本文件,所以编辑不成问题,顺手的编辑器都可以用。   <br /><br />当然,由于目前的浏览器还都不能显示WML页面,而我们又不能总在手机上进行测试(速度太慢),所以需要模拟器。现在象NOKIA、ERICSSON、MOTOROLA等手机制造商都生产了相应的产品,你只要下载就行了。当然除了模拟器以外,还需要图形制作转换器(用来制作WAP格式的图形文件)、字符转码器(汉字〈-〉UNICODE)等等。   <br /><br />WML文件结构  [TOP] <br /><br />WML的页面通常叫做桌面(DECK),由一组互相链接的卡片(CARD)组成。当移动电话访问一个WML页面的时候,页面的所有CARD都会从WAP服务器下载到设备里。CARD之间的切换由电话内置的计算机处理,不需要再到服务器上取信息了。CARD里可以包含文本、标记、链接、输入控制、任务(TASK)、图像等等。CARD之间可以互相链接。   <br /><br />文档的实体包含在标记中,然后实际的文字段落则包含在 <br /><br />...标记中。 <br /><br />简单例子:   <br /><br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />   &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt;   <br /><br /> Hello  world!   <br /><br />显示结果如下: <br /><br />------  HELLO  ------   <br /><br />Hello  World!     <br /><br />DECK里面各个组成部分的具体解释在本教程的其他部分有说明。 <br /><br />WML字符集  [TOP] <br /><br />WML是XML的子集,继承了XML的字符集设置。WML文档缺省的字符集是UTF-8。   <br /><br />要显示中文,有两种办法。最简单的办法就是在文档头使用encoding,即把第一行改为:   <br /><br />   <br /><br />然而令人丧气的是,这种方法有些手机和模拟器并不支持(将来会的),所以目前第2种方法更普遍:不改变字符集设置,但是在写中文的时候采用UNICODE代表中文字符,如: <br /><br />   <br /><br />代表:   <br /><br />通讯录   <br /><br />WML元素:标记(Tag)和属性  [TOP]   <br /><br />WML的主要内容是文本,由于标记会降低与手持设备的通讯速度,所以WML标准里仅仅使用了很少一部分。用于表格和图像的的标记几乎都被排除了。   <br /><br />与XML一样,在WML语言中,所有元素都放在符号&quot;&quot;中,并且包含一个开始标志、一个结束标志和一个内容标志,或者使用自身结束的控制标记。就象这样: <br /><br />  例如: <br /><br />Hello  world!   <br /><br />或   <br /><br />  例如: <br /><br />  和     <br /><br />WML同样支持在标志中标出属性。属性是标志的附加信息,与元素的内容不一样,它并不在屏幕上显示出来。属性通常在元素的开始标志后指定。如上面最后一个例子。 <br /><br />由于WML是XML的一种应用,因此所有的WML标记和属性都是大小写敏感的(完全不同),而且所有的标记都必须正确地结束。WML要求属性的值必须放在双引号或单引号内。单引号可放在属性标志内或双引号内。字符亦可作为属性的值。 <br /><br />WML注释  [TOP] <br /><br />XML支持这样的注释格式:   <br /><br />   <br /><br />这些注释在浏览器中并不显示出来。 <br /><br />WML不支持嵌套元素注释。 <br /><br />链接(URL)[TOP]   <br /><br />WML外部引用方式跟HTML相同   <br /><br />http://www.wap86.net/great.wml  或   <br /><br />http://www.wap86.net/great.wml#login     <br /><br />内部引用,如果next是当前DECK中的一个CARD时,可以用这种方式: <br /><br />#next   <br /><br />提供链接功能的WML元素有2个:(参见事件)。 <br /><br />CDATA  [TOP] <br /><br />XML支持CDATA的概念,以显示不需要解释的文本。下面的例子使用CDATA元素在WML页面中显示WML命令文本。 <br /><br />   <br /><br />浏览器窗口将显示如下内容:   <br /><br />this  is  data <br /><br />第一卷 第二章 <br /><br /><br />格式  <br /><br />象HTML一样WML可以定义变量,可以让你的页面设计更简单和富有逻辑性。变量格式如下显示:   <br /><br />$identifier   <br /><br />$(identifier)   <br /><br />$(identifier:conversion)   <br /><br />圆括号在变量带有空格时使用,第3种格式本节后面说明。 <br /><br />变量的优先权最高,所以当出现与变量符号相同的字符时,它将被认为是变量的标志。因此如果想在WML页面中显示$符号时必须在其后面再跟一个$符号。如下例: <br /><br />You  account  has  $$1650.00  in  it.   <br /><br />变量名是由US-ASCII码、下划线和数字组成,并且只能以US-ASCII码开头。变量名大小写敏感。 <br /><br />WML变量没有类型,均表示为字符串。变量没有被赋值的时候,内容为空,即空字符串。可以在运行过程中改变它的值。 <br /><br />创建变量   <br /><br />创建变量最简单的方法是使用元素,语法如下:   <br /><br />&lt;setvar <br /><br />  name=&quot;string&quot;   <br /><br />    value=&quot;string&quot;  /&gt;   <br /><br />中使用(具体操作见本教程任务(TASK))。下例定义了一个叫vNAME的变量并赋值为“Jeff”: <br /><br />   <br /><br />另外,还可以在中定义变量,参考本教程(任务(TASK)和数据输入) <br /><br />替换文本  [TOP]   <br /><br />变量可以用作替换用途,但只能在文本类型(如显示字符、URL等)中使用。任何元素和属性都不能使用变量来替代。例如: <br /><br />Hello,  $vNAME.   <br /><br />将显示:   <br /><br />Hello,  Jeff.     <br /><br />ESCAPE转换  [TOP]   <br /><br />前面说过变量可以用作替换用途,但是在URL中使用时,变量的内容必须遵守[RFC2396]标准。这个标准规定某些特殊字符在URL里使用的时候必须用特殊表示方法,即ESCAPE八进制表示。例如: <br /><br />list.asp?id=3   <br /><br />在URL中要表示为: <br /><br />list.asp%3fid=3   <br /><br />所以变量有可能需要标志为是否对其内容进行ESCAPE转换,变量定义就有如下几种特殊方式: <br /><br />效果    表达方式1    表达方式2    表达方式3     <br /><br />对变量中ESCAPE字符进行转换    $(var:e)    $(var:E)    $(var:escape)     <br /><br />不进行ESCAPE转换    $(var:u)    $(var:U)    $(var:unesc)     <br /><br />变量中没有ESCAPE字符    $(var:n)    $(var:N)    $(noesc) <br /><br />   <br /><br />给变量进行ESCAPE转换是WML的默认方式,特殊字符ESCAPE码请参考本教程字符实体。 <br /><br />第一卷 第三章 <br /><br />    ?????? <br /><br />CARD里可以显示象文本、图像这样的内容。象HTML一样,WML也提供一些标记对内容进行排版。 <br /><br />段落与换行标记 [TOP] <br /><br />:段落标记,用来对段落进行分段。语法: <br /><br />&lt;p <br /><br />   aligh=&quot;left|right|center&quot; <br /><br />   mode=&quot;wrap|nowrap&quot;; <br /><br />   xml:lang=&quot;STRING&quot;  &gt;   <br /><br />aligh:文字对齐方式,左(left)、右(right)、居中(center)。 <br /><br />mode:文字超出屏幕时是否折行,各种终端处理方式不同。 <br /><br />xml:lang:显示语言编码。 <br /><br />:行分隔标记,产生回车效果。语法: <br /><br />&lt;br <br /><br />   xml:lang=&quot;STRING&quot;  /&gt;   <br /><br />xml:lang:显示语言编码。 <br /><br />段落和换行的例子: <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot; <br /><br /> &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt; <br /><br />This  is  a  paragraph <br /><br />This  is  a  another <br /><br />with  a  line  break <br /><br />   <br /><br />显示结果如下: <br /><br />------  Paragraphs  ------ <br /><br />This  is  a  paragraph <br /><br />This  is  another <br /><br />with  a  line  break   <br /><br />标记  字体样式   <br /><br />  粗体    <br /><br />  大字体   <br /><br />  强调字体   <br /><br />  斜体   <br /><br />  小字体   <br /><br />  加重强调字体   <br /><br />  下划线字体   <br /><br />文字样式标记  [TOP] <br /><br />WML提供了一系列文字样式的标记,如右表所示。不过WML鼓励大家尽量使用标记,因为某些WAP终端会忽略其他标记。 <br /><br />每个文字样式标记语法都一样,都有一个标志语言代码的xml:lang属性。 <br /><br />下面是一个例子:   <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot; <br /><br />   &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt; <br /><br />在你的终端上可能会有这样的显示  (不过别太当真,前面说了有的终端会忽略文本样式标记): <br /><br />list.asp%3fid=3   <br /><br />所以变量有可能需要标志为是否对其内容进行ESCAPE转换,变量定义就有如下几种特殊方式: <br /><br />-----  Formatting  ----- <br /><br />normal <br /><br />emphasized <br /><br />strong <br /><br />bold <br /><br />italic <br /><br />underline <br /><br />big <br /><br />small   <br /><br />表格  [TOP] <br /><br />WML支持简单的表格标记。语法如下:   <br /><br />&lt;table <br /><br />  align=&quot;L|R|C&quot; <br /><br />  columns=&quot;NUMBER&quot; <br /><br />  TITLE=&quot;STRING&quot; <br /><br /><br /><br />  其他列… <br /><br /><br />  其他行… <br /><br />   <br /><br />在WML里定义一个表格必须先指定列数,即columns属性。而在表格里就必须有相应数量的标记对。因该注意的是,align(对齐)属性的内容只能是L(左对齐)、R(右对齐)和C(居中),跟其他标记不同(是不是有点怪?)。 <br /><br />下面的例子演示了表格的基本功能: <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot; <br /><br />   &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt; <br /><br /><br />显示结果(注意WML里没有表格线): <br /><br />------  SALARY  ------ <br /><br />NAME      PAYED <br /><br />Johnson     $7810.11 <br /><br />Faye      $8912.00   <br /><br />图像  [TOP] <br /><br />相对于多媒体泛滥的HTML网站,在资源紧张的WAP设备上显示图像就有点奇怪了。但是WML还是提供了图像显示的支持,毕竟一个设计精巧的图像会比一段话表达意思更清楚,或许占用空间更小。   <br /><br />WML支持WBMP(Wireless  Bitmap)格式的图像,需要用特殊工具制作。显示图像使用标记,语法如下: <br /><br />&lt;img <br /><br /> alt=&quot;STRING&quot; <br /><br /> src=&quot;STRING&quot; <br /><br /> align=&quot;top|middle|bottom&quot; <br /><br /> height=&quot;NUMBER&quot; <br /><br /> width=&quot;STRING&quot; <br /><br /> hspace=&quot;NUMBER&quot; <br /><br /> vspace=&quot;STRING&quot; <br /><br /> localsrc=&quot;STRING&quot;  /&gt;   <br /><br />alt:  图像无法显示时的替换文字。 <br /><br />src:  图像的url。 <br /><br />localsrc:  储存于ROM(或RAM)中图像的名字,各种终端支持不同。 <br /><br />align:  上下对齐方式。 <br /><br />height:  图像显示高度。 <br /><br />width:  图像显示宽度。 <br /><br />hspace:  图像左右的空白,以pixel数或百分比表示。 <br /><br />vspace:  图像上下的空白,以pixel数或百分比表示。 <br /><br />上面的属性只有alt和src是必须的。其他附加属性基本上仅仅用来指示用户终端,大多数情况下会被忽略。下面是个例子: <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot; <br /><br /> &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt; <br /><br />WAP86,  ! <br /><br />   <br /><br />下面分别是在支持和不支持图像的终端上的显示结果:   <br /><br />---  Congratulation  ---   <br /><br />WAP86,  wonderful! <br /><br />第一卷 第四章 <br /><br />    ?????? <br /><br />由于网络带宽以及某些WAP服务器DECK传输的限制,所以DECK越小越好,最好不要超过1.2K。如果你的需求很复杂,最好分成几个DECK来完成。   <br /><br />完整的WML文档结构如下: <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />   &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt;   <br /><br />   <br /><br />      <br /><br />    .   <br /><br />    .  头信息...... <br /><br /><br />    . <br /><br />    .  模板定义......   <br /><br /><br /><br />    .  内容...... <br /><br /><br />    .  其他card(可有可无)...... <br /><br />XML说明  [TOP]   <br /><br />DECK开头必须指明以下的XML类型声明:   <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />   &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt;   <br /><br />第一行指出XML版本,紧跟的文档类型(DOCTYPE)声明指出所引用的语言标准定义(wml_1.1.xml的内容可以察看本教程附录中的DTD说明)。 <br /><br />这两句的位置和顺序不可更改,而且中间不能有空行。 <br /><br />  [TOP]   <br /><br />语法:   <br /><br />表示文档语言为中文。 <br /><br />  [TOP]   <br /><br />标签。 <br /><br />语法: <br /><br />&lt;access   <br /><br />    domain=&quot;STRING&quot;   <br /><br />    path=&quot;STRING&quot;  /&gt;   <br /><br />标签,指定该DECK的访问控制信息,它的两个属性是可选的。 <br /><br />domain:指定域,默认值为当前域。 <br /><br />path:指定路径,默认值为&quot;/&quot;,即根目录。 <br /><br />语法:   <br /><br />&lt;meta   <br /><br />    http-equiv=&quot;STRING&quot;  |  name=&quot;STRING&quot;   <br /><br />    forua=&quot;true|false&quot;   <br /><br />    content=&quot;STRING&quot;   <br /><br />    scheme=&quot;STRING&quot;  /&gt;   <br /><br />和HTML中提供了该DECK的meta信息。 <br /><br />包括一下三种情况 <br /><br />name=&quot;name&quot;  UP.Link  Server忽略meta数据 <br /><br />  http-equiv=&quot;name&quot;  UP.Link  Server将meta数据转为HTTP响应头(同HTML)   <br /><br />  user-agent=&quot;agent&quot;  UP.Link  Server直接将meta数据传给手机设备 <br /><br />content属性也是必选的,其内容根据属性而定。scheme属性目前尚不支持。forua为可选属性,指定在该wml文件传到客户端之前,标签是不是被中间代理删除(因为传输的协议可能改变),默认值为false。 <br /><br />目前支持的meta数据:   <br /><br />  指定DECK在手机内存缓存中的存储时间段,默认的为30天(除非内存耗尽),在该期间,手机对于访问过的DECK直接从缓存里调用。如果信息是对时间敏感的,可以用max-age指定DECK在缓存里的生存期,最小单位是秒,如果指定为0,则每次都需通过连接服务器来调用该DECK。 <br /><br />声明中的事件处理。   <br /><br />语法:   <br /><br />&lt;template   <br /><br />    onenterforward=&quot;STRING&quot;   <br /><br />    onenterbackward=&quot;STRING&quot;   <br /><br />    ontimer=&quot;STRING&quot;  /&gt;   <br /><br />onenterforward:当用户通过进入CARD时调入的链接。 <br /><br />onenterbackward:当用户通过退回CARD时调入的链接。 <br /><br />ontimer:事件激活时调入的链接。 <br /><br />例子(其中涉及的其他命令参考其他章节):   <br /><br />      <br />另外可以参看事件(EVENT)。 <br /><br />  [TOP] <br /><br />一个DECK可以包含多个CARD,每个CARD的内容可能不止一屏显示,注意DECK、CARD和屏幕显示范围的关系。一个CARD用包含。   <br /><br />语法:   <br /><br />&lt;card <br /><br />   id=&quot;STRING&quot;   <br /><br />   title=&quot;STRING&quot;   <br /><br />   newcontext=&quot;true|false&quot;   <br /><br />   ordered=&quot;true|false&quot;   <br /><br />   onenterforward=&quot;STRING&quot;   <br /><br />   onenterbackward=&quot;STRING&quot;   <br /><br />   ontimer=&quot;STRING&quot;   <br /><br />   xml:lang=&quot;STRING&quot;&gt;     <br /><br />每个CARD元素可以有一个标号(ID)和标题(TITLE)。当然,这都不是必须的。 <br /><br />id:CARD的名字,在DECK中唯一,可用作URL已进行跳转。 <br /><br />title:CARD的标题,用户BOOKMARK一个CARD时的名字。该属性在某些用户终端上会显示出来。 <br /><br />newcontext:用来指示当跳转到本CARD时,用户终端(手机、模拟器等)是不是要清除以前保留的信息如变量、堆栈历史记录、终端状态等。默认值为FALSE。 <br /><br />ordered:表明该CARD里的内容是按固定的顺序显示,还是按用户的选择来显示。默认值是TRE。这点和HTML不同,CARD页面里的内容可以按一定的顺序显示,默认的是按线性顺序显示,即按代码的顺序,但是,要注意的是,以下三个标签必须按以下顺序来写,(这和以后要讲的“事件”有关)。这样做是为了方便填表单,当ordered设置为true时,如果一个表单的内容不能在一屏里显示完,就分成多屏显示;当ordered设置为false时,手机可以显示一个概要CARD来总结有效的选项,用户可以从中选取表单选项来填写。 <br /><br />onenterforward:当用户通过进入CARD时调入的链接。 <br /><br />onenterbackward:当用户通过退回CARD时调入的链接。 <br /><br />ontimer:事件激活时调入的链接。 <br /><br />第一卷 第五章 <br /><br /><br />前面我们已经讲过如何在WML中显示内容。不过任何程序员都知道,没有结构和进程就没有程序。在WML中定义进程有很多方法,最简单的就是任务。 <br /><br />WAP1.1定义了几种类型的任务,任务通过对事件(有关事件的详细解释见下一章事件)的响应改变程序的运行顺序。有四种WML任务:·    。   <br /><br />  [TOP] <br /><br />这个任务不做任何事情,一般用于屏蔽DECK级事件(参见桌面和事件),语法非常简单:   <br /><br />当用户激活该任务时,终端就转回上次用户访问过的URL。语法如下: <br /><br /><br />如果元素,就会优先处理。下面例子定义了一个只有Back按钮的的DECK,按下以后会返回前面看过页面。 <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />&quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt;   <br />当用户激活该任务时,就执行一个刷新过程。如果这个任务里使用定义了变量,变量值将被重新设置。语法如下: <br />   <br /><br />如果当前CARD含有优先启动。 <br /><br />下面的例子定义在屏幕刷新时重设firstname、lastname和age变量。 <br /><br />当用户激活该任务时,就引导用户去WML中指定URL,可以是服务器上其他的DECK,也可以是本DECK中其他的CARD。语法如下: <br /><br />&lt;go   <br /><br />    accept-charset=&quot;STRING&quot;   <br /><br />    href=&quot;URL&quot;   <br /><br />    method=&quot;post|get&quot;  sendreferer=&quot;true|false&quot;  &gt;   <br /><br /><br />href:必选属性,指向一个合法URL。如果是其他的DECK,则该DECK的第一个CARD会显示出来。如果是本DECK中的其他CARD,而历史堆栈里保存的是最新数据的话,则堆栈保持不变,直接调入该CARD。 <br /><br />sendreferer:如果为true,用户主体信息(USER  AGENT)必须传送给WAP网关。传送时使用HTTP的提交头信息,即尽可能简短的相对URL。这个属性可以用来给服务器控制存取URL的权力。默认值为false。 <br /><br />Method:值必须为get或post。分别用来产生HTTP的GET和POST请求。若为get,则在URL中列出参数,例如:“http://www.wap86.net/bob.cgi?argone=one”;若为post,则数据在请求内部传送,不需要在URL中列出。 <br /><br />Accept-charset:指定字符集名称列表,服务器在接受的时候必须接受这个编码规则。默认值为unknown。具体内容这里不作解释,在以后的高级教程中描述。 <br /><br />下面是一个简单的例子: <br /><br /><br />向服务器发送HTTP请求。语法如下:   <br /><br />当用户激活该任务时,就引导用户去WML中指定URL,可以是服务器上其他的DECK,也可以是本DECK中其他的CARD。语法如下:   <br /><br />下面是一个简单的例子: <br /><br />   <br /><br />当一个含有的任务被执行的时候,终端要完成这样一个过程: <br /><br />1、识别“名称/值”对并准备参数变量; <br /><br />2、参数变量转换成正确的字符集; <br /><br />3、根据URL的ESCAPE规则对参数进行ESCAPE转码,编译成application/x-www-form-urlencoded的MIME类型; <br /><br />4、根据method指定的请求模式提交任务。 <br /><br />下面的例子演示get模式的用法: <br /><br /><br />服务器将收到这样的get请求: <br /><br />GET  ../news.asp?newstype=technology&amp;newstext=wml  HTTP/1.1   <br /><br />.   <br /><br />.  其他HTTP头信息 <br /><br />.   <br /><br />如果把前面的请求模式改成post,则同样的任务产生的这样的post请求: <br /><br />OST../news.asp  HTTP/1.1   <br /><br />content-type=&quot;xxx-urlencoded&quot;  . <br /><br />.  其他HTTP头信息   <br /><br />.   <br /><br />newstype=technology&amp;newstext=wml <br /><br />第一卷 第六章 <br /><br />任务不能在真空中生存,它们必须绑定倒某个事件上才能做一些有用的事情。事件发生--〉任务执行,这才是完整的进程控制。 <br /><br />有4个元素可以帮助你完成事件对任务的绑定:。 <br /><br />  链接 <br /><br />象HTML一样,WML也可以定义到其他程序的链接。在HTML中,链接通常用下划线和特殊颜色的方式表示跟其他内容的区别。在WAP终端上则没有严格的规则说如何表示一个链接,一般采用反白的显示方式。   <br /><br />的语法如下: <br /><br />&lt;anchor <br /><br />    title=&quot;STRING&quot;   <br /><br />    xml:lang=&quot;STRING&quot;   <br /><br />&gt;   <br /><br />    <br /><br />,  ,  TEXT   <br /><br />   <br /><br />title:链接的标题; <br /><br />xml:lang:语言编码。 <br /><br />在这种定义方式中,实际上链接一般是通过元素完成的。比如下面的例子定义了2个CARD,点击第一个CARD里的“click  me”链接会跳转到第2个CARD:   <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />   &quot;http  ://www.wapforum.com/DTD/wml_1.1.xml&quot;&gt;   <br /><br />Hello,   <br /><br />   click  me   <br /><br />Bye,  guys   <br /><br /><br />点击前显示:-------  Hello  -------   <br /><br />Hello, <br /><br />点击后显示:   <br /><br />--------  bye  -------- <br /><br />Bye,  guys   <br /><br />链接还有一种短格式,语法如下:   <br /><br />&lt;a   <br /><br />    href=&quot;STRING&quot;   <br /><br />    title=&quot;STRING&quot;   <br /><br />    xml:lang=&quot;STRING&quot;   <br /><br />&gt;   <br /><br />    <br /><br />,  ,  TEXT   <br /><br />   <br /><br />除了跟原来一样的两个属性以外,多了href属性,可以对它直接指定URL。例如下面的例子定义了一个带有图像的链接:   <br /><br /><br />除了跟原来一样的两个属性以外,多了href属性,可以对它直接指定URL。 <br /><br />  固有事件  [TOP] <br /><br />WML定义了4种由用户终端触发的固有事件:   <br /><br />oneventforward:当用户被任务或其他机制(如一个SCRIPT过程)引导到一个CARD时触发; <br /><br />oneventbackward:当用回被或其他机制(如在设备上按BACK按钮)引导到一个CARD时触发; <br /><br />ontimer:当TIMER计时结束时触发。定义TIMER计时器可以使用元素,见下一节; <br /><br />onpick:当用户按下一个选项时触发(可以是选中或取消选择)。 <br /><br />把这些事件绑定到一个任务要使用元素,它的语法如下:   <br /><br />&lt;onevent   <br /><br />   type=&quot;oneventforward  |  oneventbackward  |  ontimer  |  onpick&quot;   <br /><br />&gt;   <br /><br /><br />下面的例子演示了如何使用固有事件在CARD调入时清空变量。 <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br /> &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt;   <br /><br /><br />    You  have  no  name!   <br /><br /><br />  计时器  [TOP] <br /><br />看名字就知道,这是个计时器,它在经过规定的计时时间以后产生一个任务。计时器只在所属CARD里有效:当进入CARD时,计时器开始工作;时间一到,触发任务;如果离开CARD,计时器停止。语法如下: <br /><br />&lt;timer   <br /><br /> name=&quot;STRING&quot;   <br /><br />   value=&quot;NUMBER&quot;   <br /><br />/&gt;   <br /><br />name:可选。指定一个包含计时时间的变量,在计时器开始工作以后,变量的值会逐渐减少。如果这个变量在之前就已经存在并且赋值为一个非负整数,那后面value属性的值会被忽略,直接使用变量里的值作为计时时限。 <br /><br />value:必选。指定计时时间,以1/10秒为单位。   <br /><br />下面的例子每隔1秒显示不同的文字(当然,你有兴趣改成图像也可以)。 <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />   &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt;   <br />     <br />Hello!   <br /><br />R  U  tired?   <br /><br />Take  a  rest!   <br /> <br /><br />显示结果如下,注意会不断循环。 <br /><br />第1秒:------  Hello  ------   <br /><br />Hello!   <br /><br />第2秒:-----  Take  care  ----   <br /><br />R  U  tired?   <br /><br />第3秒:-------  Rest  -------   <br /><br />Take  a  rest!   <br /><br />还有一个例子,通常用来做网站封面,显示一段欢迎词以后进入正式内容。这里没有使用图片,各位可以自己加上试试看。 <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />   &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt; <br />   <br /><br />    Hello!   <br /><br />    Welcome  to  WAP86  -  the  paradise  of  WML  developers.   <br /><br />部件    功能     <br /><br />accept    确认,接受输入     <br /><br />prev    退回历史页面访问堆栈里上一个CARD     <br /><br />help    上下文关联的帮助信息     <br /><br />reset    重设设备状态     <br /><br />options    上下文关联的选项或附加操作     <br /><br />delete    删除当前内容或选择     <br /><br />unknown    由开发者自己定义 <br /><br />  用户触发事件  [TOP]   <br /><br />每个WAP终端都预定义了一系列用户界面部件,如手机上的按钮、触摸屏上的图表、声音指令或者其他一些很容易是别的部件。WML1.1定义了右面那些WAP兼容终端必须支持的部件。但是要说明的是,只有prev有预先定义的功能,其他的只是概念上的定义,需要根据开发者激活并赋予一定的动作。 <br /><br />当用户激活这些部件的时候会产生相应的事件。你可以使用的语法: <br /><br />&lt;do   <br /><br /> type=&quot;accept  |  prev  |  help  |  reset  |  options  |  delete  |  unknown&quot;   <br /><br />   lebel=&quot;STRING&quot;   <br /><br />   name=&quot;STRING&quot;   <br /><br />   optional=&quot;true  |  false&quot;   <br /><br />   xml:lang=&quot;STRING&quot;   <br /><br />&gt;   <br /><br />type:必选属性,内容只能是那7种; <br /><br />label:用户接口部件的显示标签。如果终端不能显示则被忽略。WML1.1建议此属性长度限制在6个英文字符以内; <br /><br />name:标志“事件/任务”绑定关系的唯一名称(在CARD范围内)。CARD级的事件(见下一节)。如果不指定name属性或name为空字符串,则name默认为type的类型; <br /><br />optional:告诉终端此软按钮在屏幕中是否显示。如果此值设为true,则忽略本元素。默认值为false; <br /><br />xml:lang任务:语言代码。 <br /><br />跟其他“事件/任务”绑定关系一样,中的一个。   <br /><br />下面例子演示了的使用方法。用户按了不同的按钮会被导向不同的CARD。 <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />   &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt;   <br /><br />  WAP86’s  perfect  links   <br /><br />  Select  one: <br /><br /><br />     Select  &quot;Links&quot;  button  to  view  the  links.   <br /><br /><br />显示结果:主画面:----  WAP86  Links  ---   <br /><br />WAP86’s  perfect  links   <br /><br />Links       Help   <br /><br />按下“Links”按钮以后:---  WAP86  Links  ---   <br /><br />Select  one:   <br /><br />&gt;[  WAP86  ]   <br /><br />[  AT86  ]   <br /><br />按下“Help”按钮以后:-------  Help  -------   <br /><br />Select  &quot;Links&quot;  button  to  view  the  links.   <br /><br />Links   <br /><br />DECK级事件  [TOP] <br /><br />前面(DECK一节,关于事件就可以。这种做法可以定义一些在每个CARD里都需要定义的事件,而不需要重复说明。比如下面的例子给所有的CARD定义了BACK按钮以便返回上一页:   <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />   &quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt; <br /><br /><br />  Select  one: <br /><br />   <br />   Select  &quot;Links&quot;  button  to  view  the  links. <br /><br />第一卷 第七章 <br /><br /><br />程序允许用户输入数据才能发挥更多的作用,就是简单如选项选择也会给用户带来很大的方便。WML也提供了各种各样的数据输入机制。在WML上的数据输入原则只有一个:简单简单再简单。   <br /><br />  简单文本输入[TOP]   <br /><br />输入数据最简单的途径是,它允许用户输入字符串(可以进行一些规格化操作),并把输入结果保存到一个变量里。用户具体的输入方式跟所使用的终端有关。   <br /><br />&lt;input   <br /><br />  emptyok=&quot;true  |  flase&quot;   <br /><br />  format=&quot;STRING&quot;   <br /><br />  maxlength=&quot;NUMBER&quot;   <br /><br />  name=&quot;STRING&quot;   <br /><br />  size=&quot;NUMBER&quot;   <br /><br />  tabindex=&quot;NUMBER&quot;   <br /><br />  title=&quot;STRING&quot;   <br /><br />  type=&quot;text  |  password&quot;   <br /><br />  value=&quot;STRING&quot;   <br /><br />  xml:lang=&quot;STRING&quot; <br /><br />   <br /><br />emptyok:如果设为true,则用户可以不输入任何字符。一般情况下带有format属性的input要求用户必须按照一定格式输入数据(有时不允许输入空字符串,比如日期),所以此属性默认值为false; <br /><br />format:输入掩码,用来规定用户输入格式; <br /><br />maxlength:输入字符串的最大长度,默认为无限; <br /><br />name:必选。存储输入数据的变量名称。如果该变量已经定义并且其值复合输入格式,则变量的值直接作为input的默认值,否则取value属性的值作为默认值; <br /><br />size:输入区的宽度; <br /><br />tabindex:CARD中输入元素的tab顺序号; <br /><br />title:输入区的提示字符串; <br /><br />type:输入类型,默认为word。如果为password,则用户输入字符显示成“*”; <br /><br />value:input的默认值,如果name指定的变量可用,本属性被忽略; <br /><br />xml:lang:语言编码。 <br /><br />下面的例子演示了简单的用户输入:   <br /><br />  User  Name:   <br /><br />  Country:   <br /><br />  &lt;input  name=&quot;country&quot;  maxlength=&quot;2&quot;  emptyok=&quot;true&quot;   <br /><br />   value=&quot;CN&quot;  tabindex=&quot;2&quot;  /&gt; <br /><br />  Password:   <br /><br />  &lt;input  name=&quot;password&quot;  maxlength=&quot;8&quot;   <br /><br />   type=&quot;password&quot;  tabindex=&quot;3&quot;  /&gt; <br /><br /><br /><br />显示结果如下:输入前: <br /><br />----  User  login  ----   <br /><br />User  Name:[]   <br /><br />Country:[CN]   <br /><br />assword:[]   <br /><br />输入后:----  User  login  ----   <br /><br />User  Name:[wap86]   <br /><br />Country:[CN]   <br /><br />assword:[*******] <br /><br />fieldset&gt;  复合数据输入  [TOP]   <br /><br />一般来说,很少再一个CARD里放很多个数据输入元素。因为大多数WAP终端屏幕很小,不能在一个屏幕上显示很多输入区。所以,终端必须决定如何处理用户输入界面,比如元素是否因该显示成上下滚动的列表。也许一个页面上显示一个输入是最直观的方式。每个用户终端有不同的方式处理这个问题。其实WML已经提供了两种途径来达到最佳效果。   <br /><br />第一个途径就是CARD元素的ordered属性。通常,ordered设为true,表示CARD里的内容表现为一个线性列表,也许会显示很多页,就象前面那个例子。但是如果你把ordered设为false,则某些终端会把输入列表先列出来,如果你的输入项目不是很多的话(比如email,包括地址、主题和内容),可以在一个屏幕上显示出来。不过,然而,但是,非常可惜,目前国内市面有售的手机几乎都不支持。 <br /><br />如果你碰到更复杂的情况,那就要用到第二种方法:元素。它可以帮助你组织一系列文字和输入框,可以形成多个组。它告诉用户终端这些元素之间的关系以便更好地显示并引导用户输入。这种做法看起来有点象虚拟的页面,可以让用户分层输入。 <br /><br />的语法如下: <br /><br />&lt;fieldset   <br /><br />  title=&quot;STRING&quot;   <br /><br />  xml:lang=&quot;STRING&quot;   <br /><br />  ,  数据输入元素,  文本   <br /><br />   <br /><br />title:用来在用户终端上显示的组名称; <br /><br />xml:lang:语言编码。 <br /><br />有两点需要注意:1、可以嵌套;2、只能使用上面所列出的几种元素类型。 <br /><br />下面例子演示了使用进行数据输入: <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot;   <br /><br />&quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt;   <br /><br /><br />  First  Name:   <br /><br /><br />  Last  Name:   <br /><br />  Address:   <br /><br />  city:   <br />   <br /><br />  province:   <br /><br /><br /><br />  country:   <br /><br /><br />  Post  NO:   <br />     <br /><br />  Phone:   <br /><br /><br /><br />  Fax:   <br /><br /><br />  Email:   <br /><br /><br />  选择  <br /><br />在WML中可以定义输入选项。选项可以嵌套,可以定义默认值,也可以在用户做出选择时触发任务。   <br /><br />基本的选项列表用定义,语法如下:   <br /><br />&lt;select   <br /><br />    iname=&quot;STRING&quot;   <br /><br />    ivalue=&quot;STRING&quot;   <br /><br />    multiple=&quot;true  |  false&quot;   <br /><br />    name=&quot;STRING&quot;   <br /><br />    tabindex=&quot;NUMBER&quot;   <br /><br />    title=&quot;STRING&quot;   <br /><br />    value=&quot;STRING&quot;   <br /><br />    xml:lang=&quot;STRING&quot;   <br /><br />&gt;   <br /><br /><br />iname:保存用户选择索引值的变量。索引值表示选项在中的顺序,从1开始计算。0代表用户没有选择; <br /><br />ivalue:保存默认选择索引值的变量。只有iname属性没有指定的时候,这个属性才起作用; <br /><br />name:保存用户选择文本的变量。 <br /><br />value:保存默认选择文本的变量。只有name属性没有指定的时候,这个属性才起作用; <br /><br />multiple:是否允许多重选择。如果为true,用户就可以一次选择多个选项。这时候也会在name指定的变量里保存多个选择,用分号(;)分开,同样也适用于iname; <br /><br />title:用来显示的标题; <br /><br />tabindex:CARD中输入元素的tab顺序号; <br /><br />xml:lang:语言编码。 <br /><br />选项内的单独选择项用定义,语法如下: <br /><br />&lt;option   <br /><br />    onpick=&quot;URL&quot;   <br /><br />    title=&quot;STRING&quot;   <br /><br />    value=&quot;STRING&quot;   <br /><br />    xml:lang=&quot;STRING&quot;   <br /><br />&gt;   <br /><br />    文本,     <br /><br />   <br /><br />onpick:都被选择或取消选择时激发onpick事件; <br /><br />title:用来显示的标题; <br /><br />value:返回给中name属性的文字。 <br /><br />xml:lang:语言编码。 <br /><br />下面的例子演示了的用法: <br /><br />   <br /><br />&lt;!DOCTYPE  wml  PUBLIC  &quot;-//WAPFORUM//DTD  WML  1.1//EN&quot; <br /><br />&quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;&gt; <br /><br /> <br />  What&#39;&#39;s  your  sex?   <br /><br /><br /><br />  How  much  do  you  earn?   <br /><br /><br />    What&#39;&#39;s  your  hobbies?   <br /><br />复选框  [TOP]   <br /><br />进行分组,语法如下: <br /><br />&lt;optgroup   <br /><br />  title=&quot;STRING&quot;   <br /><br />    xml:lang=&quot;STRING&quot;   <br /><br />&gt;   <br /><br /><br />title:用来显示的标题; <br /><br />xml:lang:语言编码。 <br /><br />下面的例子把前面例子里的hobbiescard作了改动,提供更多的选择内容: <br /><br /><br />    What&#39;&#39;s  your  hobbies? <br /><br />第一卷 第八章 <br /><br />    ?????? <br /><br />、HTTP  1.1的简要介绍  [TOP] <br /><br />HTTP  1.1是一个基于文本的互联网实体信息交互主流协议,这里的实体可以是WAP兼容浏览器之类的用户终端,可以是WAP网关之类的代理服务器,也可以是Java  servlet之类的源服务器程序。它们之间的交互信息就是两大类:客户端对服务器端的请求(request)和服务器端对客户端的响应(response)。一次完整的交互包括一个请求和对它的响应。 <br /><br />所有的请求和响应都采用[RFC822]中定义的标准互联网消息格式,框架如下: <br /><br />*  消息定义   <br /><br />*  没有或多个消息头 <br /><br />*  CRLF(空行回车)   <br /><br />*  可选的消息本体   <br /><br />其中消息定义不分指定了发送消息的类型。请求和响应都可以包含多个消息头,用来进一步或者重新定义用户终端和服务器之间的交互。CRLF仅仅用来将信息定义和消息本体分开。   <br /><br />1、  请求  [TOP] <br /><br />在消息定义部分可以这样定义请求:  请求类型  URL  HTTP/1.1   <br /><br />其中请求类型可以是下面的一种:   <br /><br />①.  OPTION:返回请求者和相应者之间可以使用的通信选项,主要用来检测服务器处理能力; <br /><br />②.  GET:获得以URL标示的文件内容或者程序执行结果。服务器根据文件名后缀判断服务内容,比如该URL是静态文本还是一个程序; <br /><br />③.  HEAD:除了不返回响应的信息本体以外,得到的是跟GET一样的信息。一般用来测试链接的有效性、可达性和近期修改; <br /><br />④.  POST:把消息本体中的消息发送到一个URL或者其他类似的服务器端定义行为。通常用来提交一个HTML表单或者一些数据操作活动;   <br /><br />⑤.  PUT:把消息本体中的消息发送到一个URL,跟POST类似,但不常用; <br /><br />⑥.  DELETE:删除URL指定的资源; <br /><br />⑦.  TRACE:调用一个远程应用层请求消息回路。发出这个消息的用户终端除了收到原来的消息内容以外,还得到消息在Internet上的传送路径。   <br /><br />最常用的请求类型--也是我们在处理WAP应用时最关心的--是GET和POST。假设有一个WML文档,我们用UP的浏览器去浏览的话,就会向服务器发出如下GET请求: <br /><br />GET  www.wap86.com/index.wml  HTTP/1.1   <br /><br />accept-charset:  UTF-8   <br /><br />accept-language:  ch   <br /><br />accept:  text/vnd.wap.wml,  */*,  image/bmp,  text/html   <br /><br />user-agent:  UP.Browser/3.1-UPG1  UP.Link/3.2   <br /><br />host:  www.wap86.net <br /><br />……   <br /><br />其中粗体的部分是HTTP消息头,这里我们忽略了一些与我们关系不大的消息头。 <br /><br />accept-charset:  用户终端支持的字符集 <br /><br />accept-language:  用户终端目前使用的语言   <br /><br />accept:  用户终端可以接受的MIME文件类型   <br /><br />user-agent:  用户终端供应商提供的终端描述信息   <br /><br />host:  请求信息发送到的域名   <br /><br />2、  响应  [TOP] <br /><br />响应的消息定义部分一般是这样的:HTTP/1.1  状态码  状态描述  在[RFC2616]中定义了近40种不同的状态码(分成5组)。其中最常见的是3个: <br /><br />200  OK <br /><br />401  Unauthorized   <br /><br />404  Not  Found   <br /><br />继续上面那个例子,如果该URL合法的话,服务器的响应会是这样的:   <br /><br />HTTP/1.1  200  OK   <br /><br />Server:  www/5.0   <br /><br />Date:  Fri,  26  Oct  2000  12:15:23  GMT   <br /><br />Connection:  Keep-Alive   <br /><br />Content-Length:  1211   <br /><br />Content_Type:  text/vnd.wap.wml <br /><br />Last-Modified:  Mon,  22  Oct  2000  18:19:24  GMT <br /><br />&lt;!&lt;!DOCTYPE  wml  PUBLIC  “-//WAPFORUM//DTD  WML  1.1//EN”   <br /><br />“http://www.wapforum.org/DTD/wml_1.1.xml”&gt; <br /><br />…… <br /><br />其它内容   <br /><br />……   <br /><br />这个响应信息里包括了响应的数字代码和文本描述,然后是一组消息头。在一个换行符以后就是消息本体,在这里,消息本体就是www.wap86.net/index.wml的源代码。 <br /><br />Server:  发出响应的服务器   <br /><br />Date:  响应发出的时间 <br /><br />Connection:  指示用户终端保持连接   <br /><br />Content-Length:  响应信息的长度,从DECK的第一个&quot;&lt;&quot;字符开始计算 <br /><br />Content_Type:  响应的MIME类型   <br /><br />Last-Modified:  响应中DECK的最后修改时间   <br /><br />当用户终端接收到响应以后,会对其状态信息和消息头进行解码,然后决定对响应做出什么样的动作。如果收到OK响应,一般会把消息本体里的内容显示在屏幕上。对于桌面终端,通常是HTML,对于WAP浏览器,则是WML。   <br /><br />HTTP是一种很罗嗦的协议。即使是简单没有任何数据的请求和响应都要产生数百字节的消息。WAP通过WAP网关来解决这个问题。WAP网关一个很重要的功能就是把所有的HTTP1.1消息转换成无线任务协议(Wireless  Session  Protocol,  WSP)的消息格式。这种格式是压缩的二进制协议,兼容HTTP1.1。它能解析所有的请求和响应消息,并转换成最精简的BIT序列。   <br /><br />到这里我们已经介绍了HTTP1.1的主要内容。当然HTTP1.1还有很多复杂的内容,但是在这里并不打算多讲,如果你有兴趣,可以去相关网站查找它的资料。作者只想大家知道一点:用户终端和服务器之间还有比GET和POST请求更多的互动消息,它们一样有请求和响应消息头,并且可以包含一些信号来影响WAP应用程序的执行和性能。这正是提高WAP运行效率的秘密所在。 <br /><br />二、缓存(Caching)  [TOP] <br /><br />根据[RFC2616]的定义,缓存是:&quot;程序中响应消息的本地储存区以及控制这些消息储存、重新获取和删除的子系统。缓存保存可以缓存的响应消息以便降低将来的响应时间和网络带宽消耗,同样也适用于请求消息。&quot; <br /><br />由于WAP信道带宽的限制,我们在编写WAP应用的时候都希望最大限度地减少消息的传送量。要做到这一点,就要尽量地使用缓存,经常地从缓存中获得以前的消息。幸运的是目前大多数WAP设备都有一定级别的缓存,在默认情况下,会尝试最大化的缓存。几乎所有指向URL的响应都会被缓存下来。 <br /><br />当WAP用户终端缓存一个响应的时候,会保存几乎所有的信息:URL、响应文本、消息头以及其他可以验证响应的内容(参看下一节&quot;验证和历史堆栈&quot;)。每个被缓存的项目都可以根据它的URL组成部分(域名、路径、协议、参数、端口等等)唯一的识别。 <br /><br />有两种HTTP消息头可以让你控制WML的DECK缓存,对我们最重要的是Cache-Control消息头。它能够直接通过请求/响应链来控制所有的缓存实体。所有的缓存机制都必须遵守这些消息头的定义。Cach-Control消息头通常用来屏蔽一个设备的默认缓存行为。他们在消息链中传递时必须直接穿过所有的代理服务器和网关而不被改变。 <br /><br />*  Cache-Control:  no-cache。设定这个选项的URL不能被缓存,包括用户终端和所有处于内容服务器和用户终端之间的其他服务器;   <br /><br />*  Cache-Control:  max-age=。定义URL保存在设备缓存中的最长时间。时间到了以后,这个实体会从缓存中清除; <br /><br />*  Expired:  。指定URL在缓存中存放的最后日期期限。[RFC1123]定义了日期的格式,通常是这样的:Expires:  Sun,  29  October  2000  17:30:47  GMT   <br /><br />在写一个WAP应用的时候,你要先假设用户终端会尽量最大化缓存以便使向内容服务器获取信息的动作减少到最少。下面做些解释:   <br /><br />1、  永久缓存URL  [TOP] <br /><br />WAP用户终端通常会尽量长地在它的缓存中保存存取过的URL,这个&quot;尽量长&quot;在Phone.com浏览器中的定义是大约30天。不过,也许你会想把一个URL的缓存时间尽量延长,比如你公司的LOGO,这样每次打开页面的时间就会减少。用下面两种方法能够很简单地实现:   <br /><br />*  指定一个离现在很远的过期日,比如:Expires:  Tue,  01  Jan  2002  00:00:00  GMT;   <br /><br />*  指定一个很大的缓存时间,如:Cache-Control:  max-age=3153600。这个例子可以让URL缓存一年。用户终端允许的最大整数是2,147,483,647,所以你可以让一个URL保存超过68年之久。当然,到那个时候,你的手机早就那报废了。   <br /><br />2、  指定对URL的缓存时间  [TOP] <br /><br />通常的情况是对一个URL你只需要缓存一段时间。比如股票报价系统,网页可能需要5分钟更新一次,那么你只要在DECK的HEAD部分指定Cache-Control:  max-age=300就行了。  如果用户在5分钟以内再次检索该页面,看到的还是缓存里的网页。如果在5分钟以后,就会到服务器上获取最新的数据。   <br /><br />另外一种控制缓存时间的方法是使用前面提到过的Expires,不过这种方法只能告诉用户终端:只要过了指定时间,无论什么时候访问页面都要刷新。如果你下次要控制时间,只能改变Expires里的时间值。   <br /><br />3、  禁止对URL的缓存  [TOP] <br /><br />对于快速变化的内容,一般都会希望每次都得到最新的数据。所以这个时候要完全禁止对相关网页的缓存。方法有三种:   <br /><br />*  设定Cache-Control:  no-cache;   <br /><br />*  设定最大缓存时间为0,Cache-Control:  max-age=0;   <br /><br />*  设定缓存到期日为一个早就过去的日期,Expires:  Mon,  1  Jan  1990  00:00:00  GMT。   <br /><br />实际上,后两种不是最好的选择。首先这样会多占用终端的处理时间,因为当碰到这个DECK时,终端需要计算一下过期时间。其次,这样会多占用一些字节,而且在表达上也不够清楚。   <br /><br />三、验证(validation)和历史堆栈(History  Stack)  [TOP] <br /><br />在HTTP1.1中对缓存进一步提出了验证的概念。验证的目的就是检验缓存项目是否在有效期内。由于历史堆栈的存在,WAP终端上的验证过程变得有点复杂。   <br /><br />WAP标准规定所有的WAP设备都至少要有可以容纳10-个项目的历史堆栈。当用户按下由定义的后退(backward)链接,URL被弹(pop)出。   <br /><br />一般情况下,所有的前行链接都会被验证,而后退链接则不会,因为它已经在cache里了。可是我们有时候还是希望当用户按下后退键时依然能够得到最新的数据。如果终端总是不予验证的话,那用户只好找到主菜单再重新进入那个页面。   <br /><br />幸运的是,我们用Cache-Control:must-revalidate就可以强迫用户终端在用户按back时对URL进行验证。当然,进行验证并不是说该页面会立刻重新读取,而是根据他是否过期来决定。如果没有过期,验证的结果仍然是显示缓存中的页面。   <br /><br />如果你需要每次back都重新读取页面,用Cache-Control:must-revalidate,  no-cache可以实现。另外,把  no-cache换成max-age=300就可以在back时对已缓存了300秒的页面进行刷新。   <br /><br />四、HTTP头与meta元素  [TOP] <br /><br />到这里,大家已经知道HTTP消息头的在WAP页面的作用了。不过要在WML文档里设置这些消息头,就要用到meta元素,它只能出现在WML文档段里。下面是几个消息头和它们的表示形式:   <br /><br />Expires:  Mon,  10  Jan  2000  00:00:00  GMT   <br /><br />Cache-Control:  max-age=300   <br /><br />Cache-Control:  no-cache<br />From: http://www.157g.cn/read.php?tid=352  Powered by PHPWind.com
回复

使用道具 举报

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
QQ客服返回顶部