﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Kelven Cheung-文章分类-WML</title><link>http://www.blogjava.net/zhangrenquan/category/10888.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:25:40 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:25:40 GMT</pubDate><ttl>60</ttl><item><title>WML语言与编程</title><link>http://www.blogjava.net/zhangrenquan/articles/45147.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 09 May 2006 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/45147.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/45147.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/45147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/45147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/45147.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: WAP								构架																																										¨         								WML				是一种适用于无线互连网的标记语言。														¨         								WAP				（				Wireles...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhangrenquan/articles/45147.html'>阅读全文</a><img src ="http://www.blogjava.net/zhangrenquan/aggbug/45147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-05-09 09:43 <a href="http://www.blogjava.net/zhangrenquan/articles/45147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WML语言介绍</title><link>http://www.blogjava.net/zhangrenquan/articles/35803.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 17 Mar 2006 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/35803.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/35803.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/35803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/35803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/35803.html</trackback:ping><description><![CDATA[这里介绍WAP协议标准组织所制定的标记语言WML，由于和以前介绍的HDML在手机浏览器专用网页的特征上基本一致，所以概念部分就略去了，直接讲述语言。 
<p class="lan7">１.基本规则*</p><p>WML使用XML文档字符集，目前支持Unicode 2.0，和HDML不同，WML的所有标签，属性和规定的可接收值必须小写，CARD的名字和变量也是区分大小写的。和HDML一样，对于连续的空字符，只显示一个空格。标签内属性的值必须用"或者’括起来，属性名，＝和值之间不能有空格。对于不成对出现的标签，必须在&gt;前加/，比如&lt;br/&gt;。</p><p>在对变量的引用上和HDML基本相同，有：$(var1:esc)$(var1:noesc)$(var1:unesc)三种形式，具体含义参见前面HDML的相关部分。在对保留字符的处理上也基本相同，对应的取代字符有：&lt; &lt;&gt; &gt;?’ &amp;apos;" "&amp; &amp;$ $$空格 - -这里要指出的是在URL的传递过程中，用来连接参数的&amp;必须转化为&amp;。</p><p class="lan7">２.基本格式和文件头</p><p>wml文件的一般格式：</p><p>&lt;?xml version="1.0"?&gt; &lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//<br />DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;&lt;wml&gt;&lt;head&gt; &lt;access/&gt; &lt;meta..../&gt; &lt;/head&gt; &lt;card&gt;Some contents... &lt;/card&gt;&lt;wml&gt;Some contents...</p><p>结构看上去和HTMl文件很类似，对于每一个DECK，在其文档开头必须指明以下的类型声明。</p><p>千万注意字母的大小写。对于一个DECK，其文件大小最好不要超过1.2K。</p><p>标签和HTML中的标签一样，用来表明这是一个WML的DECK，它有一个可选的xml:lang属性来制定文档的语言，比如表示文档语言为中文。</p><p>和HTML一样，标签包含了该DESK的相关信息。标签之间可以包含一个标签和多个标签。</p><p>相当于HTML中的标签，指定该DECK的访问控制信息，它用两个可选的属性，domain用来指定域，默认值为当前域，path用来指定路径，默认值为"/"，即根目录。由于单独使用，所以要用/结尾，以后对于类似的情况不再赘述。</p><p>和HTML中的类似，提供了该DECK的meta信息。属性是必选的，包括一下三种情况name="name" UP.Link Server忽略meta数据http-equiv="name" UP.Link Server将meta数据转为HTTP响应头(同HTML)user-agent="agent" UP.Link Server直接将meta数据传给手机设备content属性也是必选的，其内容根据属性而定。scheme属性目前尚不支持。forua为可选属性，指定在该wml文件传到客户端之前，标签是不是被中间代理删除(因为传输的协议可能改变)，默认值为false。</p><p>目前支持的meta数据:指定DECK在手机内存缓存中的存储时间段，默认的为30天(除非内存耗尽)，在该期间，手机对于访问过的DECK直接从缓存里调用。如果信息是对时间敏感的，可以用max-age指定DECK在缓存里的生存期，最小单位是秒，如果指定为0，则每次都需通过连接服务器来调用该DECK。<br /><br />类似于普通浏览器的书签功能。当用户将一个CARD做了书签后，手机浏览器首先用一个标记记录该CARD，这个标记默认的是标签中的title属性(以后会讲到)，然后当用户选择了该书签以后，浏览器就会打开被记录的URL。但是因为在默认的情况下，手机会记录所有的DECK，所以，一般被用来使手机不要记录当前的URL，即不用title属性。此外，如果要为书签指定不同于当前DRECk的URL，则需用title属性。</p><p>一个DECK可以包含多个CARD，每个CARD的内容可能不止一屏显示，注意DECK，CARD和屏幕显示范围的关系。一个CARD可以包含以下可选的属性：*id属性用来指定CARD的名字，可用来在CARD间跳转，相当于在HTML中在页内跳转时用。</p><p>*title属性用来作为书签的标记，该属性一般不会显示在屏幕上。</p><p>*newcontext属性，默认值为false，用来指示当跳转到本CARD时，手机是不是要清除以前保留的信息，包括变量，堆栈里的历史记录，重新设置手机状态等。</p><p>*ordered属性，默认值是true，表明该CARD里的内容是按固定的顺序显示，还是按用户的选择来显示。这点和HTMl不同，CARD页面里的内容可以按一定的顺序显示，默认的是按线性顺序显示，即按代码的顺序，但是，要注意的是，以下三个标签必须按以下顺序来写，(这和以后要讲的“事件”有关)。这样做是为了方便填表单，当ordered设置为true时，如果一个表单的内容不能在一屏里显示完，就分成多屏显示；当ordered设置为false时，手机可以显示一个概要CARD来总结有效的选项，用户可以从中选取表单选项来填写。</p><p>*onXXX属性，类似于HTML标签中的onXXX属性，用来捕捉事件，当事件被触发时执行指定的操作(任务)，在这里是转向某个URL。</p><p><span class="lan7">３.显示文本</span></p><p>在文本的显示上WML基本和HTML相同。文字段落包含在&lt;p align= "alignment" mode=" wrapmode"&gt;和&lt;/p&gt;之间，align属性指定该段文字的对齐方式，默认的是left，其他可选择right和center；mode属性指定当一行显示不下所有的文字时是否自动换行，默认的是自动换行wrap，如果选nowrap，则在一行中显示，浏览器会通过类似于水平滚动条的机制来显示所有文字。换行标签也一样为&lt;br/&gt;，这里先替一下，在标单中如果有多个&lt;input&gt;或者&lt;select&gt;，其间不要用&lt;br/&gt;，否则会使手机浏览器认为是断点而把表单分页显示。</p><p>文字的修饰标签有&lt;b&gt;、&lt;i&gt;、&lt;u&gt;、&lt;em&gt;、&lt;strong&gt;、&lt;big&gt;和&lt;small&gt;，意义和HTML里的相同。</p><p>表格的显示标签也和HTML相近，使用&lt;table title="name" align="left|right|center" columns="列数"&gt;、&lt;tr&gt;和&lt;td&gt;来显示，&lt;table&gt;的title属性用来给表格命名，columns属性指定表的列数，不能为0，可选的align属性和前面提到的一样是对齐方式。表格中可以包含文字和图片。 </p><p>test1.wml--------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;&lt;wml&gt;&lt;card&gt;&lt;p align="center"&gt;&lt;i&gt;Hello&lt;/i&gt;&lt;br/&gt;&lt;b&gt;&lt;i&gt;World!&lt;/i&gt;&lt;/b&gt;&lt;table title="mytable" align="right" columns="2"&gt;&lt;tr&gt;&lt;td&gt;1-1&lt;/td&gt;&lt;td&gt;1-2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2-1&lt;/td&gt;&lt;td&gt;2-2&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;<br /><br />４.显示图片</p><p>显示图片(1位黑白BMP图片)的标签一样类似于HTML，&lt;img alt="text" src="url" localsrc="icon" align="left" height="n" width="n" vspace="n" hspace="n"/&gt;，属性中alt和src是必须要有的，其他可选。另外要注意的是&lt;img&gt;要放在&lt;p&gt;里，不能放在&lt;do&gt;和&lt;option&gt;等功能健标签和选单标签里。</p><p>*alt属性用来指定当手机不支持图片显示时用来显示的文字。</p><p>*src属性指定图片的URL，但当有了以下的localsrc属性时，手机浏览器就忽略src属性。</p><p>*localsrc属性用来指定显示存在手机ROM中的图标，如果找不到，则到UP.Link Server上去找。</p><p>*可选的align属性用来表明图片同当前行文本的对齐方式，默认值为bottom，可选to和middle。</p><p>*height、width、vspace、hspace属性分别指定图片的长宽和距环绕文字的间距，目前不是所有的WAP手机都支持这些属性。</p><p>test2.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;&lt;wml&gt;&lt;card&gt;&lt;p align="center"&gt;&lt;img alt=":)" src="xxx.bmp" localsrc="smileyface"/&gt;&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;</p><p class="lan7">５.锚和任务</p><p>连接是HTML页面里最基本的功能，在WML里也一样用&lt;a href="url" title="label"&gt;和&lt;/a&gt;来包括用来建立连接的文字，必选属性href指定了要打开的URL，可选的title属性给该连接取个标记名字，这个名字将作为软按钮之一的ACCEPT键(详见以前的HDML入门文章)的标记显示在屏幕的软按钮区，所以通常可以将属性作为提示文字使用。</p><p>然而，以上的连接在WML里只是任务的一种情况，为了能够使用其它任务，所以引进了新的标签&lt;anchor title="label"&gt;任务标签文本&lt;/anchor&gt;，&lt;a&gt;其实是当任务标签为&lt;go/&gt;时的简单表示方式。</p><p>test3.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" </p><p>"http://www.wapforum.org/DTD/wml_1.1.xml"&gt;&lt;wml&gt;&lt;card&gt;&lt;p&gt;&lt;anchor title="Link1"&gt;&lt;go href="test1.wml"/&gt;News&lt;/anchor&gt;&lt;br/&gt;&lt;a title="Link2" href="test2.wml"&gt;Sports&lt;/a&gt;&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;WML里的任务标签有以下几种，除了用于&lt;anchor&gt;，还可以用在事件中：1)&lt;go&gt;用来指示浏览器显示指定的URL，包括DECK的第一个CARD或者指定的CARD。语法如下:&lt;go href="url" sendreferer="false|true" method="get|post" accept-charset="charset"&gt;&lt;postfield name="name" value="value"/&gt;&lt;setvar name="name" value="value"/&gt;&lt;/go&gt;其中href属性为必选，其他为可选。</p><p>sendreferer属性表示是否传递调用href所指定的URL的页面的URL，也就是当前页的URL，即HTTP头中的HTTP_REFERER，默认值为false，可选值为true。method和HTML中的表单FORM的method属性一样，指定表单是以get的方式还是post的方式递交，以便cgi处理，默认的值为get，但如果未指定method但&lt;go&gt;&lt;/go&gt;间存在&lt;postfield&gt;，手机自动以post方式传递。accept-charset属性可覆盖在HTTP头里指定的字符集，可以写多个字符集，如accept-charset="UTF-8,US-ASCII, ISO-8859-1"。<br /><br />1)&lt;postfield name="name" value="value"/&gt;可以看作是HTML表单FORM中的&lt;INPUT TYPE="HIDDEN" NAME="变量名" VALUE="值"&gt;，通过它可以向指定的URL传递以“变量名/值”形式的数据。name和value属性都是必选的。注意只有这里的变量是用来递交给CGI程序的。</p><p>除了&lt;postfield&gt;，还可以在&lt;go&gt;和&lt;/go&gt;间加入一句或者多句&lt;setvar name="name" value="value"/&gt;，该语句的意思是，当触发某一事件时，给变量赋值。</p><p>要注意的是，当&lt;go&gt;和&lt;/go&gt;之间没有任何语句时，要用&lt;go/&gt;的形式，这点比较特别，比如&lt;anchor title="Link1"&gt;&lt;go href="test.wml"/&gt;News&lt;/anchor&gt;。</p><p>2)&lt;prev&gt;用来将当前页面的URL压入URL历史堆栈，并打开此前的URL，若该URL不存在，则&lt;prev&gt;无效。语法类似&lt;go&gt;：&lt;prev&gt;&lt;setvar name="name" value="value"/&gt;&lt;/prev&gt;，&lt;prev&gt;和&lt;/prev&gt;之间可加入一句或多句&lt;setvar name="name" value="value"/&gt;，若不加，则必须变成&lt;prev/&gt;的形式。</p><p>3)&lt;refresh&gt;用来刷新当前的页面，从而使得页面内的变量刷新，语法为&lt;refresh&gt;&lt;setvar name="name" value="value"/&gt;&lt;/refresh&gt;。</p><p>4)&lt;noop&gt;，表示什么也不做，该标签不能用在&lt;anchor&gt;中，一般用在覆盖DECK级的&lt;do&gt;(后面会有说明)。</p><p class="lan7">６.显示表单</p><p>类似于HTML的&lt;FORM&gt;，&lt;fieldset&gt;可用来包括一组表单选项，但不是必须的。前面说过，当&lt;card&gt;的ordered设置为false时，手机可以显示一个概要CARD来总结有效的选项，方便用户从中选取表单选项来填写，概要CARD就是根据&lt;fieldset&gt;和独立的输入框&lt;input&gt;以及选单&lt;select&gt;来总结的。语法为，&lt;fieldset title="label"&gt;表单内容&lt;/fieldset&gt;，可选的title属性除了可用来表示表单的名字外，还在概要CARD里作为选择项的标题。表单内容可以是嵌套的&lt;fieldset&gt;，输入框&lt;input&gt;，选单&lt;select&gt;和必要的提示文本。</p><p>&lt;input name="variable" title="label" type="type" value="value" default="default" format="specifier" emptyok="false|true" size="n" maxlength="n" tabindex="n"/&gt;，用来输入文本，除了name属性是必要的，其他可选。</p><p>*name属性，指定了用来存储该输入文本的变量名字。</p><p>*title属性，该输入框的名字，同样可被用来作为概要CARD页中的选项名。</p><p>*type属性，默认值为text，如选择password，则输入的数据显示为*。</p><p>*value属性，在语法和行为上等同于下面的default属性，*default属性，指定输入框的默认值，即name属性指定变量的默认值，当用户输入新值时，该值无效，如果该值不符合以下format属性的规定，则手机也忽略该默认值。</p><p>*format属性，用来格式化输入的数据，可用的标记如下，使用时可用“一位数字标记”和“*标记”的形式，前者代表N个标记型字符，如3X，后者代表任意个(小于maxlength属性的值)标记型字符。<br /><br />&lt;optgroup&gt;可用来将多个&lt;option&gt;分组，&lt;optgroup&gt;和&lt;/optgroup&gt;间还可包括&lt;optgroup&gt;和&lt;option&gt;，该标签目前尚未被支持。</p><p>&lt;option&gt;，类似于HTML中选单的&lt;OPTION&gt;，用来表示选单的可选项。&lt;option&gt;和&lt;/option&gt;间可包括事件(见下节)和选单的显示文本。&lt;option&gt;的属性为可选，其中value属性用来提供值，当选到该项后，将该值赋给&lt;select&gt;的name属性所指定的变量。onpick属性，用来指定用户选到该项并按ACCEPT键后所打开页面的URL。</p><p>test5.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;</p><p>&lt;wml&gt;&lt;card id="card0" ordered="false"&gt;&lt;p&gt;Please select a city...&lt;select title="Cities List" name="city"&gt;&lt;option title="Beijing" value="c1"&gt;Beijing&lt;/option&gt;&lt;option title="Shanghai" value="c2"&gt;Shanghai&lt;/option&gt;&lt;option title="Hongkong" value="c3"&gt;Hongkong&lt;/option&gt;&lt;/select&gt;Please select columns...&lt;select title="Column List" multiple="true" name="col"&gt;&lt;option title="Hot News" value="l1"&gt;News&lt;/option&gt;&lt;option title="Cool Sports" value="l2"&gt;Sports&lt;/option&gt;&lt;option title="Pop Enter,,," value="l3"&gt;Entertainment&lt;/option&gt;&lt;/select&gt;&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;</p><p class="lan7">７.事件</p><p>WML的事件基本上分为两大类，一类是键盘(包括软硬按钮)输入事件，用&lt;do&gt;标签来处理，另一类是相关页面内部的事件，用&lt;onevent&gt;标签来处理。</p><p>&lt;do&gt;的语法如下：&lt;do type="type" label="label" name="name" optional="false|true"&gt;任务&lt;/do&gt;，任务就是以前提到的四种任务。&lt;do&gt;的属性中，type是必选的，其他为可选。</p><p>*label属性，指定了软按钮在屏幕上的显示文本。目前type属性为delete，help，prev时该属性无效。</p><p>*name属性，为&lt;do&gt;取个名字，同一的CARD里的&lt;do&gt;不能重名。如果CARD级的&lt;do&gt;和DECK级的&lt;do&gt;同名，则覆盖DECK级的&lt;do&gt;。</p><p>*optional属性，指定手机是不是可以忽略这个事件，默认值是false。</p><p>*type属性，指定触发的事件，具体如下；type值触发原因accept调用ACCEPT按钮机制delete调用DELETE按钮机制help调用HELP按钮机制options调用选择按钮机制prev调用PREV按钮机制reset调用清除和重新设定手机状态时的RESET机制(目前不支持)unknown调用unknown机制，等于type=""(目前不支持)vnd. co-type调用厂商特定的机制(目前不支持)X-*, x-*供以后使用(不保留)(目前不支持)test6.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;&lt;wml&gt;&lt;head&gt;&lt;meta http-equiv="Cache-Control" content="max-age=0"/&gt;&lt;/head&gt;&lt;card id="card0" ordered="false"&gt;&lt;do type="accept" label="InputName" name="do1"&gt;&lt;go href="#card01"/&gt;&lt;/do&gt;&lt;p&gt;NAME:&lt;input name="userName" title="User Name" type="text" format="*M" emptyok="false" maxlength="12"/&gt;&lt;/p&gt;&lt;/card&gt;&lt;card id="card01"&gt;&lt;p&gt;You name is $(userName:noesc).&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;&lt;onevent&gt;的语法如下，&lt;onevent type="type"&gt;任务&lt;/onevent&gt;，必选属性type的取值如下:type值如果用户执行了以下操作就执行任务onpick用户选择或不选一个&lt;option&gt;项时。<br /><br />标记描述A任何符号或者大写字母(不包括数字)a任何符号或者小写字母(不包括数字)N任何数字(不包括符号或者字母)X任何符号、数字或者大写字母(不可改变为小写字母)x任何符号、数字或者小写字母(不可改变为大写字母)M任何符号、数字或者大写字母(可改变为小写字母)或者多个字符，默认为首字大写m任何符号、数字或者小写字母(可改变为大写字母)或者多个字符，默认为首字小写*maxlength属性，指定了用户可输入的最大字符长度，最大限制为256个字符。</p><p>*emptyok属性，表示用户可否不填输入框，默认为false，即要填。</p><p>*size属性，输入框显示长度，目前未被支持。</p><p>*tabindex属性，类似于在HTML表单中按TAB键后，焦点落在哪个选项上，该值决定了这个选择顺序，数字大的排在后面。目前未被支持。</p><p>test4.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;</p><p>&lt;wml&gt;&lt;card id="card1" ordered="false"&gt;&lt;p&gt;USERNAME:&lt;input name="userName" title="User Name" type="text" value="YourNameHere" format="*M" emptyok="false" maxlength="12" tabindex="1"/&gt;PASSWORD:&lt;input name="password" title="Password" type="password" format="8x" emptyok="false" maxlength="8" tabindex="2"/&gt;COMMENTS:&lt;input name="comments" title="comment" type="text" value="YourCommentsHere" format="*M" emptyok="true" maxlength="30" tabindex="3"/&gt;&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;将上例&lt;card&gt;中的odered的值改为"true"试试看，然后再在&lt;p&gt;和&lt;/p&gt;内加入&lt;fieldset title="field1"&gt;和&lt;/fieldset&gt;试试看。</p><p>&lt;select&gt;选单类似于HTML表单中的&lt;SELECT&gt;，&lt;select&gt;和&lt;/select&gt;间可包含&lt;optgroup&gt;和&lt;option&gt;标签，语法如下，所有属性都为可选：&lt;select title="label" multiple="false|true" name="variable" default="default" iname="index_var" ivalue="default" tabindex=" n"&gt;&lt;optgroup title="label"&gt;选单内容&lt;/optgroup&gt;&lt;option title="label" value="value" onpick="url"&gt;事件或者文本&lt;/option&gt;&lt;/select&gt;*title属性，如以上&lt;input&gt;的title属性。</p><p>*multiple属性，指定用户可否进行多项选择，默认值为false。</p><p>*name属性，用来存储用户选择项的变量名，其值为&lt;option&gt;标签的value属性，若用户没有选择又没有用default属性指定默认值，则手机将改变量赋值为空字符串""，对于多项选择，每个值用“;”分开。<br /><br />*default属性，可为name属性指定的变量赋默认值。</p><p>*iname属性，用来记录用户选择项的位置，相应的值从1开始。若没选，则该值为0。</p><p>*ivalue属性，用来记录默认值所在的位置。<br /><br />onenterforward用户使用&lt;go&gt;任务到达一个CARD时。</p><p>onenterbackward用户使用&lt;prev&gt;任务返回到前面的CARD时，或者按BACK按钮时。</p><p>ontimer当&lt;timer&gt;过期时。</p><p>test7.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;&lt;wml&gt;&lt;head&gt;&lt;meta http-equiv="Cache-Control" content="max-age=0"/&gt;&lt;/head&gt;&lt;card id="card0" ordered="false"&gt;&lt;p&gt;Please select a city...&lt;select title="Cities List" name="city"&gt;&lt;option title="Beijing" value="Beijing"&gt;&lt;onevent type="onpick"&gt;&lt;go href="#card01"/&gt;&lt;/onevent&gt;Beijing&lt;/option&gt;&lt;option title="Shanghai" value="Shanghai" onpick="#card01"&gt;Shanghai&lt;/option&gt;&lt;option title="Hongkong" value="Hongkong" onpick="#card01"&gt;Hongkong&lt;/option&gt;&lt;/select&gt;&lt;/p&gt;&lt;/card&gt;&lt;card id="card01"&gt;&lt;p&gt;You are Living in $(city:noesc)&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;&lt;timer/&gt;可以用来在用户不进行任何操作的一段时间后，自动执行一个任务，任何激活CARD页面的任务和用户操作都会启动&lt;timer/&gt;，而任务进行时，&lt;timer/&gt;就停止。每个CARD只能有一个&lt;timer/&gt;，一个&lt;timer/&gt;只能触发一个任务。语法如下：&lt;timer name="variable" value="value"/&gt;，其中name为可选属性，指定为一个变量名，当退出该CARD时，该变量存储此时定时器的值，当定时器超时时，手机将该变量设为0；value为必选属性，用来设置定时器的定时值，最小单位为0.1秒。</p><p>test8.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;</p><p>&lt;wml&gt;&lt;head&gt;&lt;meta http-equiv="Cache-Control" content="max-age=0"/&gt;&lt;/head&gt;&lt;card id="card1" ontimer="#card2"&gt;&lt;timer name="time1" value="50"/&gt;&lt;p align="center"&gt;After 5s, goto card2&lt;/p&gt;&lt;/card&gt;&lt;card id="card2"&gt;&lt;onevent type="ontimer"&gt;&lt;go href="#card1"/&gt;&lt;/onevent&gt;&lt;timer name="time2" value="50"/&gt;&lt;p align="center"&gt;Here is card2!&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;再提一下，&lt;onevent&gt;&lt;timer&gt;&lt;do&gt;三者必须按以上顺序写。</p><p>此外在DECK级还可以加入&lt;template&gt;，用来将事件捆绑在DECK级上，语法如下：&lt;template onenterforward="url" onenterbackward="url" ontimer="url"&gt;&lt;do&gt;或者&lt;onevent&gt;&lt;/template&gt;test9.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;&lt;wml&gt;&lt;head&gt;&lt;meta http-equiv="Cache-Control" content="max-age=0"/&gt;&lt;/head&gt;&lt;template&gt;&lt;do type="accept" label="deckPress" name="do1"&gt;&lt;go href="#card01"/&gt;&lt;/do&gt;&lt;/template&gt;&lt;card id="card0" ordered="false"&gt;&lt;do type="accept" label="cardPress" name="do1"&gt;&lt;go href="#card02"/&gt;&lt;/do&gt;&lt;p&gt;Press ACCEPT...&lt;/p&gt;&lt;/card&gt;&lt;card id="card01"&gt;&lt;p&gt;Here is card01&lt;/p&gt;&lt;/card&gt;&lt;card id="card02"&gt;&lt;p&gt;Here is card02&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;<br /><br />onenterforward用户使用&lt;go&gt;任务到达一个CARD时。</p><p>onenterbackward用户使用&lt;prev&gt;任务返回到前面的CARD时，或者按BACK按钮时。</p><p>ontimer当&lt;timer&gt;过期时。</p><p>test7.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;&lt;wml&gt;&lt;head&gt;&lt;meta http-equiv="Cache-Control" content="max-age=0"/&gt;&lt;/head&gt;&lt;card id="card0" ordered="false"&gt;&lt;p&gt;Please select a city...&lt;select title="Cities List" name="city"&gt;&lt;option title="Beijing" value="Beijing"&gt;&lt;onevent type="onpick"&gt;&lt;go href="#card01"/&gt;&lt;/onevent&gt;Beijing&lt;/option&gt;&lt;option title="Shanghai" value="Shanghai" onpick="#card01"&gt;Shanghai&lt;/option&gt;&lt;option title="Hongkong" value="Hongkong" onpick="#card01"&gt;Hongkong&lt;/option&gt;&lt;/select&gt;&lt;/p&gt;&lt;/card&gt;&lt;card id="card01"&gt;&lt;p&gt;You are Living in $(city:noesc)&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;&lt;timer/&gt;可以用来在用户不进行任何操作的一段时间后，自动执行一个任务，任何激活CARD页面的任务和用户操作都会启动&lt;timer/&gt;，而任务进行时，&lt;timer/&gt;就停止。每个CARD只能有一个&lt;timer/&gt;，一个&lt;timer/&gt;只能触发一个任务。语法如下：&lt;timer name="variable" value="value"/&gt;，其中name为可选属性，指定为一个变量名，当退出该CARD时，该变量存储此时定时器的值，当定时器超时时，手机将该变量设为0；value为必选属性，用来设置定时器的定时值，最小单位为0.1秒。</p><p>test8.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;</p><p>&lt;wml&gt;&lt;head&gt;&lt;meta http-equiv="Cache-Control" content="max-age=0"/&gt;&lt;/head&gt;&lt;card id="card1" ontimer="#card2"&gt;&lt;timer name="time1" value="50"/&gt;&lt;p align="center"&gt;After 5s, goto card2&lt;/p&gt;&lt;/card&gt;&lt;card id="card2"&gt;&lt;onevent type="ontimer"&gt;&lt;go href="#card1"/&gt;&lt;/onevent&gt;&lt;timer name="time2" value="50"/&gt;&lt;p align="center"&gt;Here is card2!&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;再提一下，&lt;onevent&gt;&lt;timer&gt;&lt;do&gt;三者必须按以上顺序写。</p><p>此外在DECK级还可以加入&lt;template&gt;，用来将事件捆绑在DECK级上，语法如下：&lt;template onenterforward="url" onenterbackward="url" ontimer="url"&gt;&lt;do&gt;或者&lt;onevent&gt;&lt;/template&gt;test9.wml---------------&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;&lt;wml&gt;&lt;head&gt;&lt;meta http-equiv="Cache-Control" content="max-age=0"/&gt;&lt;/head&gt;&lt;template&gt;&lt;do type="accept" label="deckPress" name="do1"&gt;&lt;go href="#card01"/&gt;&lt;/do&gt;&lt;/template&gt;&lt;card id="card0" ordered="false"&gt;&lt;do type="accept" label="cardPress" name="do1"&gt;&lt;go href="#card02"/&gt;&lt;/do&gt;&lt;p&gt;Press ACCEPT...&lt;/p&gt;&lt;/card&gt;&lt;card id="card01"&gt;&lt;p&gt;Here is card01&lt;/p&gt;&lt;/card&gt;&lt;card id="card02"&gt;&lt;p&gt;Here is card02&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;</p><img src ="http://www.blogjava.net/zhangrenquan/aggbug/35803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-17 11:51 <a href="http://www.blogjava.net/zhangrenquan/articles/35803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WML—XML标记语言开发实例详细解析</title><link>http://www.blogjava.net/zhangrenquan/articles/35802.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 17 Mar 2006 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/35802.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/35802.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/35802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/35802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/35802.html</trackback:ping><description><![CDATA[
		<p>本文主要介绍WML的相关知识，如何开发WAP应用程序。</p>
		<p>WML是一种基于XML的标记语言，她的官方说明和规范是由WAP论坛维护的。WML的文档类型定义是xml文件类型的，<a href="http://www.wapforum.org/DTD/wml_1.1.xml" target="_blank">http://www.wapforum.org/DTD/wml_1.1.xml</a>。</p>
		<p>和HTML语言一样，WML是为了显示数据的，而XML的目的则是描述数据，我们定义了一系列的标记并组织成为语法规范把它称为DTD(Document Type Definition)。支持WAP的手机里面都安装了WAP浏览器他能够解析这些标记并正确显示在手机屏幕上。</p>
		<p>通常在WML的文本的开头都有这样的内容</p>
		<p>&lt;xml version='1.0'&gt;<br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "<a href="http://www.wapforum.org/DTD/wml_1.1.xml" target="_blank">http://www.wapforum.org/DTD/wml_1.1.xml</a>"&gt;</p>
		<p>我们把它叫做序言。在后面就是标记了，我们所有的数据都是嵌套在这两个标记里面的。WML的标记非常少，基本可以分为两种一种称为Deck/Card一种称为Event。在这里不能一一讲述，在我们开发WML应用的时候参考手册就可以了，我给大家提供一个在线的参考：Online WML Tag Reference。</p>
		<p>在标记内的内容我们把它称为deck，每个屏幕的内容我们把它定义为card，由于WML是为无线网络传输定义的，充分考虑到带宽的限制，我们允许在一个deck内包含多个card并可以一起下载到用户代理中，这样我们就可以在本地进行不同屏幕的切换了，避免每次都去联网。当然这也给客户端增加了负担，因此我们要避免在deck内包含过多的card。</p>
		<p>下面我们编写一个WML的例子test.wml，内容如下：</p>
		<p>&lt;?xml version='1.0'?&gt;<br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" <br />"<a href="http://www.wapforum.org/DTD/wml_1.1.xml" target="_blank">http://www.wapforum.org/DTD/wml_1.1.xml</a>"&gt;<br /> <br />&lt;wml&gt;<br />&lt;card id="Login" title="Login"&gt;<br />&lt;do type="accept" label="Password"&gt;<br />&lt;go href="#Password"/&gt;<br />&lt;/do&gt;<br />&lt;p&gt;<br />  UserName:<br />&lt;select name="name" title="Name:"&gt;<br />&lt;option value="John Doe"&gt;John Doe&lt;/option&gt;<br />&lt;option value="Paul Smith"&gt;Paul Smith&lt;/option&gt;<br />&lt;option value="Joe Dean"&gt;Joe Dean&lt;/option&gt;<br />&lt;option value="Bill Todd"&gt;Bill Todd&lt;/option&gt;<br />&lt;/select&gt;<br />&lt;/p&gt;<br />&lt;/card&gt;</p>
		<p>&lt;card id="Password" title="Password:"&gt;<br />&lt;do type="accept" label="Results"&gt;<br />&lt;go href="#Results"/&gt;<br />&lt;/do&gt;<br />&lt;p&gt;<br />  Password: &lt;input type="text" name="password"/&gt;<br />&lt;/p&gt;<br />&lt;/card&gt;</p>
		<p>&lt;card id="Results" title="Results:"&gt;<br />&lt;p&gt;<br />You entered:&lt;br/&gt;<br />Name: $(name)&lt;br/&gt;<br />Password: $(password)&lt;br/&gt;<br />&lt;/p&gt;<br />&lt;/card&gt;<br />&lt;/wml&gt;</p>
		<p>在这个deck中包含了三个card,可以一并下载到客户端，通过按键操作我们就可以在不同的card之间进行切换，你可以在手机或者winwap模拟器中看看运行的效果。下面是winwap下的运行截图。</p>
		<p>
				<img src="http://www.windstudio.net/upload/20051024100237_1.jpg" onload="JavaScript:if(this.width&gt;540)this.width=540" />
		</p>
		<p>
				<img src="http://www.windstudio.net/upload/20051024100247_1.jpg" onload="JavaScript:if(this.width&gt;540)this.width=540" />
		</p>
		<p>
				<img src="http://www.windstudio.net/upload/20051024100257_1.jpg" onload="JavaScript:if(this.width&gt;540)this.width=540" />
		</p>
		<p>虽然我们已经可以开发wml的应用了，但是这些毕竟都是些静态的内容。如果我们要开发和服务器交互的功能呢？答案当然是我们可以使用Servlet技术。看下面的例子：</p>
		<p>&lt;?xml version='1.0'?&gt;<br />&lt;DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "<a href="http://www.wapforum.org/DTD/wml_1.1.xml" target="_blank">http://www.wapforum.org/DTD/wml_1.1.xml</a>"&gt;</p>
		<p>&lt;wml&gt;<br />&lt;card id="Order" title="Query Inventory"&gt;<br />&lt;p&gt;<br />&lt;select name="Items" title="Items"&gt;<br />&lt;option value="Books"&gt;Books&lt;/option&gt;<br />&lt;option value="Music"&gt;Music&lt;/option&gt;<br />&lt;option value="Video"&gt;Video&lt;/option&gt;<br />&lt;option value="Software"&gt;Software&lt;/option&gt;<br />&lt;/select&gt;<br />&lt;/p&gt;<br />&lt;do type="accept" label="Query"&gt;<br />&lt;go href="<a href="http://222.28.218.222:8088/wap/wapservlet" target="_blank">http://222.28.218.222:8088/wap/wapservlet</a>" method="get"&gt;<br />&lt;postfield name="Items" value="$(Items)"/&gt;<br />&lt;/go&gt;<br />&lt;/do&gt;<br />&lt;/card&gt;<br />&lt;/wml&gt;</p>
		<p>用户可以从列表中选择Item,通过无线网络传输给服务器后Servlet通过request.getParameter()方法得到用户的选择并发送给用户，servlet的代码如下：</p>
		<p>package com.j2medev.mingjava;</p>
		<p>import java.io.IOException;<br />import java.io.PrintWriter;</p>
		<p>import javax.servlet.ServletException;<br />import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p>
		<p>
				<br />public class WapServlet extends HttpServlet<br />{</p>
		<p>protected void doGet(HttpServletRequest request,<br />HttpServletResponse response) throws<br /> ServletException, IOException<br />{<br />String select = request.getParameter("Items");<br />response.setContentType("text/vnd.wap.wml");<br />PrintWriter out = response.getWriter();<br />out.println("&lt;?xml version=\"1.0\"?&gt;");<br />out.println("&lt;!DOCTYPE wml PUBLIC\"-//WAPFORUM//DTD WML 1.1//EN\"");<br />out.println("\"<a href="http://www.wapforum.org/DTD/wml_1.1.xml/" target="_blank">http://www.wapforum.org/DTD/wml_1.1.xml\</a>"&gt;");<br />out.println("&lt;wml&gt;");<br />out.println("&lt;card title=\"test\"&gt;");<br />out.println(" &lt;p align=\"center\"&gt;");<br />out.println("you selected "+select);<br />out.println("&lt;/p&gt;");<br />out.println("&lt;/card&gt;");<br />out.println("&lt;/wml&gt;");</p>
		<p>}</p>
		<p>protected void doPost(HttpServletRequest request,<br />HttpServletResponse response) throws<br /> ServletException, IOException<br />{<br />doGet(request,response);<br />}<br />}</p>
		<p>正确部署Servlet和wml文件后，在winwap下输入<a href="http://222.28.218.222:8088/test2.wml" target="_blank">http://222.28.218.222:8088/test2.wml</a> 确认后就可以看到you selected xxxx的内容了。</p>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/35802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-17 11:46 <a href="http://www.blogjava.net/zhangrenquan/articles/35802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WML的表格和图形</title><link>http://www.blogjava.net/zhangrenquan/articles/35801.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 17 Mar 2006 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/35801.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/35801.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/35801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/35801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/35801.html</trackback:ping><description><![CDATA[
		<p>由于浏览终端的限制，WML无法也没有必要提供复杂的表格功能</p>
		<p>1、基本属性（table）</p>
		<p>相关属性：</p>
		<p>title 表格的标题<br />align 为表格内的文本和图片设置水平对齐方式，C=center L=left R=right，缺省参数为L<br />columns 表格列数目，当该变量设置为0时会发生错误。</p>
		<p>2、表格行（tr）</p>
		<p>tr用来声明一行表格，WML允许空白行的存在，而且空白行不会被浏览器忽略。</p>
		<p>3、表格列（td）</p>
		<p>td元素声明表格中的一个单元格，单元格可以为空白，而且空白单元格不会被浏览器忽。浏览器可以处理多行文本的单元格，单元格分行可以用&lt;img&gt;或&lt;br/&gt;标签。</p>
		<p>Nokia 7110不支持多列表格，所以表格应用在一定程度上受到限制。</p>
		<p>示例：</p>
		<p>&lt;?xml version="1.0"?&gt; <br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt; <br />&lt;wml&gt; </p>
		<p>&lt;card&gt;<br />&lt;p&gt;<br /><span class="smallFont">　</span>&lt;table columns="2"&gt;<br /><span class="smallFont">　</span><span class="smallFont">　</span>&lt;tr&gt;&lt;td&gt;one&lt;/td&gt;&lt;td&gt;two&lt;/td&gt;&lt;/tr&gt;<br /><span class="smallFont">　</span><span class="smallFont">　</span>&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;<br /><span class="smallFont">　</span><span class="smallFont">　</span>&lt;tr&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;C&lt;br/&gt;D&lt;/td&gt;&lt;/tr&gt;<br /><span class="smallFont">　</span>&lt;/table&gt;<br />&lt;/p&gt;<br />&lt;/card&gt;<br />&lt;/wml&gt;<br /></p>
		<h3 align="left">图形</h3>
		<p>
				<span class="smallFont">　　WML提供1位黑白BMP图片的操作，标签类似于HTML，&lt;img alt="text" src="url" localsrc="icon" align="left" height="n" width="n" vspace="n" hspace="n"/&gt;，属性中alt和src是必须要有的，其他可选。另外要注意的是&lt;img&gt;要放在&lt;p&gt;里，不能放在&lt;do&gt;和&lt;option&gt;等功能健标签和选单标签里。</span>
		</p>
		<p>
				<span class="smallFont">　　alt属性用来指定当手机不支持图片显示时用来显示的文字。<br />　　src属性指定图片的URL，但当有了以下的localsrc属性时，手机浏览器就忽略src属性。<br />　　localsrc属性用来指定显示存在手机ROM中的图标，如果找不到，则到UP.Link Server上去找。</span>
				<span class="smallFont">
						<br />　　可选的align属性用来表明图片同当前行文本的对齐方式，默认值为bottom，可选to和middle。<br />　　height、width、vspace、hspace属性分别指定图片的长宽和距环绕文字的间距，目前不是所有的WAP手机都支持这些属性。</span>
		</p>
		<p>示例：</p>
		<p>&lt;img src="http://wap.sina.com.cn/wbmp/logo.wbmp" alt="sina"/&gt;</p>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/35801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-17 11:45 <a href="http://www.blogjava.net/zhangrenquan/articles/35801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WML语言基础</title><link>http://www.blogjava.net/zhangrenquan/articles/35800.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 17 Mar 2006 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/35800.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/35800.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/35800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/35800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/35800.html</trackback:ping><description><![CDATA[完成WAP服务器的建立和WAP浏览器的安装之后，我们接下来就可以使用WML语言来编写WAP网页或应用，并通过WAP服务器及浏览器进行调试。从本章开始我们将系统地学习WML语言，本章主要讲解WML语言的基础知识，下一章全面讲解WML的语法、标签和规则。<br /><br /><b>2.1 WML的简单例子及编辑、测试方法</b><br /><br />无限标记语言WML(Wireless Markup Language)是一种基于扩展标记语言XML(Extension Markup Language)的语言，是XML的子集。它可以显示各种文字、图像等数据，是由WAP论坛（http://www.wapforum.org）提出并专为无线设备用户提供交互界面而设计的，目前版本为1.1版。这些无线设备包括移动电话，呼机和个人数字助理PDA(Personal Digital Assistants)等。<br /><br />2.1.1 WML与WAP设备<br /><br />为了更好的了解和使用WML语言，开发人员应对WML使用的设备和支持WML的设备的特点、特征有个大概的了解。<br /><br />一般而言，WML使用的无线设备通常具有以下特点：<br /><br />与普通的个人计算机相比，体积较小；<br />设备的内存有限，且其CPU性能也有限；<br />通讯带宽较窄、时延较长。<br /><br />以移动电话、PDA为例来讲，支持WML的设备主要具有以下特征：<br /><br />有一个显示屏幕，可显示2.凶址啃?2各字符；2.凶址型ǔ０ūＡ舾δ馨磁サ囊恍校?br&gt;支持数字和字符的输入；<br />支持操作者使用箭头或数字按钮进行选择；<br />支持ASCII的可打印码；<br />通常都有两个可编程功能键，即Accpet键和Options键，一般安排在接近键盘的屏幕下方；<br />通常有一个Prev导航键。<br /><br />我们介绍WML所使用WAP设备的目的，是希望读者通过WAP设备的特点、特征来了解WML语言的特点，进而对WML编程所要解决的问题有个大概的认识。<br /><br />2.1.2 使用文本编辑器面写WML程序<br /><br />使用WML语言编写WAP网页或应用时，需要使用一个编辑器进行编辑。与HTML编程一样，WML编写的程序也是纯文件文本，可以使用任意文本编辑器进行编写，比如Windows系统中的“记事本（NotePad）”等。也可以使用比如Nokia WAP Toolkie等软件（有关此具体的用法会在以后的学习过程中提起）。我们先介绍第一种方法，随后介绍第二种。<br /><br />如果要使用"记事本（NotePad）"来编写WML程序，则可以在Windows系统中，单击“开始”按钮，然后从出现的菜单中，依次将光标指向“程序”、“附件”、“记事本”，启动“记事本”程序。屏幕上随后就会出现它的编辑窗口，从中就可以输入并编写WML程序了。<br /><br />作为举例，我们可以输入如下简单的程序。<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><b><br /><br />&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE wml PUBLIC "-//wapforun//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;<br />&lt;xml&gt;<br />&lt;card id="card1" title="Title"&gt;<br />&lt;P&gt;<br />&lt;!--Write your card implementation here.--&gt;<br />Hello World!!<br />&lt;/P&gt;<br />&lt;/card&gt;<br />&lt;/xml&gt;</b></td></tr></tbody></table><br /><br />输完后将它保存为hello.xml文件。保存时注意文件的扩展名应为xml而不是txt。<br /><br /><b>2.2 WML程序结构</b><br /><br />上一节我们降解了一个简单的WML程序，具有HTML编程的读者可以看出，WML程序在结构上形式上与html程序有很多相似之处。下面我们就根据一个实例来分析一下WML程序的结构及组成。<br /><br />2.2.1 WML的元素和标签<br /><br />分析实例之前，我们有必要对WML的元素和标签予以简单说明。与HTML类似，WML的主要语法也是元素和标签。元素是符合DTD（文档类似定义）的文档组成部分，如title(文档标题)、IMG（图像）、table(表格)等等，元素名不区分大小写。WML使用标签来规定元素的属性和它在文档中的位置。标签使用小于号（&lt;）和大于号（&gt;）括起来，即采用“&lt;标签名&gt;”的形式。标签分单独出现的标签和成对出现的标签两种。大多数标签是成对出现的，由首标签和尾标签组成。首标签和尾标签又分别称为起始标签和终止标签。首标签的格式为“&lt;元素名&gt;”，尾标签的格式为“&lt;/元素名&gt;”。成对标签用于规定元素所含的范围，比?lt;b&gt;和&lt;/b&gt;标签用于界定黑体字的范围，也就是说&lt;b&gt;和&lt;/b&gt;之间包住的部分采用黑体字显示。单独标签的格式为“&lt;元素名/&gt;”，他的作用是在相应的位置插入元素。如〈br/〉标签表示在该标签所在位置插入一个换行符。<br /><br />2.2.2 WML程序结构形式及组成的实例分析<br /><br />了解了上述知识后，下面我们在分析一个实例程序。程序如下：<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><b>&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapfourm.org/DTD/wml_1.1.xml"&gt;<br /><br />&lt;wml&gt;<br /><br />&lt;card id="card1" ontimer="#card2" title="Tookit Demo"&gt;<br />&lt;timer value="50"/&gt;<br />&lt;p aligh="center"&gt;<br />&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;<br />&lt;big&gt;<br />&lt;!--Write your card implementation here.--&gt;<br />Welcome to....<br />&lt;/big&gt;<br /><br />&lt;/p&gt;<br />&lt;/card&gt;<br /><br />&lt;card id-"card2" ontimer="#card 3"title="Toolkit Demo"&gt;<br />&lt;timer value="50"/&gt;<br />&lt;p align="center"&gt;<br />&lt;br/&gt;&lt;br/&gt;<br />&lt;b&gt;<br />The Nokia&lt;br/&gt;<br />&lt;/b&gt;<br />Wireless Application Protocol<br />&lt;/u&gt;<br />...<br />&lt;/p&gt;<br />&lt;/card&gt;<br /><br />&lt;card id="card3"title="Toolkit Demo"&gt;<br />&lt;p align="center"&gt;<br />&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;<br />&lt;big&gt;<br />&lt;i&gt;<br />Toolkit<br />&lt;/i&gt;<br />&lt;/big&gt;<br />&lt;/p&gt;<br />&lt;/card&gt;<br /><br />&lt;/xml&gt;</b></td></tr></tbody></table><br /><br />该程序运行后将在WAP手机屏幕依次显示3屏信息。先显示"Welcome to ..."，然后显示"The Nokia Wireless Application Protocol..."，最后显示"Tookit!"。显示时每屏都有标题"Tookit Demo"，相邻两屏之间延时为50，其单位大小为1/10秒，延时50即5秒。<br /><br />通过以上实例我们可以了解到WML程序的结构形式及组成：<br /><br />1)语法。WML与HTML极为相似。仍然是一种标记语言，并且延续了XML的语法规则，具体的语法我们会以后的学习过程中遇到。<br /><br />2)文件声明。所有的WML程序必须在文件的开头处声明XML文件类型，包括XML的版本，WML的文档类型、所用规范等。声明形式如下：<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><b>&lt;?xml version="1.0"&gt;<br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;</b></td></tr></tbody></table><br /><br />3)标签。在WML语言中需要使用标签（Tag），其使用形式与HTML和XML等标记语言中的形式是完全一致的。<br /><br />4）元素。WML的元素（Element）用于描述卡片组（Deck）的标记信息即结构信息。一个元素通常有一个首标签、内容、其它元素及一个尾标签组成，具有下述两种结构之一：<br /><br />&lt;首标签&gt;内容&lt;/尾标签&gt;<br />或<br />&lt;标签/&gt;<br /><br />元素包含的内容中还可以有元素，这些元素也是有首标签、相应内容、其它元素及尾标签组成。不包含内容的元素成为空元素。它为一个单独的标签。或者说，单独的标签也是一种元素。<br /><br />5)属性。WML与XML一样，其标签可以包含很多属性。属性用于给标签提供必要的附加信息，且属性内容通常在起始标签内使用。不过，属性内容不会被浏览器显示，它至作为参数为标签提供必要的信息。<br /><br />指明属性值的时候，需要把该值用引号扩起来，可以是单引号或者双引号，引号通常成对嵌套使用。属性名称必须小写。例如：&lt;card id="card 1" ontimer="#card2" title="Toolkit Demo"&gt;<br /><br />而且，单引号的属性中还可以包含双引号的属性。实体字符也可以作为属性值。实体字符是指诸如&amp;、&lt;、&gt;、'、"的特殊字符，在WML程序中显示着类字符需要特殊处理，后面我们介绍具体方法。<br /><br />6)注释。WML程序中也可以加入注释。注释内容用于给开发人员顺利阅读源代码提供方便，它不会被浏览器显示出来。注释内容在标签中用感叹号（！）引出，并用于&lt;!--注释内容--&gt;的形式。例如：&lt;!-- Write your card implementation here.--&gt;。需要说明的是，XML程序中不支持注释的嵌套。<br /><br />7)文档结构。WML文档是由“卡片（Card）”和“卡片组（Deck）”构成的，一个Deck是一个或多个Card的集合。当客户端发出请求之后，WML即从网络上把Deck发送到客户浏览器，这是用户就可以浏览Deck内包含的所有Card，而不必从网上单独下载每一个Card，程序中的第一个Card是缺省得可见的Card。<br /><br />注意：Deck是一副纸牌的意思，这里是指一叠卡片，所以我们在这里称之为它为“卡片组”。另外，Card指的是WAP手机屏幕大小的网页，尽管有时一个Card可能需要多屏才能显示完，但我们也可以把它翻译成“页面”，不过这样与HTML中的页面容易混合。因此我们在这里称之为卡片。<br /><br />2.2.3 WML程序的基本结构<br /><br />以上我们简单分析了WML的程序结构及组成，由此大家可以对WML程序有个整体上的初步认识。下面我们给出WML程序的基本结构。<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><b>&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1xml"&gt;<br />&lt;wml&gt;<br />&lt;head&gt;<br />&lt;access/&gt;<br />&lt;meta..../&gt;<br />&lt;/head&gt;<br />&lt;card&gt;<br />Some contents...<br />&lt;/card&gt;<br />&lt;wml&gt;</b></td></tr></tbody></table><br /><br />该基本结构可以分为以下几个关键部分：<br /><br />1）声明。WML程序有许多Deck组成，对于每一个Deck，在其文档开头必须进行XML的声明和文档类型DOCTYPE的声明。<br /><br />XML声明总是在文件的第一行，注意前面最好不要有空格或者还行：<br /><br />&lt;?xml version="1.0"?&gt;<br /><br />2）紧跟着是DOCTYPE声明，注意声明是字母的大小写不要搞错：<br /><br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1xml"&gt;<br /><br />3）&lt;xml&gt;标签。该标签用于包含和定义WML的一个Deck。它有一个可选的xml：lang属性来制定文档的语言，比如&lt;wml xml:lang="zh"&gt;表示文档语言为中文。<br /><br />4）&lt;head&gt;标签。该标签用于包含和定义Deck的相关信息。&lt;head&gt;标签之间可以包含一个&lt;access&gt;标签和多个&lt;meta&gt;标签。<br /><br />5）&lt;access/&gt;标签。它的一般形式是&lt;access domain="域" path="/路径"/&gt;，主要用于制定当前Deck的访问控制信息，有两个可选的属性。其中，domain用来制定域，默认值为当前域，path用来制定路径，默认值为“/”，即跟目录。由于&lt;access&gt;单独使用，所以要用“/”结尾，后面我们还会系统的讲解WML的各种标签，这里即使看不懂也没关系，主要有些感性的认识就可以了。<br /><br />6）&lt;meta...&gt;标签。它的一般形式是&lt;meta 属性 content="值" scheme"格式" forua="true|false"/&gt;，用于提供当前Deck的meta信息，包括内存数据处理方式，以及数据传输方式和处理方式等。有关该标签的详细内容我们后面会专门给出。<br /><br />7）&lt;card&gt;标签。一个Deck可以包含多个Card，每个Card的内容可能不止一屏显示。对于每一个Card，WML均使用&lt;card&gt;和&lt;/card&gt;进行包含和定义。 &lt;card&gt;同时可以包含多个可选的属性，如&lt;card id="name" title="label" newcontext="false" ordered="true" onenterforwand="url" pmemterbackward="url" ontimer="url"&gt;。至于这些属性的具体含义及功能，我们将在后面介绍。<br /><br /><b>2.3 WML语言的基本知识</b><br /><br />上一节我们介绍了WML程序的基本结构，接下来我们介绍WML语言的基本知识，主要包括WML的字符集、变量、数据类型及WML程序的基本组成部分等。<br /><br />2.3.1 WML的字符集及编码<br /><br />WML使用XML的字符集，即通用字符集ISO/IEC-1062.，也即统一字符编码标准Unicode 2.0。同时，WML还支持其他系列的字符集子集，例如UTF-8、ISO-8859-1或UCS-2等。其中：<br /><br />UTF-8是指通用字符集UCS(Universal Character Set)的转换格式8(Transformation Format 8)，主要传输国际字符集的转换编码。UTF-8采用了UCS字符的8位编码，提供了十分安全的编码格式，可以有效避免数据传输过程中的窃听、截取及非法解密。同时，UTF-8与7位ACSII码完全兼容，不会影响此类编码实现的程序；它的编码规则十分严格，能够有效避免同步传输错误，而且还会支持其它字符集提供了足够的空间。<br /><br />ISO-8859-1字符集是国际标准化组织ISO(International Standardization Organization)制定的ACSII字符集的扩展集，能够表示所有西欧语言的字符。与ISO Latin-1一样，ISO-8859-1与Windows环境中普遍使用的美国国家标准协会ANSI(American National Standards Institute)的字符集极为类似，绝大多数情况下无需区分。在不特别指明的情况下，HTTP协议均使用ISOLatin-1字符集。因此，为了WML页面中表示非ACSII（non-ACSII）字符，开发人员需要使用相应的ISO Latin-1编码的字符。<br /><br />UCS-2是ISO 1062.标准中自定义的通用多8位编码字符集(Universal Multiple-Octer Coded Character Set)的2字节（即16位）编码标准，其字符编码值与Unicode字符的标准编码值相等。<br /><br />WML文档可以采用HTML 2.0规范所定义的任何字符编码标准经编码处理。一般说来，WML文档的字符编码是需要转换为另外的编码格式，以与WAP用户的手机浏览器所用字符标准相适应，否则，手机浏览器就无法显示WML页面中的字符。然而，编码转换时可能会丢失一些字符信息，所以，如果在用户端进行WML文档的编码转换，那么就可能导致某些结果信息丢失而不能被用户所浏览。因此，如有必要，我们应当尽量在WML页面传送到用户浏览器之前完成编码转换。<br /><br />为了解决这一问题，一方面，我们需要为Web服务器补充定义WML的数据类型，以让服务器可以准确传输这些数据，另一方面，我们需要制订编码转换的原则。<br /><br />2.3.2 WML字符使用基本规则<br /><br />WML是一种比较严格的语言，字符使用必须遵守相应的规则，这些基本规则主要包括以下几个方面：<br /><br />1）大小写敏感。在WML中，无论是标签元素还是属性内容都是大小写敏感的，这一点继承了XML的严格特性，任何大小写错误都可能导致访问错误。<br /><br />一般来说，WML的所有标签，属性，规定和枚举及它们的可接受值必须小写，Card的名字和变量可大写和小写，但它是区分大小写的。包括参数的名字和参数的数值都是大小写敏感的，例如variable1、Variable1和vaRiable1都是不同的参数。 2）空格。对于连续的空字符，程序运行时只需要一个空格。属性名、符号（=）和值之间不能有空格。<br /><br />3）标签。标签内属性的值必须使用双引号（"）或单引号（'）括起来。对于不成对出现的标签，必须在大于号（&gt;）前加上顺斜杠（/），比如换行标签必须写成&lt;br/&gt;才正确。<br /><br />4）不显示的内容。在WML中，不显示的字符主要包括换行符、回车符、空格和水平制表符，它们的8位十六进制内码分别为10、13、32及9。<br /><br />程序执行时，WML将忽视所有的多于一个以上的不显示字符，即WML会把一个或多个连续的换行、回车、水平制表符及空格转换成一个空个。<br /><br />5）保留字符。这是WML的一些特殊字符，如小于号（&lt;）、大于号（&gt;）、单引号“'”、双引号“"”、和号（&amp;）。<br /><br />6）显示汉字。如果希望WML程序执行时能够显示汉字，则只需要程序开头使用encoding指定汉字字符集即可。例如：&lt;?xml version="1.0" encoding="gb2312"&gt;。<br /><br />注意：指定汉字字符集的形式和方法可能因为开发工具或WAP手机的不同而不同。<br /><br />2.3.3 变量<br /><br />WML编程中可以使用变量，变量使用前必须进行定义。变量一旦在Deck中的某一个Card上定义过，其他Card则可以不必重新定义就能直接调用该变量。<br /><br />定义变量的语法格式为：<br />$identifier<br />$(identifier)<br />$(identifier:conversion)<br /><br />其中identifier指变量名，或说变量标示符；conversion指变量的替代。<br /><br />变量名是由US-ACSII码、下划线和数字组成的，并且只能以US-ACSII码开头。变量名严格区分大小写，也即，变量名是大小写敏感的。<br /><br />定义变量的语法在WML中享有最高的解释优先级。<br /><br />有关变量的使用说明如下：<br /><br />1）在WML中，变量可以在字符串中使用，并且在运行中可以更新变量的值。<br /><br />2）当变量等同于空字符串时，变量将处于未设置状态，也就是空（Null）。<br /><br />3）当变量不等同于空字符串时，变量将处于设置状态，也就是非空（Not Null）状态。<br /><br />4）在“$identifier”形式下，WML通常以变量名后面的一个空格表示该变量名的结束。如果在某些情况下空格无法表示一个变量名的结束，或者变量名中包含有空格，则必须使用括号将变量名括起来，即采用“$(identifier)”的形式。<br /><br />WML程序中的变量是可以替代的，我们可以把变量的数值赋给Card中的某一文本。有关变量替代说明如下：<br /><br />1）在WML程序中，只有文本部分才可以实现替代。<br /><br />2）替代一般在运行期发生，而且替代不会影响变量现在的值。<br /><br />3）任何标签是按照字符串替代的方式实现的。<br /><br />4）替代是按照字符串替代的方式实现的。<br /><br />由于变量在语法中有最好的优先级，包含变量声明字符的字符串将被当作变量对待，所以如果要使程序显示“$”符号，则需要连续使用两个“$”进行说明。例如：&lt;p&gt; Your acconut has $$15.00 in it &lt;/p&gt;一句显示的结果为：Your account has $15.00 in it。<br /><br />2.3.2. WML核心数据类型<br /><br />WML的核心数据类型均属于字符型数据，是根据XML的数据类型定义的，共有下述2.掷嘈停?1）CDATA型。这种数据类型是WML用得最多的一种，可以是数字、字符串或包含数字的字符串。不过定义时，不论是数字或字符串，都必须以文本的形式定义，及数据用引号引起来。CDATA型的数据仅用于属性值。例如"$(value)"或name="value"等。注意，这里的value指CDATA型的数据值。<br /><br />2）PCDATA型。这是从CDATA中分解出来的一类数据，除了可以是文本形式的数字、字符串或两者的混合串外，还可以是WML的标签。PCDATA型的数据只能用于WML的元素表示。<br /><br />3）NMTOKEN型。这是一类特殊的数据，凡是包含或部分包含数字、字母及标点符号的数据均属于NMTOKEN型数据。这种数据可以用标点符号开头，但不用于定义变量名或元素名。<br /><br />4）id型。专门用于定义WML元素名称的数据类型。<br /><br />在这2.掷嘈椭校珻DATA型用起来比较灵活，它可以使变量或数据免于语法检查。这是因为，CDATA内的数据内容都会被当作文本来处理，从而可以避免WML的语法检查，直接作为文本显示出来。<br /><br />2.3.5 WML数据值性质<br /><br />除了NMTOKEN型数据外，WML其他3种数据都必须以文本形式即加上引号进行定义。我们关心的问题是，这些类型的数据可以表示哪些数据值呢？或者说，它们所表示的数据值的性质是什么呢？<br /><br />事实上，WML数据只在性质上可以是长度（Length）、宏变量（Vdata）、流（Flow）、内行（Inline）、布局（Layout）、文本（Text）、超链（Href）、布尔值（Boolean）、数据（Number）或增强方式（Emphasis）。<br /><br />2.3.6 卡片与卡片组<br /><br />前面我们分析了WML程序的结构时，曾将讲到WML文档的信息是通过卡片集和卡片组集的形式进行组织的。一个Deck是一个或多个Card的集合。当客户终端发出请求之后，WML即从网络上把Deck发送到客户的浏览器，Deck是服务器发送信息的最小单位。用户浏览器收到Deck后，可以浏览其中包含的所有Card。Card用于表示或描述一个或多个用户交互单位。<br /><br />2.3.7 卡片组模板<br /><br />同一卡片组通常会含有许多卡片，这些卡片的定义、属性或格式通常都大同小异。如果我们逐一定义各个卡片，显然是十分麻烦的。为此，WML提供了卡片组模板的功能，模板内定义了一系列标准和参数，可以应用到同一卡片组的所有卡片中去，从而能够大大地提高我们的编程效率。有关卡片组模板的内容我们后面会专门介绍的。<br /><br />2.3.8 WML与URL、程序段锚点<br /><br />我们知道，环球网WWW是各种信息和设备的网络，为保证全球范围内的交互，人们制定了3种规范:其一，统一资源定位器URL提供所有网络资源的标准命名方式和定位方式；其二，标准协议，如HTTP协议等，提供WWW资源的传输方式；其三。标准内容类型，如HTML、WML，提供WWW资源的内容形式及标准。WML沿用了这些规范，并扩大了URL使用的范围。在WML中，不仅超连接、文件路径及文件名可以作为URL处理，卡片名、宏变量名及各种内部资源名等也可作为URL处理。<br /><br />为此，WML改进了HTML命名资源位置的方式，采用程序锚点（Fragment Anchor）的形式来处理WML程序中某段程序的地位。程序段锚点根据文档WML规则进行定义，并按照程序段表示符前加井字好（#）的方式书写。使用程序段锚点，WML程序可以在同一卡片组中定位不同的卡片。如果在程序中不指定程序段，那么程序中引用的URL名称则指整个卡片组，而且卡片组的名称同时也是本卡片组内的第一个卡片的名称。 2.3.9 浏览器操作历史<br /><br />为了在浏览器端管理WML程序的执行，WML使用“浏览器前后关系”的功能保存WML程序执行的状态及各种参数、变量等，这样可以用来记录用户的操作情况。同时，WML还提供了一个简单的导航历史模型，以URL地址的形式记录了用户浏览时的各种操作，并把这些URL地址放入历史推栈。通过推栈，用户即可实现历史浏览的回潮及其它操作。<img src ="http://www.blogjava.net/zhangrenquan/aggbug/35800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-17 11:43 <a href="http://www.blogjava.net/zhangrenquan/articles/35800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全面了解WML</title><link>http://www.blogjava.net/zhangrenquan/articles/35788.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 17 Mar 2006 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/35788.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/35788.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/35788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/35788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/35788.html</trackback:ping><description><![CDATA[
		<p>学习自然语言的最好方法就是溶入相应的语言环境在交流中学习，学习一种编程语言的最好方法就是看例程。为了帮助大家建立WML应用的第一印象，所以请大家先看第一个例子:</p>
		<p>&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"<br />"http://www.wapforum.org/DTD/wml_1.1.xml"&gt;<br />&lt;wml&gt;<br />　 &lt;template&gt;<br />　　　 &lt;do type="prev" label="back"&gt;<br />　　　　　 &lt;prev/&gt;<br />　　　　　 &lt;!--provide a button you can clink to back a step--&gt;<br />　　　 &lt;/do&gt;<br />　 &lt;/template&gt;<br />&lt;card id="friends" title="Hot link"&gt;<br />　 &lt;p&gt;<br />　　　 &lt;a href="http://wap.sian.com.cn/"&gt;Sina WAP&lt;/a&gt;&lt;br/&gt;<br />　　　 &lt;a href="#nextcard"&gt;Next Card&lt;/a&gt;<br />　 &lt;/p&gt;<br />&lt;/card&gt;<br />&lt;card id="nextcard"&gt;<br />　 &lt;p&gt;<br />　　 this is the second card.<br />　 &lt;/p&gt;<br />&lt;/card&gt;<br />&lt;/wml&gt;</p>
		<p>通过以上示例大家应该了解到以下内容：</p>
		<p>1、语法：WML的语法与HTML相似，仍然是一种标记语言，而且延续了xML语法规则</p>
		<p>2、元素：在XML和WML 语言中，语言的基本元素称之为"标签"<br />　　 标签必须被 &lt; 和 &gt; 括起来。<br />　　 大多数标签都包括"起""止"两部分，例如：&lt;p&gt;…&lt;/p&gt;<br />　　 某些特殊标签可以只有一个标签，但是必须有结束标记，例如：&lt;prev/&gt;</p>
		<p>3、属性：XML语言的标签可以包含很多属性，给标签提供必要的附加信息<br />　　 属性内容通常在起始标签内使用<br />　　 属性只作为参数为标签提供必要的信息，不会被浏览器显示<br />　　 属性的值需要被引号括起来，可以是单引号或者双引号，引号可以成对嵌套使用<br />　　 例如：&lt;card id="friends" title="Hot link"&gt;</p>
		<p>4、注释<br />　　 注释内容是方便制作者阅读源代码，不会被浏览器显示<br />　　 WML不支持注释嵌套<br />　　 例如：&lt;!-- This is a comment. --&gt; </p>
		<p>5、文档结构<br />　　 WML文档是由Card和Deck构成的，一个Deck是一个或多个Card的集合。在得到客户终端的请求之后，WML从网络上把Deck发送到客户的浏览器，访问者可以浏览Deck内包含的所有Card，而不必从网上单独下载每一个Card。</p>
		<p>其他一些示例中没有涉及到的基本内容：</p>
		<p>6、大小写敏感<br />　　 无论是标签元素还是属性内容都是大小写敏感的，这一点继承了XML的严格特性，任何大小写错误都可能导致访问错误，这是WML制作者必须注意的问题。<br /></p>
		<p>7、躲避语法检查的方法－CDATA<br />　　 CDATA内的数据内容都会被当作文本来处理，从而避开语法检查，直接作为文本显示。<br />　　 示例：<br />　　 &lt; ! [ CDATA [ this ia &lt;b&gt; a test ] ] &gt;<br />　　 显示结果为<br />　　 this ia &lt;b&gt; a test</p>
		<p>8、定义变量<br />　　 WML可以使用变量供浏览器和Script使用，通过在Deck中的一个Card上设置变量，其他Card不必重新设置就可以直接调用。</p>
		<p>　　变量的语法如下：<br />　　 $identifier <br />　　 $(identifier) <br />　　 $(identifier:conversion) </p>
		<p>　　如果变量内容包含空格就需要用圆括号括起来。由于变量在语法中有最高的优先级，包含变量声明字符的字符串会被当作变量对待，所以如果要显示$，就一定要连续使用两个$。</p>
		<p>　　示例：<br />　　 &lt;p&gt; Your account has $$15.00 in it.&lt;/p&gt; <br />　　 显示结果为：Your account has $15.00 in it </p>
		<p>　　XML是一种语法非常严格的语言，WML也继承了这种规则，任何地不规范语法都会导致错误。<br /><br /><br /></p>
		<h2>WML文件的概念WML Decks</h2>
		<p>这里简单介绍一个关于WML文件的概念，其他的细节问题会在后面的章节还详细介绍。 </p>
		<p>声明<br />由于WML语言继承于XML，所以一个有效的WML文档必须包含一个XML声明和一个文件类型声明。</p>
		<p>以下就是一个最常用的声明，由于WML语法要求非常严格，为了避免出错，制作者可以直接拷贝粘贴到制作文档。</p>
		<p>&lt;?xml version="1.0"?&gt; <br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml"&gt;</p>
		<p>注：&lt;?xml version="1.0"?&gt; 语句必须出现在一个Deck的首行，而且必须顶头写，插入任何字符哪怕是空格都会造成语法错误。</p>
		<p>主体结构<br />这是一个最简单的WML文件：</p>
		<p>
		</p>
		<p>&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"<br />"http://www.wapforum.com/DTD/wml_1.1.xml"&gt; <br />&lt;wml&gt; <br />&lt;card title="sample"&gt; <br />&lt;p&gt;Hello WAP!&lt;/p&gt; <br />&lt;/card&gt; <br />&lt;/wml&gt;<br /><br /><br /></p>
		<h2>任务与导航－赋值与数据交换</h2>
		<p>这一部分简单讲解WML的变量赋值和数据提交方法，在后面的章节中有专门讲解。</p>
		<p>变量赋值（Setvar）<br />　　 Setvar给浏览器的当前页面内变量赋值，该变量可以在当前Dock中的任意Card中调用。</p>
		<p>　　相关属性: </p>
		<p>　　1. name 变量名，作为访问变量的标识</p>
		<p>　　　　示例：&lt;setvar name=$bogus value=$bear&gt; </p>
		<p>　　2. value变量的值 </p>
		<p>数据交换（Postfield）<br />　　 Postfield通过URL申请与CGI交换数据。</p>
		<p>　　相关属性: </p>
		<p>　　name &amp; value 交换参数用的变量的名字和值。</p>
		<p>　　示例：&lt;postfield name=$bogus value=$bear&gt; </p>
		<p>一个综合应用的例子</p>
		<p>示例：</p>
		<p>&lt;?xml version="1.0"?&gt; <br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml"&gt; <br />&lt;wml&gt;</p>
		<p>&lt;card id="Start" title="Sina WAP"&gt; <br />&lt;do type="accept"&gt; <br />　　 &lt;setvar name="MyCGI" value="/cgi-bin/count.pl"&gt; <br />　　 &lt;go href="$MyCGI" method="post"&gt; <br />　　　　 &lt;postfield name="one" value="one one"/&gt; <br />　　　　 &lt;postfield name="two" value="two two"/&gt; <br />　　 &lt;/go&gt;<br />　 &lt;/do&gt; <br />&lt;p&gt;Hello World!&lt;/p&gt; <br />&lt;/card&gt; <br />&lt;/wml&gt; </p>
		<p>上例相当于产生一个count.pl?one="one one"&amp;two="two two"的Post申请。<br /><br /><br /></p>
		<h2>
				<strong>跳转和传递参数</strong>
		</h2>
		<p>go的基本属性和应用 <br />实现Card之间跳转的一个基本方法是go，go和do、anchor等标签的结合是WML高级应用的一个基础。</p>
		<p>　　相关属性：</p>
		<p>　　href：声明链接的URL</p>
		<p>　　sendreferer：表示是否传递调用href所指定的URL的页面的URL，也就是当前页的URL，即HTTP头中的HTTP_REFERER，默认值为false，可选值为true </p>
		<p>　　method：WML的method与HTTP提交表单的方法类似，同样有Post和Get两种，缺省参数为Get。</p>
		<p>　　Post与Get的不同：Post在发送前要进行编码处理，然后分组发送，发送过程相对安全，适合大数据量的处理；而Get方法不进行任何处理，一次性发出，适合小数据量交换。除非你肯定你提交的数据可以一次性提交，否则请尽量用Post方法。</p>
		<p>　　accept-charset：定义浏览器与服务器之间收发信息的字符集类型，例如：accept-charset="UTF-8,US-ASCII,ISO-8859-1"。</p>
		<p>示例：</p>
		<p>&lt;?xml version="1.0"?&gt; <br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml"&gt; <br />&lt;wml&gt; </p>
		<p>&lt;card id="Start"&gt; <br />　　 &lt;do type="accept" label="next"&gt; <br />　　　　 &lt;go href="#nextCard"/&gt; <br />　　 &lt;/do&gt; <br />&lt;p&gt;This is the First Card!&lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;card id="nextCard"&gt; <br />　　 &lt;do type="prev" label="before"&gt; <br />　　　　 &lt;prev/&gt; <br />　　 &lt;/do&gt; <br />&lt;p&gt;This is the last card!&lt;/p&gt; <br />&lt;/card&gt; <br />&lt;/wml&gt; </p>
		<p>Go结合Postfield交换参数<br />标签Go可以包含一个或多个Postfield标签，用这些标签携带参数与服务器进行数据交换。</p>
		<p>示例1：产生一个"quote.pl?stock=00001"Get申请</p>
		<p>&lt;go href="/cgi-bin/quote.pl"&gt;<br />　　 &lt;postfield name="stock" value="00001"/&gt;<br />&lt;/go&gt;</p>
		<p>示例2：产生一个"stockname=证券&amp;page=1"Post申请</p>
		<p>&lt;go href="/cgi-bin/query.pl" method="post"&gt;<br />　　 &lt;postfield name="stockname" value="证券"/&gt;<br />　　 &lt;postfield name="page" value="1"/&gt;<br />&lt;/go&gt;<br /></p>
		<p>
				<br /> </p>
		<h2>任务和任务屏蔽</h2>
		<p>内部任务<br />　　 返回&lt;prev&gt;</p>
		<p>　　用来将当前页面的URL压入URL历史堆栈，并打开此前的URL，若该URL不存在，则&lt;prev&gt;无效。语法类似&lt;go&gt;，&lt;prev&gt;和&lt;/prev&gt;之间可加入一句或多句&lt;setvar name="name" value="value"/&gt;，若不加，则必须以&lt;prev/&gt;的形式出现。</p>
		<p>　　刷新&lt;refresh&gt;</p>
		<p>　　用来刷新当前的页面，从而使得页面内的变量刷新或置空，语法与prev相同。&lt;refresh&gt; &lt;setvar name="name" value="value"/&gt; &lt;/refresh&gt;，或&lt;refresh/&gt;。</p>
		<p>　　无动作&lt;noop&gt;</p>
		<p>　　表示什么也不做，该标签不能用在&lt;anchor&gt;中，一般用在覆盖DECK级的&lt;do&gt;。 </p>
		<p>任务屏蔽（Task Shadowing）<br />　　 WML的Task有两个级别，Deck级和Card级。通常人们还习惯把设置在某些条件中的任务成为第三级，在这里先不讨论，后面有专门的描述。</p>
		<p>　　Deck Level：把通用的Task设置在template中，这个Deck中所有的Card都自动继承并使用这些task。</p>
		<p>　　Card Level：只在当前的Card中有效，并替换掉Deck Level的相同属性的Task。</p>
		<p>示例：</p>
		<p>&lt;wml&gt;<br />　　 &lt;template&gt;<br />　　　　 &lt;do type="options" name="general" label="Back"&gt;<br />　　　　　　 &lt;prev/&gt;<br />　　　　 &lt;/do&gt;<br />　　 &lt;/template&gt;<br />&lt;!-- a deck level task--&gt;</p>
		<p>&lt;card id="Card1"&gt;<br />　　 &lt;p&gt;Hello , this is a test &lt;br/&gt;<br />　　　　 &lt;a href="#card2"&gt;the second&lt;/a&gt;<br />　　 &lt;p&gt; <br />&lt;/card&gt;</p>
		<p>&lt;card id="Card2"&gt;<br />&lt;!-- This Card override the deck level task by noop --&gt;<br />&lt;do name="general" type="options" label="none"&gt;<br />　　 &lt;noop/&gt;<br />&lt;/do&gt;<br />&lt;p&gt;nothing happend here&lt;/p&gt;<br />&lt;/card&gt;<br />&lt;/wml&gt; <br /><br /><br /></p>
		<h2>
				<strong>动作和链接</strong>
		</h2>
		<p>设置动作（Do）<br />Do是WML语言中最有有价值的元素之一，它给用户提供一种在当前Card上进行"动作"的通用方法。这种动作通常被定位在用户终端界面的特定部件上，例如WAP手机的功能键（Cancel，Option，Accept），特定的图标，语音识别功能等等。Do可以设置在Deck的Template上或者Card上，当他们重名的时候Card上的Do会覆盖Template上的同名元素（参看任务屏蔽说明）。</p>
		<p>属性列表：</p>
		<p>type：诉浏览器动作的意图。<br />　　 WML总共声明了9个类型的动作，最常用的动作类型是"accept"和"option"。<br />　　 1.1 accept，接受、确认<br />　　 1.2 prev，返回上一个历史堆栈中的URL<br />　　 1.3 help，请求帮助<br />　　 1.4 reset，清除或者重置状态<br />　　 1.5 options，根据当前页面的功能设置选项。<br />　　 1.6 delete，删除选择条目<br />　　 1.7 unknow，相当于空白字串<br />　　 1.8 还有两个属性还没有最后确定。</p>
		<p>label：设置按钮标题，显示在浏览器定义好的屏幕位置，不同浏览器地显示位置不同。如果不设置标题，按钮会按照浏览器的缺省格式显示，不同浏览器的缺省格式不同。</p>
		<p>name：按钮名称，可以用Card级的动作覆盖template上的同名动作，重新赋予那些动作新的任务。</p>
		<p>optional：来定义一个按钮是否显示，设置为True时会被浏览器忽略</p>
		<p>示例：</p>
		<p>&lt;do type="accept" label="Accept" name="accept1" optional="false"&gt; </p>
		<p>　　 {Content}</p>
		<p>&lt;/do&gt; </p>
		<p>链接（Anchor）<br />archor是WML定义链接的基础方式，与其他标签结合可以满足很多应用，anchor必须与go结合。</p>
		<p>相关属性: </p>
		<p>title 链接的文本显示内容。</p>
		<p>示例：</p>
		<p>&lt;anchor title="Click"&gt; click me &lt;go href="#clickedMe"/&gt; &lt;/anchor&gt; </p>
		<p>简化的链接形式（a） <br />a是anchor的简化形式，不需要Go语句配合。为了提高效率，推荐使用&lt;a&gt;。</p>
		<p>相关属性: </p>
		<p>1. href 超级链接的目标Url</p>
		<p>示例：</p>
		<p>&lt;a href="#clickedMe"&gt;click me&lt;/a&gt; <br /></p>
		<p>
				<br /> </p>
		<h2>WML的事件</h2>
		<p>内部事件（Onevent）<br />相关属性: </p>
		<p>type：内部事件的触发条件，当前浏览器状态满足触发条件时，浏览器就会触发这个条件下设置的Task，内部事件总共有4种触发条件。</p>
		<p>　　1 ontimer 满足时钟设置的条件时，该条件成立。关于时钟设置问题，后面还有专门的说明。<br />　　 2 onenterbackward 通过Prev或其他外部命令返回到当前Card，该条件成立。<br />　　 3 onenterforward 当浏览器通过链接进入当前Card，该条件成立<br />　　 4 onpick 在使用Option控件列表的时候，任何点击控件的行为都会触发本事件，包括选择和去掉选择。</p>
		<p>示例：</p>
		<p>&lt;?xml version="1.0"?&gt; <br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml"&gt; <br />&lt;wml&gt; </p>
		<p>&lt;!-- this deck can't use in Ericsson r320sc ,because r320sc haven't accept button--&gt; </p>
		<p>&lt;card id="start"&gt; <br />&lt;do type="accept" label="next"&gt; <br />　　 &lt;go href="#two"/&gt; <br />&lt;/do&gt; <br />&lt;p&gt;This is the first card.&lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;card id="two"&gt; <br />&lt;do type="accept" label="next"&gt; <br />　　 &lt;go href="#three"/&gt; <br />&lt;/do&gt; <br />&lt;onevent type="onenterbackward"&gt; <br />　　 &lt;go href="#temp"/&gt; <br />&lt;/onevent&gt; <br />&lt;p&gt;This is the second card.&lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;card id="three"&gt; <br />&lt;do type="accept" label="back"&gt; <br />　　 &lt;prev/&gt; <br />&lt;/do&gt; <br />&lt;p&gt;This is the thired card.&lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;card id="temp"&gt;<br />&lt;do type="accept" label="start"&gt; <br />　　 &lt;go href="#first"/&gt;<br />&lt;/do&gt; <br />&lt;p&gt;haha, you are lost!&lt;/p&gt;<br />&lt;/wml&gt;<br /><br /><br /></p>
		<h2>WML文档结构祥解</h2>
		<p>1、声明（Prologue）<br />&lt;?xml version="1.0"?&gt; <br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.com/DTD/wml_1.1.xml"&gt; </p>
		<p>2、元素（Element）<br />　　 WML首先定义一个Deck，然后在Deck内封装信息和Card。</p>
		<p>3、文件头（Head Element）<br />　　 头信息包含与Deck有关的信息，包括meta数据和控制元素。</p>
		<p>　　3.1、访问权限设置（Access）</p>
		<p>　　该元素用于设置有访问当前Deck权限的列表。如果Deck内不包含Access Element信息，该Deck下的Access Element处于无效状态，其他所有的Deck都可以访问该Deck。</p>
		<p>　　相关属性: </p>
		<p>　　domain：假如设置 &lt;access domain="sina.com.cn"/&gt; 那么 http://www.sina.com.cn/ 将有访问权限, 而 http://www.sino.com.cn/ 和 http://www.sina.net.cn/ 就没有.</p>
		<p>　　path：工作原理与Domain非常相似，例如设置&lt;access path="/internal"/&gt; 那么"/internal/wml" 将获得访问权限，而"/internal-wml"就没有。</p>
		<p>示例：</p>
		<p>　　做如下设置 &lt;access domain="sina.com.cn" path="/wap"/&gt;</p>
		<p>　　那么以下几个Url具有访问权限：</p>
		<p>　　http://www.sina.com.cn/wap/goto.cgi <br />　　 http://www.sina.com.cn/wap/index.wml <br />　　 http://www.sina.com.cn/wap/cgi-bin/create_report.cgi?name=123&amp;pwd=234 </p>
		<p>　　以下的几个Url没有访问权限：</p>
		<p>　　http://www.sina.com/wap/getuid.cgi <br />　　 http://www.sina.com.cn/internal/wap/getuid.cgi </p>
		<p>3.2、头元素设置（Meta）</p>
		<p>　　&lt;meta 属性 content="值" scheme="格式" forua="true|false"/&gt;和HTML中的类似，提供了该DECK的meta信息。</p>
		<p>例如：&lt;meta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt;</p>
		<p>　　content属性是必选的，其内容根据属性而定。scheme属性目前尚不支持。forua为可选属性，指定在该wml文件传到客户端之前，&lt;meta&gt;标签是不是被中间代理删除(因为传输的协议可能改变)，默认值为false。</p>
		<p>　　目前支持的meta数据:</p>
		<p>　　&lt;meta http-equiv="Cache-Control" content="max-age=0"/&gt;指定DECK在手机内存缓存中的存储时间段，默认的为30天(除非内存耗尽)，在该期间，手机对于访问过的DECK直接从缓存里调用。如果信息是对时间敏感的，可以用max-age指定DECK在缓存里的生存期，最小单位是秒，如果指定为0，则每次都需通过连接服务器来调用该DECK。</p>
		<p>　　&lt;meta user-agent="vnd.up.markable" content="false"/&gt;和&lt;meta user-agent="vnd.up.bookmark" content="指定的URL"/&gt;类似于普通浏览器的书签功能。当用户将一个CARD做了书签后，手机浏览器首先用一个标记记录该CARD，这个标记默认的是&lt;card&gt;标签中的title属性(以后会讲到)，然后当用户选择了该书签以后，浏览器就会打开被记录的URL。但是因为在默认的情况下，手机会记录所有的DECK，所以，一般&lt;meta&gt;被用来使手机不要记录当前的URL，即&lt;meta user-agent="vnd.up.markable" content="false"/&gt;。此外，如果要为书签指定不同于当前DRECk的URL，用&lt;meta user-agent="vnd.up.bookmark" content="指定的URL"/&gt;。</p>
		<p>4、模板（Template）<br />　　 为了节省资源，可以把每个Card中都要用到的Task设置在模板中，供当前Deck中所有Card使用，加入个别Card不需要该模板内容，可以Override掉它（详见任务屏蔽）。</p>
		<p>5、卡片（Card）<br />　　 适用事件</p>
		<p>　　以下事件适用于Card和Template，参见前面的相关说明。<br />　　 1. onenterbackward <br />　　 2. onenterforward <br />　　 3. ontimer </p>
		<p>　　卡片属性（Card）</p>
		<p>　　id：同一Deck内Card的唯一标识，可以作为标签被使用。(#nextcard). </p>
		<p>　　title：卡片标题。不同的浏览器处理标题处理title的原则不一样，有的浏览器会显示标题，如果当前卡片没有设置标题，当前卡片的URL会被显示在标题位置。有些浏览器为了节省显示区域会忽略标题。</p>
		<p>　　newcontext：默认值为false，用来指示当跳转到本CARD时，手机是不是要清除以前保留的信息，包括变量，堆栈里的历史记录，重新设置手机状态等。</p>
		<p>　　ordered 布尔变量，声明Card是否有序。通常可以用来开发自动播放的幻灯片效果。 </p>
		<p>示例：</p>
		<p>&lt;?xml version="1.0"?&gt; <br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt; <br />&lt;wml&gt; </p>
		<p>&lt;head&gt; <br />　　 &lt;access domain="sina.com.cn" path="/wap"/&gt;<br />&lt;/head&gt; </p>
		<p>&lt;template&gt; <br />　　 &lt;do type="accept" name="accept1" label="OK"&gt;<br />　　　　 &lt;go href="#accept"/&gt;<br />&lt;/do&gt; <br />&lt;/template&gt; </p>
		<p>&lt;card id="start" title="Start Here"&gt;<br />&lt;p&gt; Start Here. &lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;card id="accept" title="Okay Card"&gt; <br />&lt;do type="accept" name="accept1" label="Okay"&gt; <br />　　 &lt;go href="#accept2"/&gt; <br />&lt;!-- override the same task in template--&gt;<br />&lt;/do&gt; <br />&lt;p&gt; Card Accept &lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;card id="accept2" title="OK Card" &gt; <br />&lt;do type="accept" &gt; <br />　　 &lt;go href="#start" /&gt; <br />&lt;/do&gt; <br />&lt;p&gt; Card Accept2 &lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;/wml&gt; <br /><br /><br /><br /></p>
		<h2>Select List 控件</h2>
		<p>对表单的控制能力可以证明一个HTML设计者是否够专业，而且很多交互功能也必须依赖表单。WML没有表单属性，但是WML可以直接使用控件，同样可以达到使用表单的效果。因此，使用控件的水平可以体现一个WML设计者的制作水平。 </p>
		<p>WML控件有Select List和Input Box两个系列，每个系列另外包含几个子系列，基本可以满足表单设计的需求。 </p>
		<h2>选择列表控件（Select List） </h2>
		<p>Select有两对很重要也很容易混淆的属性：name, value , iname , ivalue。这四个属性的区别和用途不太容易描述清除，看了后面的例子会很容易理解。 </p>
		<p>每个Select是一个或多个Option的集合，Option地结果返回给Select元素的name和iname。 </p>
		<p>示例： </p>
		<p>&lt;select name="name" iname="iname value="value" ivalue="ivalue"&gt; <br />&lt;option value="S"&gt;sina&lt;/option&gt; <br />&lt;option value="Y"&gt;yahoo&lt;/option&gt; <br />&lt;/select&gt; </p>
		<p>相关属性: </p>
		<p>1. multiple 这个布尔变量的值决定是否允许多重选择，值为True时Select控件允许复选，否则相反。 </p>
		<p>2. name &amp; Value 这一组变量的主要作用是获取于该option的返回值，value提供name的缺省值。 </p>
		<p>3. iname &amp; ivalue 与上一组参数功能相似，不同的是ivalue返回有效Option的序列号。被选中的控件用它的序号表示，0代表没有option被选中，假如第二个和第三个同时被选中就表示为 2;3 </p>
		<p>4. title 作为标题参数提供给浏览器，但是不同的浏览器处理方式有所不同，有些浏览器直接显示选项内容不显示标题，有的浏览器显示标题，按选择键进入选择界面。 </p>
		<p>5. tabindex 提供给浏览器的控件序号参数。 </p>
		<h2>2、选项控件 </h2>
		<p>Option只有包含在Select内才有意义，无法单独使用。 </p>
		<p>相关属性: </p>
		<p>1. value Option的返回值，假如当前Option被选择，这个Value的值会被传送到Select元素的Name变量。 </p>
		<p>2. title 供浏览器显示的选项标题。 </p>
		<p>3. onpick 如果当前Option被点选，浏览器跳转到指定的Url。 </p>
		<p>示例1： </p>
		<p>&lt;card&gt; <br />&lt;p&gt;Please choice your favourite Web.&lt;br/&gt; <br />&lt;select name="X"&gt; <br />&lt;option value="S"&gt;sina&lt;/option&gt; <br />&lt;option value="Y"&gt;yahoo&lt;/option&gt; <br />&lt;/select&gt; <br />&lt;p&gt; <br />&lt;/card&gt; </p>
		<p>上例是一个基本的单选列表，选择的结果被赋值给X。 </p>
		<p>示例2： </p>
		<p>&lt;card&gt; <br />&lt;p&gt;Please choice all your favourite Web.&lt;br/&gt; <br />&lt;select name="X" iname="I" ivalue="1;3" multiple="true"&gt; <br />&lt;option value="S"&gt;sina&lt;/option&gt; <br />&lt;option value="Y"&gt;yahoo&lt;/option&gt; <br />&lt;option value="N"&gt;netease&lt;/option&gt; <br />&lt;/select&gt; <br />&lt;p&gt; <br />&lt;/card&gt; </p>
		<p>上例是一个使用了iname和ivalue的多选列表，I被预置为 1;3 。假如用户选择了sina和yahoo，X被赋值为 S;Y，I被赋值为 1;2。假如用户不做任何选择，I等于1;3，X内容为空。 </p>
		<p>示例3： </p>
		<p>&lt;card&gt; <br />&lt;p&gt;Jump to your favourite Web.&lt;br/&gt; <br />&lt;select&gt; <br />&lt;option onpick="http://wap.sina.com.cn"&gt;sina&lt;/option&gt; <br />&lt;option onpick="http://wap.chnmobile.net"&gt;china mobile&lt;/option&gt; <br />&lt;/select&gt; <br />&lt;p&gt; <br />&lt;/card&gt; </p>
		<p>上例演示了Option的onpick功能，不管Option的状态如何，只要它被点选，浏览器就会跳转到指定的Url。 </p>
		<p>示例四： </p>
		<p>&lt;card&gt; <br />&lt;p&gt;Please choice your favourite Web.&lt;br/&gt; <br />&lt;select name="X"&gt; <br />&lt;option value="S"&gt;sina&lt;/option&gt; <br />&lt;option value="Y"&gt;yahoo&lt;/option&gt; <br />&lt;option value="S;Y"&gt;both&lt;/option&gt; <br />&lt;/select&gt; <br />&lt;p&gt; <br />&lt;/card&gt; </p>
		<p>上例演示了一个通过单选功能完成多选需求的示例。 <br /><br /><br /><br /></p>
		<h2>
				<strong>分组选择控件（Optgroup）和复杂实例 </strong>
		</h2>
		<p>相关Option分组产生层级，对最终用户来说可能没有什么意义，但是对于制作者来说，Option分组可以提供很多方便。</p>
		<p>相关属性: </p>
		<p>1. title 标题，通常这种标题无法被显示</p>
		<p>示例：</p>
		<p>&lt;card&gt; <br />&lt;p&gt; What OS You Use Now？<br />　 &lt;select name="OS"&gt;<br />　　 &lt;optgroup title="microsoft"&gt;<br />　　　 &lt;option value="dos"&gt;dos&lt;/option&gt;<br />　　　 &lt;option value="windows"&gt;windows&lt;/option&gt;<br />　　 &lt;/optgroup&gt; <br />　　 &lt;optgroup title="others"&gt; <br />　　　 &lt;option value="unix"&gt;unix&lt;/option&gt; <br />　　　 &lt;option value="linux"&gt;linux&lt;/option&gt; <br />　　 &lt;/optgroup&gt; <br />　 &lt;/select&gt; <br />&lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>上例演示了一个基本的Optgroup元素的应用，由于Optgroup没有变量参数，所以只能提供有限的应用。</p>
		<p>一个比较复杂的例子：</p>
		<p>&lt;?xml version="1.0"?&gt; <br />&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt; <br />&lt;wml&gt; </p>
		<p>&lt;template&gt; <br />　　 &lt;do type="options" label="Back"&gt; <br />　　　　 &lt;prev/&gt; <br />　　 &lt;/do&gt; <br />&lt;/template&gt; </p>
		<p>&lt;card id="lists"&gt; <br />&lt;p&gt; <br />&lt;select title="Pick Lists"&gt; <br />　　 &lt;option onpick="#JY"&gt;Jin Yong&lt;/option&gt; <br />　　 &lt;option onpick="#GL"&gt;Gu Long&lt;/option&gt; <br />&lt;/select&gt; <br />&lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;card id="JY"&gt; <br />&lt;onevent type="onenterbackward"&gt; <br />　　 &lt;prev/&gt; <br />&lt;/onevent&gt; <br />&lt;do type="accept"&gt; <br />　　 &lt;go href="#display_fav"/&gt; <br />&lt;/do&gt; <br />&lt;p&gt; Pick your fav Book: <br />&lt;select name="fav" title="Stooges"&gt; <br />　　 &lt;option value="Xiao"&gt;Xiao ao jiang hu&lt;/option&gt; <br />　　 &lt;option value="She"&gt;She diao ying xiong&lt;/option&gt; <br />　　 &lt;option value="Lu"&gt;Lu ding ji&lt;/option&gt; <br />　　 &lt;option value="Shen"&gt;Shen diao xia lv&lt;/option&gt; <br />&lt;/select&gt; <br />&lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;card id="GL"&gt; <br />&lt;onevent type="onenterbackward"&gt; <br />　　 &lt;prev/&gt; <br />&lt;/onevent&gt; <br />&lt;do type="accept"&gt; <br />　　 &lt;go href="#display_fav"/&gt; <br />&lt;/do&gt; <br />&lt;p&gt; Pick your fav Book. <br />&lt;select multiple="true" title="Gu Long" name="fav" &gt; <br />　　 &lt;option value="Gu"&gt;Gu xing zhuan&lt;/option&gt; <br />　　 &lt;option value="Da"&gt;Da di fei ying&lt;/option&gt; <br />　　 &lt;option value="Tian"&gt;Tian ya ming yue dao&lt;/option&gt; <br />　　 &lt;option value="feng"&gt;Lu xiao feng&lt;/option&gt; <br />&lt;/select&gt; <br />&lt;/p&gt; <br />&lt;/card&gt; </p>
		<p>&lt;card id="display_fav"&gt; <br />&lt;p&gt; Your fav was $fav. &lt;/p&gt; <br />&lt;/card&gt; <br />&lt;/wml&gt; </p>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/35788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-17 10:59 <a href="http://www.blogjava.net/zhangrenquan/articles/35788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>