当前位置:编程学习 > wap >>

第二章 WML语言基础

答案:完成wap服务器的建立和wap浏览器的安装之后,我们接下来就可以使用wml语言来编写wap网页或应用,并通过wap服务器及浏览器进行调试。从本章开始我们将系统地学习wml语言,本章主要讲解wml语言的基础知识,下一章全面讲解wml的语法、标签和规则。
  2.1 wml的简单例子及编辑、测试方法
  无限标记语言wml(wireless markup language)是一种基于扩展标记语言xml(extension markup language)的语言,是xml的子集。它可以显示各种文字、图像等数据,是由wap论坛(http://www.wapforum.org)提出并专为无线设备用户提供交互界面而设计的,目前版本为1.1版。这些无线设备包括移动电话,呼机和个人数字助理pda(personal digital assistants)等。
  2.1.1 wml与wap设备
  为了更好的了解和使用wml语言,开发人员应对wml使用的设备和支持wml的设备的特点、特征有个大概的了解。
  一般而言,wml使用的无线设备通常具有以下特点:
  与普通的个人计算机相比,体积较小;
  设备的内存有限,且其cpu性能也有限;
  通讯带宽较窄、时延较长。
  以移动电话、pda为例来讲,支持wml的设备主要具有以下特征:
  有一个显示屏幕,可显示2.凶址啃?2各字符;2.凶址型ǔ0ūa舾δ馨磁サ囊恍校?br>支持数字和字符的输入;
  支持操作者使用箭头或数字按钮进行选择;
  支持ascii的可打印码;
  通常都有两个可编程功能键,即accpet键和options键,一般安排在接近键盘的屏幕下方;
  通常有一个prev导航键。
  我们介绍wml所使用wap设备的目的,是希望读者通过wap设备的特点、特征来了解wml语言的特点,进而对wml编程所要解决的问题有个大概的认识。
  2.1.2 使用文本编辑器面写wml程序
  使用wml语言编写wap网页或应用时,需要使用一个编辑器进行编辑。与html编程一样,wml编写的程序也是纯文件文本,可以使用任意文本编辑器进行编写,比如windows系统中的“记事本(notepad)”等。也可以使用比如nokia wap toolkie等软件(有关此具体的用法会在以后的学习过程中提起)。我们先介绍第一种方法,随后介绍第二种。
  如果要使用"记事本(notepad)"来编写wml程序,则可以在windows系统中,单击“开始”按钮,然后从出现的菜单中,依次将光标指向“程序”、“附件”、“记事本”,启动“记事本”程序。屏幕上随后就会出现它的编辑窗口,从中就可以输入并编写wml程序了。
  作为举例,我们可以输入如下简单的程序。
  <?xml version="1.0"?>
  <!doctype wml public "-//wapforun//dtd wml 1.1//en" "http://www.wapforum.org/dtd/wml_1.1.xml">
  <xml>
  <card id="card1" title="title">
  <p>
  <!--write your card implementation here.-->
  hello world!!
  </p>
  </card>
  </xml>
  输完后将它保存为hello.xml文件。保存时注意文件的扩展名应为xml而不是txt。
  2.2 wml程序结构
  上一节我们降解了一个简单的wml程序,具有html编程的读者可以看出,wml程序在结构上形式上与html程序有很多相似之处。下面我们就根据一个实例来分析一下wml程序的结构及组成。
  2.2.1 wml的元素和标签
  分析实例之前,我们有必要对wml的元素和标签予以简单说明。与html类似,wml的主要语法也是元素和标签。元素是符合dtd(文档类似定义)的文档组成部分,如title(文档标题)、img(图像)、table(表格)等等,元素名不区分大小写。wml使用标签来规定元素的属性和它在文档中的位置。标签使用小于号(<)和大于号(>)括起来,即采用“<标签名>”的形式。标签分单独出现的标签和成对出现的标签两种。大多数标签是成对出现的,由首标签和尾标签组成。首标签和尾标签又分别称为起始标签和终止标签。首标签的格式为“<元素名>”,尾标签的格式为“</元素名>”。成对标签用于规定元素所含的范围,比?lt;b>和</b>标签用于界定黑体字的范围,也就是说<b>和</b>之间包住的部分采用黑体字显示。单独标签的格式为“<元素名/>”,他的作用是在相应的位置插入元素。如〈br/〉标签表示在该标签所在位置插入一个换行符。
  2.2.2 wml程序结构形式及组成的实例分析
  了解了上述知识后,下面我们在分析一个实例程序。程序如下:
  <?xml version="1.0"?>
  <!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapfourm.org/dtd/wml_1.1.xml">
  <wml>
  <card id="card1" ontimer="#card2" title="tookit demo">
  <timer value="50"/>
  <p aligh="center">
  </br></br></br>
  <big>
  <!--write your card implementation here.-->
  welcome to....
  </big>
  </p>
  </card>
  <card id-"card2" ontimer="#card 3"title="toolkit demo">
  <timer value="50"/>
  <p align="center">
  <br/><br/>
  <b>
  the nokia<br/>
  </b>
  wireless application protocol
  </u>
  ...
  </p>
  </card>
  <card id="card3"title="toolkit demo">
  <p align="center">
  <br/><br/><br/>
  <big>
  <i>
  toolkit
  </i>
  </big>
  </p>
  </card>
  </xml>
  该程序运行后将在wap手机屏幕依次显示3屏信息。先显示"welcome to ...",然后显示"the nokia wireless application protocol...",最后显示"tookit!"。显示时每屏都有标题"tookit demo",相邻两屏之间延时为50,其单位大小为1/10秒,延时50即5秒。
  通过以上实例我们可以了解到wml程序的结构形式及组成:
  1)语法。wml与html极为相似。仍然是一种标记语言,并且延续了xml的语法规则,具体的语法我们会以后的学习过程中遇到。
  2)文件声明。所有的wml程序必须在文件的开头处声明xml文件类型,包括xml的版本,wml的文档类型、所用规范等。声明形式如下:
  <?xml version="1.0">
  <!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/wml_1.1.xml">
  3)标签。在wml语言中需要使用标签(tag),其使用形式与html和xml等标记语言中的形式是完全一致的。
  4)元素。wml的元素(element)用于描述卡片组(deck)的标记信息即结构信息。一个元素通常有一个首标签、内容、其它元素及一个尾标签组成,具有下述两种结构之一:
  <首标签>内容</尾标签>
  或
  <标签/>
  元素包含的内容中还可以有元素,这些元素也是有首标签、相应内容、其它元素

