本文主要是介绍WAP初级教程笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
WML基本情况
WML----Wireless Markup Language
WML是XML的子集。WML文件以*.wml命名。WML文件必须满足XML文档的规则。
WML文档通常使用XML解释器解释。
WML文档编辑环境
编辑器---WML本身是文本,所以任何文本编辑器都可以完成。
模拟器---NOKIA ERICSSON MOTOROLA等都可以。
图形转换--制作适合WAP的图片,pic2wbmp。
文字转换--汉字<-->UNICODE UTF-8。
WML文件结构
WML文档页面通常叫做桌面(DECK),由一组互相连接的卡片(CARD)组成。
当移动设备访问WML的一个页面,页面所有的CARD都下载到WAP设备里面。CARD的切换由电话内置的设备处理,不再从服务器上取信息了。
CARD可以包含文本、标记、链接、输入控制、任务(TASK)、图像等等。
文档包含在下面的格式里面:
实体--<xml>...</xml>
CARD--<card>...</card>
文字--<p>...</p>
简单例子:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="HELLO" title="HELLO">
<p>
Hello world!
</p>
</card>
</wml>
显示结果如下:
------ HELLO ------
Hello World!
WML字符集:
WML是XML的子集,继承了XML的字符集设置。
WML文档缺省的字符集是UTF-8。
要显示中文有两种方式:
1、在前面指定字符集,但是目前不支持,具有关人士说,CDMA的手机都已经基本上支持;
<?xml version="1.0" encoding="gb2312"?>
2、使用UNICODE代码来代表中文:
<b>&#x 901A ;讯&#x 5F 55;</b>
代表:
通讯录
WML元素:标记(Tag)和属性
由于标记会降低WAP设备的通讯速度,所以WML标准里面仅仅使用了很少的一部分,大部分还是文本。
用于表格和图像的标记基本上都被忽略了。
<tag>内容</tag> 例如:<p>Hello world!</p>
或
<tag/> 例如:<br/> 和 <go href="#done"/>
WML同样支持标志中标出属性。属性不在屏幕上显示出来。
WML标记和属性的值都是大小写敏感的(<xml>和<XML>是不一样的),而且标记必须严格按照xml的标准结束。
WML要求属性的值必须放在双引号或者单引号内。单引号可放在属性标志内或者双引号内。
字符也可以为属性的值。
WML注释
XML支持的注释格式:
<!You can not see this missage--->
WML不支持嵌套元素注释。
链接(URL)
WML外部引用方式跟HTML相同
http://www.wap86.net/great.wml 或
http://www.wap86.net/great.wml#login
如果是内部引用,如果next是当前的DECK中的一个CARD时,可以使用这种方式:
#next
提供链接的WML元素有2个:<go>和<anchor>。
CDATA
XML支持CDATA的概念,显示不需要解释的文本信息。
<! [CDATA [ <card name="bogus"><p>this is data</p></card> ] ]>
浏览器窗口将显示如下内容:
<card name="bogus"><p>this is data</p></card>
格式
定义变量:
$identifier |
变量的字符串级别最高,如果遇到相同的字符串,首先被认为是变量。显示$,需要后面在跟一个,$$。例如:
You account has $$ 1650.00 in it. |
变量名称规则:
1、变量名是由US-ASCII码、下划线和数字组成;
2、只能以US-ASCII码开头;
3、变量名大小写敏感。
注意:
1、WML变量没有类型,均表示为字符串;
2、变量没有被赋值的时候,内容为空,即空字符串。
3、可以在运行过程中改变它的值。
创建变量
最简单的方法是使用<setvar>元素,语法如下:
<setvar name="string" value="string" /> |
<setvar>只能在<go>、<prev>和<refresh>中使用。
下例定义了一个叫vNAME的变量并赋值为“Jeff”:
<setvar name="vNAME" value="Jeff" /> |
另外,还可以在<input>、<select>和<postfield>中定义变量。
替换文本
变量可以用作替换用途,但只能在文本类型(如显示字符、URL等)中使用。
任何元素和属性都不能使用变量来替代。例如:
Hello, $vNAME. |
将显示:
Hello, Jeff. |
ESCAPE转换
前面说过变量可以用作替换用途,但是在URL中使用时,变量的内容必须遵守[RFC2396]标准。
这个标准规定某些特殊字符在URL里使用的时候必须用特殊表示方法,即ESCAPE八进制表示。
例如:
list.asp?id=3 |
在URL中要表示为:
list.asp%3fid=3 |
所以变量有可能需要标志为是否对其内容进行ESCAPE转换,变量定义就有如下几种特殊方式:
效果 | 表达方式1 | 表达方式2 | 表达方式3 |
对变量中ESCAPE字符进行转换 | $(var:e) | $(var:E) | $(var:escape) |
不进行ESCAPE转换 | $(var:u) | $(var:U) | $(var:unesc) |
变量中没有ESCAPE字符 | $(var:n) | $(var:N) | $(noesc) |
给变量进行ESCAPE转换是WML的默认方式。
CARD里可以显示象文本、图像这样的内容。
段落与换行标记
<p>:段落标记,用来对段落进行分段。语法:
<p |
aligh:文字对齐方式,左(left)、右(right)、居中(center)。
mode:文字超出屏幕时是否折行,各种终端处理方式不同。
xml:lang:显示语言编码。
<br>:行分隔标记,产生回车效果。
语法:
<br |
xml:lang:显示语言编码。
段落和换行的例子:
<?xml version="1.0"?> |
显示结果如下:
------ Paragraphs ------ |
标记 | 字体样式 |
<b> | 粗体 |
<big> | 大字体 |
<em> | 强调字体 |
<i> | 斜体 |
<small> | 小字体 |
<strong> | 加重强调字体 |
<u> | 下划线字体 |
文字样式标记
WML提供了一系列文字样式的标记,如右表所示。不过WML鼓励大家尽量使用<strong>和<em>标记,因为某些WAP终端会忽略其他标记。
每个文字样式标记语法都一样,都有一个标志语言代码的xml:lang属性。
下面是一个例子:
<?xml version="1.0"?> |
在你的终端上可能会有这样的显示:
list.asp%3fid=3 |
所以变量有可能需要标志为是否对其内容进行ESCAPE转换,变量定义就有如下几种特殊方式:
----- Formatting ----- |
表格
WML支持简单的表格标记<table>、<tr>和<td>。语法如下:
<table |
在WML里定义一个表格必须先指定列数,即columns属性。而在表格里就必须有相应数量的<td></td>标记对。因该注意的是,align(对齐)属性的内容只能是L(左对齐)、R(右对齐)和C(居中),跟其他标记不同(是不是有点怪?)。
下面的例子演示了表格的基本功能:
<?xml version="1.0"?> |
显示结果(注意WML里没有表格线):
------ SALARY ------ |
图像
WML支持WBMP(Wireless Bitmap)格式的图像,需要用特殊工具制作。
显示图像使用<img>标记,语法如下:
<img |
alt: 图像无法显示时的替换文字。
src: 图像的url。
localsrc: 储存于ROM(或RAM)中图像的名字,各种终端支持不同。
align: 上下对齐方式。
height: 图像显示高度。
width: 图像显示宽度。
hspace: 图像左右的空白,以pixel数或百分比表示。
vspace: 图像上下的空白,以pixel数或百分比表示。
上面的属性只有alt和src是必须的。其他附加属性基本上仅仅用来指示用户终端,大多数情况下会被忽略。下面是个例子:
<?xml version="1.0"?> |
下面分别是在支持和不支持图像的终端上的显示结果:
|
|
桌面 (DECK)
由于网络带宽以及某些WAP服务器DECK传输的限制,DECK越小越好,最好不要超过1.2K。
如果DECK很复杂那就分成多个DECK完成。
完整的WML文档结构如下:
<?xml version="1.0"?> |
XML说明
DECK开头必须指明以下的XML类型声明:
<?xml version="1.0"?> |
第一行指出XML版本,紧跟的文档类型(DOCTYPE)声明指出所引用的语言标准定义。
这两句的位置和顺序不可更改,而且中间不能有空行。
<wml>
语法
<wml>标签和HTML中的<html>标签一样,用来表明这是一个WML的DECK。xml:lang属性来指定文档的语言,比如<wml xml:lang="zh">表示文档语言为中文。
<head>
<head>标签包含了该DECK的相关信息。<head>标签之间可以包含一个<access>标签和多个<meta>标签。
<access>
<access |
<access>相当于HTML中的<BASE>标签,指定该DECK的访问控制信息,它的两个属性是可选的。
domain:指定域,默认值为当前域。
path:指定路径,默认值为"/",即根目录。
<meta>语法:
<meta |
和HTML中<META>的类似,<meta>提供了该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文件传到客户端之前,<meta>标签是不是被中间代理删除(因为传输的协议可能改变),默认值为false。
目前支持的meta数据:
<meta http-equiv="Cache-Control" content="max-age=3600"/>指定DECK在手机内存缓存中的存储时间段,默认的为30天(除非内存耗尽),在该期间,手机对于访问过的DECK直接从缓存里调用。如果信息是对时间敏感的,可以用max-age指定DECK在缓存里的生存期,最小单位是秒,如果指定为0,则每次都需通过连接服务器来调用该DECK。
<meta user-agent="vnd.up.markable" content="false"/>和<meta user-agent="vnd.up.bookmark" content="指定的URL"/>类似于普通浏览器的书签功能。
当用户将一个CARD做了书签后,手机浏览器首先用一个标记记录该CARD,这个标记默认的是<card>标签中的title属性(以后会讲到),然后当用户选择了该书签以后,浏览器就会打开被记录的URL。
但是因为在默认的情况下,手机会记录所有的DECK,所以,一般<meta>被用来使手机不要记录当前的URL,即<meta user-agent="vnd.up.markable" content="false"/>。
此外,如果要为书签指定不同于当前DECK的URL,用<meta user-agent="vnd.up.bookmark" content="指定的URL"/>。
<template>
<template>元素声明一个DECK级的事件/请求,对DECK页面中所有CARD有效,当然某个CARD可以通过定义同名的事件来替代<template>声明中的事件处理。
语法:
<template |
onenterforward:当用户通过<go>进入CARD时调入的链接。
onenterbackward:当用户通过<prev>退回CARD时调入的链接。
ontimer:<timer>事件激活时调入的链接。
例子:
<wml> |
<card>
一个DECK可以包含多个CARD,每个CARD的内容可能不止一屏显示,注意DECK、CARD和屏幕显示范围的关系。一个CARD用<card>和</card>包含。
语法:
<card |
每个CARD元素可以有一个标号(ID)和标题(TITLE)。当然,这都不是必须的。
id:CARD的名字,在DECK中唯一,可用作URL已进行跳转。
title:CARD的标题,用户BOOKMARK一个CARD时的名字。该属性在某些用户终端上会显示出来。
newcontext:用来指示当跳转到本CARD时,用户终端(手机、模拟器等)是不是要清除以前保留的信息如变量、堆栈历史记录、终端状态等。默认值为FALSE。
ordered:表明该CARD里的内容是按固定的顺序显示,还是按用户的选择来显示。默认值是TRUE。这点和HTML不同,CARD页面里的内容可以按一定的顺序显示,默认的是按线性顺序显示,即按代码的顺序,但是,要注意的是,以下三个标签必须按以下顺序来写<onevent> <timer> <do>。这样做是为了方便填表单,当ordered设置为true时,如果一个表单的内容不能在一屏里显示完,就分成多屏显示;当ordered设置为false时,手机可以显示一个概要CARD来总结有效的选项,用户可以从中选取表单选项来填写。
onenterforward:当用户通过<go>进入CARD时调入的链接。
onenterbackward:当用户通过<prev>退回CARD时调入的链接。
ontimer:<timer>事件激活时调入的链接。
不同浏览器指标
> | Nokia 7110> | Ericsson R320> | Ericsson R380> | UP.Browser> |
CARD最大字节数> | 1397 字节> | 3000 字节> | 3800 字节> | 1492 字节> |
图象最大字节数> | 1397 字节> | 3000 字节?> | 3800 字节?> | 1492 字节?> |
显示行数> | 4 (含标题行)> | 5> | 7> | 视终端不同> S3568i:6> |
显示列数> | 19> | 14> | 不知道> | 视终端不同> |
显示宽度(象素)> | 95> | 101> | 304> | 视终端不同> |
显示高度(象素)> | 45> | 52> | 98> | 视终端不同> |
象素比例> | 1:1.25> | 不知道> | 1:1.23> | 视终端不同> |
字体> | 无> | Small, Bold, Emphasis, Strong> | Small, Big, Bold, Italic, Emphasis, Strong> | Small, Big, Bold> |
文字位置> | 没有,强制居左> | 居左、居中、居右> | 居左、居中、居右、段落缩进> | 不知道> |
图象位置> | 强制居左> | 不知道> | 不知道> | 不知道> |
表格支持> | 不支持> | 最多5x5格> | 不知道> | 不知道> |
触摸屏> | 无> | 无> | 有> | 无> |
图标键> | 无> | 无> | 有> | 不知道> |
在WML页面内拨号> | "提取号码" 功能> | 通过WTAI支持> | 通过WTAI支持> | 3.1以上版本的浏览器支持> |
输入> | 在行内输入> | 在设置位置输入> | 在设置位置输入> | 不知道> |
输入格式> | 只有大小写> | 不知道> | 不知道> | 不知道> |
图形链接> | 无> | 有> | 有> | 不知道> |
链接格式> | 在行内> | 在设置位置> | 在设置位置> | 不知道> |
DECK下载顺序> | 文字,然后图形,再开始选择性计时> | 文字,开始选择性计时,然后是图(结果有可能是CARD还未下载完毕就已过时)> | 不知道> | > |
HTTP Redirect> | 支持> | 支持> | 支持> | 支持> |
没有结构和进程就没有程序。在WML中定义进程有很多方法,最简单的就是任务。
WAP1.1定义了几种类型的任务,任务通过对事件的响应改变程序的运行顺序。有四种WML任务:· <noop>
· <prev>
· <refresh>
· <go>
<noop>
这个任务不做任何事情,一般用于屏蔽DECK级事件,语法非常简单:
<noop/> |
<prev>
当用户激活该任务时,终端就转回上次用户访问过的URL。语法如下:
<prev> |
如果<prev>中包含了<setvar>元素,就会优先处理。
下面例子定义了一个只有Back按钮的的DECK,按下以后会返回前面看过页面。
<?xml version="1.0"?> |
<refresh>
当用户激活该任务时,就执行一个刷新过程。如果这个任务里使用<setvar>定义了变量,变量值将被重新设置。语法如下:
<prev> |
如果当前CARD含有<timer>元素,那么在刷新时<timer>优先启动。
下面的例子定义在屏幕刷新时重设firstname、lastname和age变量。
<do type="refresh"> |
<go>
当用户激活该任务时,就引导用户去WML中指定URL,可以是服务器上其他的DECK,也可以是本DECK中其他的CARD。语法如下:
<go |
href:必选属性,指向一个合法URL。如果是其他的DECK,则该DECK的第一个CARD会显示出来。如果是本DECK中的其他CARD,而历史堆栈里保存的是最新数据的话,则堆栈保持不变,直接调入该CARD。
sendreferer:如果为true,用户主体信息(USER AGENT)必须传送给WAP网关。传送时使用HTTP的提交头信息,即尽可能简短的相对URL。这个属性可以用来给服务器控制存取URL的权力。默认值为false。
Method:值必须为get或post。分别用来产生HTTP的GET和POST请求。若为get,则在URL中列出参数,例如:“http://www.wap86.net/bob.cgi?argone=one”;若为post,则数据在请求内部传送,不需要在URL中列出。
Accept-charset:指定字符集名称列表,服务器在接受<go>的时候必须接受这个编码规则。默认值为unknown。具体内容这里不作解释,在以后的高级教程中描述。
下面是一个简单的例子:
<go href="../topic.wml" sendreferer="true"> |
<postfield>
<postfield>并不是一个任务,但是跟<go>任务有关,所以在这里介绍。它用来定义“名称/值”对以便通过<go>向服务器发送HTTP请求。语法如下:
当用户激活该任务时,就引导用户去WML中指定URL,可以是服务器上其他的DECK,也可以是本DECK中其他的CARD。语法如下:
下面是一个简单的例子:
<postfield name="STRING" value="STRING" /> |
当一个含有<postfield>的任务被执行的时候,终端要完成这样一个过程:
1、识别“名称/值”对并准备参数变量;
2、参数变量转换成正确的字符集;
3、根据URL的ESCAPE规则对参数进行ESCAPE转码,编译成application/x-www-form-urlencoded的MIME类型;
4、根据method指定的请求模式提交任务。
下面的例子演示get模式的用法:
<go href="../news.asp" sendreferer="true" method="get"> |
服务器将收到这样的get请求:
GET ../news.asp?newstype=technology&newstext=wml HTTP/1.1 |
如果把前面的请求模式改成post,则同样的<go>任务产生的这样的post请求:
POST../news.asp HTTP/1.1 |
任务必须绑定倒某个事件上才能做一些有用的事情。
事件发生--〉任务执行,这才是完整的进程控制。
有4个元素可以帮助你完成事件对任务的绑定:<anchor>、<onevent>、<timer>和<do>。
<anchor> 链接
象HTML一样,WML也可以定义到其他程序的链接。在HTML中,链接通常用下划线和特殊颜色的方式表示跟其他内容的区别。在WAP终端上则没有严格的规则说如何表示一个链接,一般采用反白的显示方式。
<anchor>的语法如下:
<anchor |
title:链接的标题;
xml:lang:语言编码。
在这种定义方式中,实际上链接一般是通过<anchor>中包括的<go>元素完成的。比如下面的例子定义了2个CARD,点击第一个CARD里的“click me”链接会跳转到第2个CARD:
<?xml version="1.0"?> |
点击前显示: | 点击后显示: | ||
|
|
链接还有一种短格式,语法如下:
<a |
除了跟原来一样的两个属性以外,多了href属性,可以对它直接指定URL。例如下面的例子定义了一个带有图像的链接:
<a title="HotBars" href="wap.hucn.com/HotBars.wml"> |
除了跟原来一样的两个属性以外,多了href属性,可以对它直接指定URL。
<onevent> 固有事件
WML定义了4种由用户终端触发的固有事件:
oneventforward:当用户被<go>任务或其他机制(如一个SCRIPT过程)引导到一个CARD时触发;
oneventbackward:当用回被<prev>或其他机制(如在设备上按BACK按钮)引导到一个CARD时触发;
ontimer:当TIMER计时结束时触发。定义TIMER计时器可以使用<timer>元素,见下一节;
onpick:当用户按下一个<option>选项时触发(可以是选中或取消选择)。
把这些事件绑定到一个任务要使用<onevent>元素,它的语法如下:
<onevent |
下面的例子演示了如何使用固有事件在CARD调入时清空变量。
<?xml version="1.0"?> |
<timer> 计时器
看名字就知道,这是个计时器,它在经过规定的计时时间以后产生一个任务。<timer>计时器只在所属CARD里有效:当进入CARD时,计时器开始工作;时间一到,触发任务;如果离开CARD,计时器停止。语法如下:
<timer |
name:可选。指定一个包含计时时间的变量,在计时器开始工作以后,变量的值会逐渐减少。如果这个变量在<timer>之前就已经存在并且赋值为一个非负整数,那后面value属性的值会被忽略,直接使用变量里的值作为计时时限。
value:必选。指定计时时间,以1/10秒为单位。
下面的例子每隔1秒显示不同的文字(当然,你有兴趣改成图像也可以)。
<?xml version="1.0" standalone="yes"?> <card id = "card2" title = "card2"> <card id = "card3" title = "card3"> </wml> |
显示结果如下,注意会不断循环。 |
| Sport选择: | |||
第1秒 | 第2秒 | 第3秒 | |||
|
|
|
还有一个例子,通常用来做网站封面,显示一段欢迎词以后进入正式内容。这里没有使用图片,各位可以自己加上试试看。
<?xml version="1.0"?> |
部件 | 功能 |
accept | 确认,接受输入 |
prev | 退回历史页面访问堆栈里上一个CARD |
help | 上下文关联的帮助信息 |
reset | 重设设备状态 |
options | 上下文关联的选项或附加操作 |
delete | 删除当前内容或选择 |
unknown | 由开发者自己定义 |
<do> 用户触发事件
每个WAP终端都预定义了一系列用户界面部件,如手机上的按钮、触摸屏上的图表、声音指令或者其他一些很容易是别的部件。WML1.1定义了右面那些WAP兼容终端必须支持的部件。但是要说明的是,只有prev有预先定义的功能,其他的只是概念上的定义,需要根据开发者激活并赋予一定的动作。
当用户激活这些部件的时候会产生相应的事件。你可以使用<do>元素捕获这些事件并对其做出反应。下面是<do>的语法:
<do |
type:必选属性,内容只能是那7种;
label:用户接口部件的显示标签。如果终端不能显示则被忽略。WML1.1建议此属性长度限制在6个英文字符以内;
name:标志“事件/任务”绑定关系的唯一名称(在CARD范围内)。CARD级的<do>事件替换同名的DECK级<do>事件(见下一节)。如果不指定name属性或name为空字符串,则name默认为type的类型;
optional:告诉终端此软按钮在屏幕中是否显示。如果此值设为true,则忽略本<do>元素。默认值为false;
xml:lang任务:语言代码。
跟其他“事件/任务”绑定关系一样,<do>里的任务定义必须是<go>、<noop>、<prev>或<refresh>中的一个。
下面例子演示了<do>的使用方法。用户按了不同的按钮会被导向不同的CARD。
<?xml version="1.0"?> |
显示结果 | |||||
主画面: | 按下“Links”按钮以后: | 按下“Help”按钮以后: | |||
|
|
|
DECK级事件
前面已经讲过可以用<template>元素定义DECK级事件,做法跟CARD级事件一样,只要在<template>元素里包含<do>或<onevent>事件就可以。这种做法可以定义一些在每个CARD里都需要定义的事件,而不需要重复说明。
比如下面的例子给所有的CARD定义了BACK按钮以便返回上一页:
<?xml version="1.0"?> |
这篇关于WAP初级教程笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!