[page_break] 及尾标签组成。不包含内容的元素成为空元素。它为一个单独的标签。或者说,单独的标签也是一种元素。
  5)属性。wml与xml一样,其标签可以包含很多属性。属性用于给标签提供必要的附加信息,且属性内容通常在起始标签内使用。不过,属性内容不会被浏览器显示,它至作为参数为标签提供必要的信息。
  指明属性值的时候,需要把该值用引号扩起来,可以是单引号或者双引号,引号通常成对嵌套使用。属性名称必须小写。例如:<card id="card 1" ontimer="#card2" title="toolkit demo">
  而且,单引号的属性中还可以包含双引号的属性。实体字符也可以作为属性值。实体字符是指诸如&、<、>、'、"的特殊字符,在wml程序中显示着类字符需要特殊处理,后面我们介绍具体方法。
  6)注释。wml程序中也可以加入注释。注释内容用于给开发人员顺利阅读源代码提供方便,它不会被浏览器显示出来。注释内容在标签中用感叹号(!)引出,并用于<!--注释内容-->的形式。例如:<!-- write your card implementation here.-->。需要说明的是,xml程序中不支持注释的嵌套。
  7)文档结构。wml文档是由“卡片(card)”和“卡片组(deck)”构成的,一个deck是一个或多个card的集合。当客户端发出请求之后,wml即从网络上把deck发送到客户浏览器,这是用户就可以浏览deck内包含的所有card,而不必从网上单独下载每一个card,程序中的第一个card是缺省得可见的card。
  注意:deck是一副纸牌的意思,这里是指一叠卡片,所以我们在这里称之为它为“卡片组”。另外,card指的是wap手机屏幕大小的网页,尽管有时一个card可能需要多屏才能显示完,但我们也可以把它翻译成“页面”,不过这样与html中的页面容易混合。因此我们在这里称之为卡片。
  2.2.3 wml程序的基本结构
  以上我们简单分析了wml的程序结构及组成,由此大家可以对wml程序有个整体上的初步认识。下面我们给出wml程序的基本结构。
  <?xml version="1.0"?>  <!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/wml_1.1xml">
  <wml>
  <head>
  <access/>
  <meta..../>
  </head>
  <card>
  some contents...
  </card>
  <wml>

  该基本结构可以分为以下几个关键部分:
  1)声明。wml程序有许多deck组成,对于每一个deck,在其文档开头必须进行xml的声明和文档类型doctype的声明。
  xml声明总是在文件的第一行,注意前面最好不要有空格或者还行:
  <?xml version="1.0"?>
  2)紧跟着是doctype声明,注意声明是字母的大小写不要搞错:
  <!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/wml_1.1xml">
  3)<xml>标签。该标签用于包含和定义wml的一个deck。它有一个可选的xml:lang属性来制定文档的语言,比如<wml xml:lang="zh">表示文档语言为中文。
  4)<head>标签。该标签用于包含和定义deck的相关信息。<head>标签之间可以包含一个<access>标签和多个<meta>标签。
  5)<access/>标签。它的一般形式是<access domain="域" path="/路径"/>,主要用于制定当前deck的访问控制信息,有两个可选的属性。其中,domain用来制定域,默认值为当前域,path用来制定路径,默认值为“/”,即跟目录。由于<access>单独使用,所以要用“/”结尾,后面我们还会系统的讲解wml的各种标签,这里即使看不懂也没关系,主要有些感性的认识就可以了。
  6)<meta...>标签。它的一般形式是<meta 属性content="值" scheme"格式" forua="true|false"/>,用于提供当前deck的meta信息,包括内存数据处理方式,以及数据传输方式和处理方式等。有关该标签的详细内容我们后面会专门给出。
  7)<card>标签。一个deck可以包含多个card,每个card的内容可能不止一屏显示。对于每一个card,wml均使用<card>和</card>进行包含和定义。<card>同时可以包含多个可选的属性,如<card id="name" title="label" newcontext="false" ordered="true" onenterforwand="url" pmemterbackward="url" ontimer="url">。至于这些属性的具体含义及功能,我们将在后面介绍。
  2.3 wml语言的基本知识
  上一节我们介绍了wml程序的基本结构,接下来我们介绍wml语言的基本知识,主要包括wml的字符集、变量、数据类型及wml程序的基本组成部分等。
  2.3.1 wml的字符集及编码
  wml使用xml的字符集,即通用字符集iso/iec-1062.,也即统一字符编码标准unicode 2.0。同时,wml还支持其他系列的字符集子集,例如utf-8、iso-8859-1或ucs-2等。其中:
  utf-8是指通用字符集ucs(universal character set)的转换格式8(transformation format 8),主要传输国际字符集的转换编码。utf-8采用了ucs字符的8位编码,提供了十分安全的编码格式,可以有效避免数据传输过程中的窃听、截取及非法解密。同时,utf-8与7位acsii码完全兼容,不会影响此类编码实现的程序;它的编码规则十分严格,能够有效避免同步传输错误,而且还会支持其它字符集提供了足够的空间。
  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编码的字符。
  ucs-2是iso 1062.标准中自定义的通用多8位编码字符集(universal multiple-octer coded character set)的2字节(即16位)编码标准,其字符编码值与unicode字符的标准编码值相等。
  wml文档可以采用html 2.0规范所定义的任何字符编码标准经编码处理。一般说来,wml文档的字符编码是需要转换为另外的编码格式,以与wap用户的手机浏览器所用字符标准相适应,否则,手机浏览器就无法显示wml页面中的字符。然而,编码转换时可能会丢失一些字符信息,所以,如果在用户端进行wml文档的编码转换,那么就可能导致某些结果信息丢失而不能被用户所浏览。因此,如有必要,我们应当尽量在wml页面传送到用户浏览器之前完成编码转换。
 

上一页  [1] [2] [3] [4]  下一页

[page_break]  为了解决这一问题,一方面,我们需要为web服务器补充定义wml的数据类型,以让服务器可以准确传输这些数据,另一方面,我们需要制订编码转换的原则。
  2.3.2 wml字符使用基本规则
  wml是一种比较严格的语言,字符使用必须遵守相应的规则,这些基本规则主要包括以下几个方面:
  1)大小写敏感。在wml中,无论是标签元素还是属性内容都是大小写敏感的,这一点继承了xml的严格特性,任何大小写错误都可能导致访问错误。
  一般来说,wml的所有标签,属性,规定和枚举及它们的可接受值必须小写,card的名字和变量可大写和小写,但它是区分大小写的。包括参数的名字和参数的数值都是大小写敏感的,例如variable1、variable1和variable1都是不同的参数。2)空格。对于连续的空字符,程序运行时只需要一个空格。属性名、符号(=)和值之间不能有空格。
  3)标签。标签内属性的值必须使用双引号(")或单引号(')括起来。对于不成对出现的标签,必须在大于号(>)前加上顺斜杠(/),比如换行标签必须写成<br/>才正确。
  4)不显示的内容。在wml中,不显示的字符主要包括换行符、回车符、空格和水平制表符,它们的8位十六进制内码分别为10、13、32及9。
  程序执行时,wml将忽视所有的多于一个以上的不显示字符,即wml会把一个或多个连续的换行、回车、水平制表符及空格转换成一个空个。
  5)保留字符。这是wml的一些特殊字符,如小于号(<)、大于号(>)、单引号“'”、双引号“"”、和号(&)。
  6)显示汉字。如果希望wml程序执行时能够显示汉字,则只需要程序开头使用encoding指定汉字字符集即可。例如:<?xml version="1.0" encoding="gb2312">。
  注意:指定汉字字符集的形式和方法可能因为开发工具或wap手机的不同而不同。
  2.3.3 变量
  wml编程中可以使用变量,变量使用前必须进行定义。变量一旦在deck中的某一个card上定义过,其他card则可以不必重新定义就能直接调用该变量。
  定义变量的语法格式为:
  $identifier
  $(identifier)
  $(identifier:conversion)
  其中identifier指变量名,或说变量标示符;conversion指变量的替代。
  变量名是由us-acsii码、下划线和数字组成的,并且只能以us-acsii码开头。变量名严格区分大小写,也即,变量名是大小写敏感的。
  定义变量的语法在wml中享有最高的解释优先级。
  有关变量的使用说明如下:
  1)在wml中,变量可以在字符串中使用,并且在运行中可以更新变量的值。
  2)当变量等同于空字符串时,变量将处于未设置状态,也就是空(null)。
  3)当变量不等同于空字符串时,变量将处于设置状态,也就是非空(not null)状态。
  4)在“$identifier”形式下,wml通常以变量名后面的一个空格表示该变量名的结束。如果在某些情况下空格无法表示一个变量名的结束,或者变量名中包含有空格,则必须使用括号将变量名括起来,即采用“$(identifier)”的形式。
  wml程序中的变量是可以替代的,我们可以把变量的数值赋给card中的某一文本。有关变量替代说明如下:
  1)在wml程序中,只有文本部分才可以实现替代。
  2)替代一般在运行期发生,而且替代不会影响变量现在的值。
  3)任何标签是按照字符串替代的方式实现的。
  4)替代是按照字符串替代的方式实现的。
  由于变量在语法中有最好的优先级,包含变量声明字符的字符串将被当作变量对待,所以如果要使程序显示“$”符号,则需要连续使用两个“$”进行说明。例如:<p> your acconut has $$15.00 in it </p>一句显示的结果为:your account has $15.00 in it。
  2.3.2. wml核心数据类型
  wml的核心数据类型均属于字符型数据,是根据xml的数据类型定义的,共有下述2.掷嘈停?1)cdata型。这种数据类型是wml用得最多的一种,可以是数字、字符串或包含数字的字符串。不过定义时,不论是数字或字符串,都必须以文本的形式定义,及数据用引号引起来。cdata型的数据仅用于属性值。例如"$(value)"或name="value"等。注意,这里的value指cdata型的数据值。
  2)pcdata型。这是从cdata中分解出来的一类数据,除了可以是文本形式的数字、字符串或两者的混合串外,还可以是wml的标签。pcdata型的数据只能用于wml的元素表示。
  3)nmtoken型。这是一类特殊的数据,凡是包含或部分包含数字、字母及标点符号的数据均属于nmtoken型数据。这种数据可以用标点符号开头,但不用于定义变量名或元素名。
  4)id型。专门用于定义wml元素名称的数据类型。
  在这2.掷嘈椭校珻data型用起来比较灵活,它可以使变量或数据免于语法检查。这是因为,cdata内的数据内容都会被当作文本来处理,从而可以避免wml的语法检查,直接作为文本显示出来。
  2.3.5 wml数据值性质
  除了nmtoken型数据外,wml其他3种数据都必须以文本形式即加上引号进行定义。我们关心的问题是,这些类型的数据可以表示哪些数据值呢?或者说,它们所表示的数据值的性质是什么呢?
  事实上,wml数据只在性质上可以是长度(length)、宏变量(vdata)、流(flow)、内行(inline)、布局(layout)、文本(text)、超链(href)、布尔值(boolean)、数据(number)或增强方式(emphasis)。
  2.3.6 卡片与卡片组
  前面我们分析了wml程序的结构时,曾将讲到wml文档的信息是通过卡片集和卡片组集的形式进行组织的。一个deck是一个或多个card的集合。当客户终端发出请求之后,wml即从网络上把deck发送到客户的浏览器,deck是服务器发送信息的最小单位。用户浏览器收到deck后,可以浏览其中包含的所有card。card用于表示或描述一个或多个用户交互单位。
  2.3.7 卡片组模板
  同一卡片组通常会含有许多卡片,这些卡片的定义、属性或格式通常都大同小异。如果我们逐一定义各个卡片,显然是十分麻烦的。为此,wml提供了卡片组模板的功能,模板内定义了一系列标准和参数,可以应用到同一卡片组的所有卡片中去,从而能够大大地提高我们的编程效率。有关卡片组模板的内容我们后面会专门介绍的。
  2.3.8 wml与url、程序段锚点
  我们知道,环球网www是各种信息和设备的网络,为保证全球范围内的交互,人们制定了3种规范:其一,统一资

上一页  [1] [2] [3] [4]  下一页

[page_break] 源定位器url提供所有网络资源的标准命名方式和定位方式;其二,标准协议,如http协议等,提供www资源的传输方式;其三。标准内容类型,如html、wml,提供www资源的内容形式及标准。wml沿用了这些规范,并扩大了url使用的范围。在wml中,不仅超连接、文件路径及文件名可以作为url处理,卡片名、宏变量名及各种内部资源名等也可作为url处理。
  为此,wml改进了html命名资源位置的方式,采用程序锚点(fragment anchor)的形式来处理wml程序中某段程序的地位。程序段锚点根据文档wml规则进行定义,并按照程序段表示符前加井字好(#)的方式书写。使用程序段锚点,wml程序可以在同一卡片组中定位不同的卡片。如果在程序中不指定程序段,那么程序中引用的url名称则指整个卡片组,而且卡片组的名称同时也是本卡片组内的第一个卡片的名称。2.3.9 浏览器操作历史
  为了在浏览器端管理wml程序的执行,wml使用“浏览器前后关系”的功能保存wml程序执行的状态及各种参数、变量等,这样可以用来记录用户的操作情况。同时,wml还提供了一个简单的导航历史模型,以url地址的形式记录了用户浏览时的各种操作,并把这些url地址放入历史推栈。通过推栈,用户即可实现历史浏览的回潮及其它操作。

上一页  [1] [2] [3] [4] 

上一个:MIME TYPE 大全
下一个:Wbmp格式研究

更多图片编程知识:
更多wap疑问解答:
为什么程序都退出了还可以收到推送?如果大多设备都可以推送那运营商怎么办?
qt 4.7 sqlserver2000 存储过程调用
Android FrameBuffer读屏幕30秒后mmap失败
联通粗定位用java程序如何来请求和接受数据
为什么QT运行Android平台的程序时,mouseMoveEvent事件响应的间隔时间很长??????????
android与PC蓝牙通讯
指定大小的label 内容可变,如果内容超出label的宽度,将未能显示的部分显示在另一个label上
android如何通过wifi连接无线打印机
运行程序,release目录下产生一个乱码文件夹
分享个某机构最新安卓资料,自己验证了
求助:QT5.0 没有QPrinter吗
直接调用 openmax IL 做 h264 解码, 有人会吗?
android在锁屏界面之上添加一个View
Bada模拟器如何访问pc机上的web
18396828106@163.com
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,