完成wap服务器的建立和wap浏览器的安装之后,我们接下来就可以使用wml语言来编写wap网页或应用,并通过wap服务器及浏览器进行调试。从本章开始我们将系统地学习wml语言,本章主要讲解wml语言的基础知识,下一章全面讲解wml的语法、标签和规则。2.1wml的简单例子及编辑、测试方法 无限标记语言wml(wirelessmarkuplanguage)是一种基于扩展标记语言xml(extensionmarkuplanguage)的语言,是xml的子集。它可以显示各种文字、图像等数据,是由wap论坛(http://www.wapforum.org)提出并专为无线设备用户提供交互界面而设计的,目前版本为1.1版。这些无线设备包括移动电话,呼机和个人数字助理pda(personaldigitalassistants)等。 2.1.1wml与wap设备 为了更好的了解和使用wml语言,开发人员应对wml使用的设备和支持wml的设备的特点、特征有个大概的了解。 一般而言,wml使用的无线设备通常具有以下特点: 与普通的个人计算机相比,体积较小;设备的内存有限,且其cpu性能也有限;通讯带宽较窄、时延较长。 以移动电话、pda为例来讲,支持wml的设备主要具有以下特征: 有一个显示屏幕,可显示2.凶址各字符;2.支持数字和字符的输入;支持操作者使用箭头或数字按钮进行选择;支持ascii的可打印码;通常都有两个可编程功能键,即accpet键和options键,一般安排在接近键盘的屏幕下方;通常有一个prev导航键。 我们介绍wml所使用wap设备的目的,是希望读者通过wap设备的特点、特征来了解wml语言的特点,进而对wml编程所要解决的问题有个大概的认识。 2.1.2使用文本编辑器面写wml程序 使用wml语言编写wap网页或应用时,需要使用一个编辑器进行编辑。与html编程一样,wml编写的程序也是纯文件文本,可以使用任意文本编辑器进行编写,比如windows系统中的“记事本(notepad)”等。也可以使用比如nokiawaptoolkie等软件(有关此具体的用法会在以后的学习过程中提起)。我们先介绍第一种方法,随后介绍第二种。 如果要使用" 记事本(notepad)" 来编写wml程序,则可以在windows系统中,单击“开始”按钮,然后从出现的菜单中,依次将光标指向“程序”、“附件”、“记事本”,启动“记事本”程序。屏幕上随后就会出现它的编辑窗口,从中就可以输入并编写wml程序了。 作为举例,我们可以输入如下简单的程序。 <?xmlversion =" 1.0" ?><!doctypewmlpublic" -//wapforun//dtdwml1.1//en" " http://www.wapforum.org/dtd/wml_1.1.xml" ><xml><cardid =" card1" title =" title" ><p><!--writeyourcardimplementationhere.-->helloworld!!</p></card></xml> 输完后将它保存为hello.xml文件。保存时注意文件的扩展名应为xml而不是txt。 2.2wml程序结构 上一节我们降解了一个简单的wml程序,具有html编程的读者可以看出,wml程序在结构上形式上与html程序有很多相似之处。下面我们就根据一个实例来分析一下wml程序的结构及组成。 2.2.1wml的元素和标签 分析实例之前,我们有必要对wml的元素和标签予以简单说明。与html类似,wml的主要语法也是元素和标签。元素是符合dtd(文档类似定义)的文档组成部分,如title(文档标题)、img(图像)、table(表格)等等,元素名不区分大小写。wml使用标签来规定元素的属性和它在文档中的位置。标签使用小于号(<)和大于号(>)括起来,即采用“<标签名>”的形式。标签分单独出现的标签和成对出现的标签两种。大多数标签是成对出现的,由首标签和尾标签组成。首标签和尾标签又分别称为起始标签和终止标签。首标签的格式为“<元素名>”,尾标签的格式为“</元素名>”。成对标签用于规定元素所含的范围,比?lt;b>和</b>标签用于界定黑体字的范围,也就是说<b>和</b>之间包住的部分采用黑体字显示。单独标签的格式为“<元素名/>”,他的作用是在相应的位置插入元素。如〈br/〉标签表示在该标签所在位置插入一个换行符。 2.2.2wml程序结构形式及组成的实例分析 了解了上述知识后,下面我们在分析一个实例程序。程序如下: <?xmlversion =" 1.0" ?><!doctypewmlpublic" -//wapforum//dtdwml1.1//en" " http://www.wapfourm.org/dtd/wml_1.1.xml" > <wml> <cardid =" card1" ontimer =" #card2" title =" tookitdemo" ><timervalue =" 50" /><paligh =" center" ></br></br></br><big><!--writeyourcardimplementationhere.-->welcometo....</big> </p></card> <cardid-" card2" ontimer =" #card3" title =" toolkitdemo" ><timervalue =" 50" /><palign =" center" ><br/><br/><b>thenokia<br/></b>wirelessapplicationprotocol</u>...</p></card> <cardid =" card3" title =" toolkitdemo" ><palign =" center" ><br/><br/><br/><big><i>toolkit</i></big></p></card> </xml> 该程序运行后将在wap手机屏幕依次显示3屏信息。先显示" welcometo..." ,然后显示" thenokiawirelessapplicationprotocol..." ,最后显示" tookit!" 。显示时每屏都有标题" tookitdemo" ,相邻两屏之间延时为50,其单位大小为1/10秒,延时50即5秒。 通过以上实例我们可以了解到wml程序的结构形式及组成: 1)语法。wml与html极为相似。仍然是一种标记语言,并且延续了xml的语法规则,具体的语法我们会以后的学习过程中遇到。 2)文件声明。所有的wml程序必须在文件的开头处声明xml文件类型,包括xml的版本,wml的文档类型、所用规范等。声明形式如下: <?xmlversion =" 1.0" ><!doctypewmlpublic" -//wapforum//dtdwml1.1//en" " http://www.wapforum.org/dtd/wml_1.1.xml" > 3)标签。在wml语言中需要使用标签(tag),其使用形式与html和xml等标记语言中的形式是完全一致的。 4)元素。wml的元素(element)用于描述卡片组(deck)的标记信息即结构信息。一个元素通常有一个首标签、内容、其它元素及一个尾标签组成,具有下述两种结构之一: <首标签>内容</尾标签>或<标签/> 元素包含的内容中还可以有元素,这些元素也是有首标签、相应内容、其它元素及尾标签组成。不包含内容的元素成为空元素。它为一个单独的标签。或者说,单独的标签也是一种元素。 5)属性。wml与xml一样,其标签可以包含很多属性。属性用于给标签提供必要的附加信息,且属性内容通常在起始标签内使用。不过,属性内容不会被浏览器显示,它至作为参数为标签提供必要的信息。 指明属性值的时候,需要把该值用引号扩起来,可以是单引号或者双引号,引号通常成对嵌套使用。属性名称必须小写。例如:<cardid =" card1" ontimer =" #card2" title =" toolkitdemo" > 而且,单引号的属性中还可以包含双引号的属性。实体字符也可以作为属性值。实体字符是指诸如&、<、>、、" 的特殊字符,在wml程序中显示着类字符需要特殊处理,后面我们介绍具体方法。 6)注释。wml程序中也可以加入注释。注释内容用于给开发人员顺利阅读源代码提供方便,它不会被浏览器显示出来。注释内容在标签中用感叹号(!)引出,并用于<!--注释内容-->的形式。例如:<!--writeyourcardimplementationhere.-->。需要说明的是,xml程序中不支持注释的嵌套。 7)文档结构。wml文档是由“卡片(card)”和“卡片组(deck)”构成的,一个deck是一个或多个card的集合。当客户端发出请求之后,wml即从网络上把deck发送到客户浏览器,这是用户就可以浏览deck内包含的所有card,而不必从网上单独下载每一个card,程序中的第一个card是缺省得可见的card。 注意:deck是一副纸牌的意思,这里是指一叠卡片,所以我们在这里称之为它为“卡片组”。另外,card指的是wap手机屏幕大小的网页,尽管有时一个card可能需要多屏才能显示完,但我们也可以把它翻译成“页面”,不过这样与html中的页面容易混合。因此我们在这里称之为卡片。 2.2.3wml程序的基本结构 以上我们简单分析了wml的程序结构及组成,由此大家可以对wml程序有个整体上的初步认识。下面我们给出wml程序的基本结构。 <?xmlversion =" 1.0" ?><!doctypewmlpublic" -//wapforum//dtdwml1.1//en" " http://www.wapforum.org/dtd/wml_1.1xml" ><wml><head><access/><meta..../></head><card>somecontents...</card><wml> 该基本结构可以分为以下几个关键部分: 1)声明。wml程序有许多deck组成,对于每一个deck,在其文档开头必须进行xml的声明和文档类型doctype的声明。 xml声明总是在文件的第一行,注意前面最好不要有空格或者还行: <?xmlversion =" 1.0" ?> 2)紧跟着是doctype声明,注意声明是字母的大小写不要搞错: <!doctypewmlpublic" -//wapforum//dtdwml1.1//en" " http://www.wapforum.org/dtd/wml_1.1xml" > 3)<xml>标签。该标签用于包含和定义wml的一个deck。它有一个可选的xml:lang属性来制定文档的语言,比如<wmlxml:lang =" zh" >表示文档语言为中文。 4)<head>标签。该标签用于包含和定义deck的相关信息。<head>标签之间可以包含一个<access>标签和多个<meta>标签。 5)<access/>标签。它的一般形式是<accessdomain =" 域" 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>同时可以包含多个可选的属性,如<cardid =" name" title =" label" newcontext =" false" ordered =" true" onenterforwand =" url" pmemterbackward =" url" ontimer =" url" >。至于这些属性的具体含义及功能,我们将在后面介绍。 2.3wml语言的基本知识 上一节我们介绍了wml程序的基本结构,接下来我们介绍wml语言的基本知识,主要包括wml的字符集、变量、数据类型及wml程序的基本组成部分等。2.3.1wml的字符集及编码 wml使用xml的字符集,即通用字符集iso/iec-1062.,也即统一字符编码标准unicode2.0。同时,wml还支持其他系列的字符集子集,例如utf-8、iso-8859-1或ucs-2等。其中: utf-8是指通用字符集ucs(universalcharacterset)的转换格式8(transformationformat8),主要传输国际字符集的转换编码。utf-8采用了ucs字符的8位编码,提供了十分安全的编码格式,可以有效避免数据传输过程中的窃听、截取及非法解密。同时,utf-8与7位acsii码完全兼容,不会影响此类编码实现的程序;它的编码规则十分严格,能够有效避免同步传输错误,而且还会支持其它字符集提供了足够的空间。 iso-8859-1字符集是国际标准化组织iso(internationalstandardizationorganization)制定的acsii字符集的扩展集,能够表示所有西欧语言的字符。与isolatin-1一样,iso-8859-1与windows环境中普遍使用的美国国家标准协会ansi(americannationalstandardsinstitute)的字符集极为类似,绝大多数情况下无需区分。在不特别指明的情况下,http协议均使用isolatin-1字符集。因此,为了wml页面中表示非acsii(non-acsii)字符,开发人员需要使用相应的isolatin-1编码的字符。 ucs-2是iso1062.标准中自定义的通用多8位编码字符集(universalmultiple-octercodedcharacterset)的2字节(即16位)编码标准,其字符编码值与unicode字符的标准编码值相等。 wml文档可以采用html2.0规范所定义的任何字符编码标准经编码处理。一般说来,wml文档的字符编码是需要转换为另外的编码格式,以与wap用户的手机浏览器所用字符标准相适应,否则,手机浏览器就无法显示wml页面中的字符。然而,编码转换时可能会丢失一些字符信息,所以,如果在用户端进行wml文档的编码转换,那么就可能导致某些结果信息丢失而不能被用户所浏览。因此,如有必要,我们应当尽量在wml页面传送到用户浏览器之前完成编码转换。 为了解决这一问题,一方面,我们需要为web服务器补充定义wml的数据类型,以让服务器可以准确传输这些数据,另一方面,我们需要制订编码转换的原则。 2.3.2wml字符使用基本规则 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指定汉字字符集即可。例如:<?xmlversion =" 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)当变量不等同于空字符串时,变量将处于设置状态,也就是非空(notnull)状态。 4)在“$identifier”形式下,wml通常以变量名后面的一个空格表示该变量名的结束。如果在某些情况下空格无法表示一个变量名的结束,或者变量名中包含有空格,则必须使用括号将变量名括起来,即采用“$(identifier)”的形式。 wml程序中的变量是可以替代的,我们可以把变量的数值赋给card中的某一文本。有关变量替代说明如下: 1)在wml程序中,只有文本部分才可以实现替代。 2)替代一般在运行期发生,而且替代不会影响变量现在的值。 3)任何标签是按照字符串替代的方式实现的。 4)替代是按照字符串替代的方式实现的。 由于变量在语法中有最好的优先级,包含变量声明字符的字符串将被当作变量对待,所以如果要使程序显示“$”符号,则需要连续使用两个“$”进行说明。例如:<p>youracconuthas$$15.00init</p>一句显示的结果为:youraccounthas$15.00init。 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.5wml数据值性质 除了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.8wml与url、程序段锚点 我们知道,环球网www是各种信息和设备的网络,为保证全球范围内的交互,人们制定了3种规范:其一,统一资源定位器url提供所有网络资源的标准命名方式和定位方式;其二,标准协议,如http协议等,提供www资源的传输方式;其三。标准内容类型,如html、wml,提供www资源的内容形式及标准。wml沿用了这些规范,并扩大了url使用的范围。在wml中,不仅超连接、文件路径及文件名可以作为url处理,卡片名、宏变量名及各种内部资源名等也可作为url处理。 为此,wml改进了html命名资源位置的方式,采用程序锚点(fragmentanchor)的形式来处理wml程序中某段程序的地位。程序段锚点根据文档wml规则进行定义,并按照程序段表示符前加井字好(#)的方式书写。使用程序段锚点,wml程序可以在同一卡片组中定位不同的卡片。如果在程序中不指定程序段,那么程序中引用的url名称则指整个卡片组,而且卡片组的名称同时也是本卡片组内的第一个卡片的名称。2.3.9浏览器操作历史 为了在浏览器端管理wml程序的执行,wml使用“浏览器前后关系”的功能保存wml程序执行的状态及各种参数、变量等,这样可以用来记录用户的操作情况。同时,wml还提供了一个简单的导航历史模型,以url地址的形式记录了用户浏览时的各种操作,并把这些url地址放入历史推栈。通过推栈,用户即可实现历史浏览的回潮及其它操作。 WML语言基础(WAP建站)二 我们首先以microsoft的internetinfomationserver(iis4或iis5)以及unix平台中最为普遍的apache两种webserver来介绍如何以它们来建制自己的wapsever,将原先已经建制的web信息平台扩展到无限平台之上。 1.1wapseverconfiguration 其实wapsever建制非常容易,wap在信息传输的部分是使用http来进行的,与现有的www信息平台一样,因此,将现有的websever都可以通过对配置的调整成为wapsever,提供对无线装置的服务。 <img src =" /images/resource/2006/12/21/371p0.jpg" alt =" 图片" /> 图1.1在wap服务当中,所提供的新文件类型目前共有五种,以扩展名来分的话分别是wml,wmlc,wmls,wmlsc,wbmp,分别代表的是wml原始文件、wml文件的二进制码、wmlscript的原始程序码、wmlscript二进制码,以及单色的wirelessbmp文件。这些的扩展名必须新增到webserver的mimetype设定中,webserver才能够提供wap的服务。 不论使用何种websever软件,例如microsoftiis、netscapeenterprisesever、apache、或是任何一种,只要加入以上五个mimetype设定,就可以提供wap服务了。 接下来,我们就一步步带领大家以iis及apache两种不同的server进行设定,将您的webserver进化成wapserver,以提供wap服务。 1.2把microsoftiis变成wapserver 在这一节里面,我们以iis为例,进行mimetype的设定。在windows系统的发展过程中,到了windows98、windowsnt4.0的optionpack公开之后,对于www信息平台的提供就变得更容易了。 本节中所使用的范例程序是iis5.0。但是windowsnt4.0workstation版本以及windows98所使用的personalwebserver(pws)则在设定步骤上面有些差异。 首先,进入iis的管理画面。 启动了iis管理画面之后,请选取您要管理的机器名称,在选取了机器名称,iis管理画面会将该机器上面所有的www站点都显示出来。这是因为iis中可以针对windows2000或windowsnt中所设定的不同ip位置或同一个位置中不同的port建立多个www的服务。 选取了要设定的web站点之后,请在该站点的图示上面以鼠标右键点选一下,调用设定画面,如图1.1所示。在图中的设定画面选项里,可以设定包含虚拟目录、制作清单,以及目录安全设定等许多不同的功能,只是因为在这里我们所点选的是整个站点,因此所变更的设定将会被套用在整个站点中。 当然我们也可以只针对某几个特定的目录作设定,只要在特定的目录上面按鼠标右键,使用该目录的设定选项,如图1.2所示,更改设定并套用之后就可以了。 <img src =" /images/resource/2006/12/21/371p1.jpg" alt =" 图片" /> 图1.2设定选项之后,请直接选取“属性”显示变更设定内容的视窗,如图1.3 <img src =" /images/resource/2006/12/21/371p2.jpg" alt =" 图片" /> 图1.3在设定内容视窗中,一共包含了十大分项(这里的分项会因为iis版本不同而有所差异)。进入设定内容视窗之后,一开始会位于整个web站点的主要设定部分,包含在iis管理员中对于这个站点的名称、让这个web站点对应的ip地址和port号码,而我们要新增的mimetype则要在http标题的部分作设定的。 再进入了http标题设定部分之后,会出现如图1.4所示的画面,在http标题设定部分包含了四种不同的设定,分别是:启用内容限制服务,用来设定某些特殊的目录中的文件权限,以及自定义http标题,用来设定自定义httpheadermeta资料,第三个是内容分级。可以将一个目录或站点中的文件内容设定为内含某种等级的文件,例如暴力、性、不当文字与言语等,第四个部分就是我们现在要设定的部分:mime对应,将某个特定的扩展名与mimetype。 <img src =" /images/resource/2006/12/21/371p3.jpg" alt =" 图片" /> 图1.4接下来,请点击文件类型这个按键,调用mimetype设定画面,如图1.5所示。 <img src =" /images/resource/2006/12/21/371p4.jpg" alt =" 图片" /> 图1.5在图1.5中的新类型按键上面以鼠标左键点选之后,就会出现图1.6的输入画面,此时我们要将前述的五个mimetype一次一次的输入到扩展名与内容类型之中。当然了,一次只能输入一种新的扩展名与mimetype的对应。而输入完成之后在iis5.0与4.0中就可以直接使用这些新的文件类型了。 <img src =" /images/resource/2006/12/21/371p5.jpg" alt =" 图片" /> 图1.6而windowsntworkstation或是windows98中的personalwebserver(pws)的设定方法有很大的差别。 因为在pws之中并没有特别让使用者输入资料的设定界面,所有的pws的mimetype都是使用windows操作系统内部的mimetype对应资料的,因此我们必须在windows资源管理器中的文件类型这部分来做新增的动作。 首先我们需要点击资源管理器上面的工具选项,选择其中的文件夹选项这个项目,调用设定系统配置的视窗界面,如图1.6所示。 一开始画面将会显示在第一页的设定部分,也就是图1.6中的“查看”那一页,我们新增的mimetype的部分是位于文件类型的设定页中,因此我们必须以鼠标左键点击文件类型的tag以切换到该设定页。此时以鼠标左键点击图1.6中的新建类型按钮,则会出现图1.7所示画面。 <img src =" /images/resource/2006/12/21/371p6.jpg" alt =" 图片" /> 新增类型包含了:文件描述、关联扩展名、内容、类型,也就是mimetype,褂姓飧隼嘈偷脑ど璧睦┱姑t丛赪indowsnt系统中还需要将对新增的文件类型加入所谓开启、编辑等对应动作的处理程序与参数设定,但是现在新增的mimetype只是为了在personalwebserver(pws)上面提供新的mimetype,因此便不用在此指定其他相对应的动作所要启动的程序。但读者如果想在windows资源管理器当中以鼠标双击该文件进入编辑器来处理这个文件的话,请暗下动作选项(a)下面的新增按钮,则可以选择以系统中的那个程序来处理该种文件。 不过要注意到的是,目前的环境中还没有比较好的wml编辑器,所能用的应该也就是几个电信大厂所提供的工具了,所以读者也可以使用目前在网络上极为流行的几种文字编辑器来处理wml文件,像笔者就是以ultraedit6.0作为对wml文件的处理程序。 在windowsntworkstation或windows98当中设定好了这些新的mimetype之后,必须重新启动计算机,让系统更新对于文件类型的对应,然后personalwebserver(pws)才能够提供wap服务。 1.3将apache升级为wapserver apache可以说是目前所有跨平台的webserver软件中支持最多平台的一个,它的前身是ncsa的httpd,一开始这个软件在改版的时候就已经考虑到大多数的操作系统平台了,包含了nt,linux、以及各种不同的unix操作系统,在这里我们将以linux配合apache作为设定的例子。 1.3.1apache系统介绍 apache系统比较像ncsa的httpd(因为是同一群工程师将原来的程序改良而成的),只是后来的apache比前期的ncsahttpd增加了许多功能,像apache提供了同步执行多个处理程序的功能,使得ncsahttpd原本效能不良的问题获得了长足的改善。现在,只要你使用的是unix或者linux系列的操作系统,同时也使用apache作为你的webserver的话,你可以再列出全部处理程序的时候看到其中有许多个httpd处理程序同时在执行。 apache使用了同时维持一定的未忙闲状态的处理程序来改善效能问题。因为旧有的ncsahttpd言用所有的unix上面的成学习法方法,将所有的功能大都以一个处理程序(process)作为提供者。而在1995-2000这几年中,web的使用者的数量极为快速的增加,因而就系统以单一处理程序提供服务的方式越来越不受欢迎,而在cgi与互动程序的效能与支持上面也增加了许多的功能。 例如在互动程序上新增了php程序的支持、javaservlet、jsp,甚至于还支持windowsiis系统中的asp程序的功能,都是让许多人不断支持apache的原因。除此之外,apache对于cgi效能的提升也作了极大的改良,除了提供程序人员开发可植入apache系统的界面,用以提升常用程序的效能之外,还针对一般cgi的效能问题与安全问题作了改善。 在把apacheserver装到linux系统上面之后,linux系统的/etc目录下就会新增一个httpd目录,用来存放所有的apache的配置设定文件,而执行文件httpd则会被存放在/usb/sbin目录中,同时还会将一个名为mime.types的文件放到/etc目录下面。 且不论apache里头的其他设定(这部分的设定文件都在/etc/httpd/conf底下,包含了目录的权限、虚拟目录的对应、以及sever本身的其他相关的设定)mimetype的设定值需要修改/etc/mime.types这个文件即可。 /etc/mime.types这个文件中储存的是以行作分隔的mimetypes设定,每一行为一个独立的mimetype,如果要对应到特定的扩展区的话,就直接在mimetype之后留一个空白字符,在打上扩展名。以wmlc为例,必须在文件中加入以下这一行设定: application/vnd.wap.wmlcwmlc 完成之后,重新启动apache,apache就可以提供wmlc这个文件类型让使用者端存取了,当然,在第一节中所介绍的五个mimetype也都得加到设定文件中才能提供完整的wap服务。 1.4建立wap的测试环境 在wap编程与开发中,为了对所编写的网页及应用进行测试,我们通常要建立wap的测试环境。一般来说,wap测试环境可以从浏览器环境、模拟环境、实际环境三个方面进行建立,本节就对此进行基本的介绍。 1.4.1浏览器环境 浏览环境的建立十分简单。目前internet尚有许多站点提供有wml浏览器的免费下载服务。比较著名的wml浏览器是winwap(http://www.wapschool.com/chinese/download/winwap22.exe)以及各移动通信设备公司提供的浏览器。安装这些浏览器后,用户就可以在windows系统环境下访问wap站点,查看wap页面。 在wap的服务器端,开发人员则可以利用windowsnt4.0或windows2000以及internet信息服务器iis(internetinformationserver4.0/5.0)软件进行模拟。在原有的www服务子目录下再建立一个wap子目录,将所有的wml网页放在其中,并对iis进行必要的配置。然后,在www服务器正常运转的情况下,开发人员通过在winwap等wap浏览器中输入http://locallhost(本地计算机名)/wap/index.xml的形式,即可进入wap网页进行浏览测试。 这种测试环境的优点是实施起来比较简单,建设比较快,操作起来也比较简单易学。其不足之处在于,这种测试用的浏览器毕竟是windows环境下的浏览器,支持大部分的wml标记,查看窗口的界面可以扩大和缩小,比较自由,因而所看到的测试效果与实际手机上的效果可能会有比较大的差别,而且它也不能提供编辑、编译和调试的集成环境。 1.4.2模拟环境 用于wap测试的模拟环境是通过使用移动通信设备公司所提供的wap手机模拟器来实现wml浏览的。目前可以从各公司站点上下载的模拟器有nokiatoolkit、ericssonr1.0emulator、ericssonwapide、upphoneup>simulator、motorolamobileadk等。 相比较来说,nokia和motorola提供了比较完整地结成开发环境,其它两家主要提供了模拟wap手机的wml浏览。由于模拟器一般都是供直接的html服务器直接连接,所以wap服务器端只需要windowsnt/2000及iis4.0/5.0软件即可进行模拟和调试。与上面介绍的方法一样,在www服务器工作正常的情况下,通过输入http://locallhost(本地计算机名)/wap/index.xml的形式,即可对wap网页进行浏览测试。 虽然说这种模拟环境提供了集成环境及与wap手机基本一致的模拟器,但仍难保证所用模拟器与其实际产品完全一致,尤其是没有wap网关的参与,因此这是一种并不完备的检测。特别的,这种模拟环境下与无线电话应用wta(wirelesstelephonyapplication)相关的服务根本没有办法进行检测。不过,对于单纯的开发测试来说,这样模拟环境基本能满足要求。 1.4.3.实际环境 wap测试的实际环境中需要wap手机、网卡及服务器三个部分,因此,为了建立wap测试的实际环境,开发者需要购买一些主流的wap手机,同时使用前面介绍的方法在原来的html服务器上建立一个wap专用的虚拟目录,已建立wap服务器,然后使用现有网关或夹在移动通信公司提供的相应网关,那么只要三者都能顺利正确的工作,开发者就可以通过wap手机对wap网页及应用进行测试了。 1.5完成wap设定之后 在完成wap设定之后,我们就可以开始提供给所有的使用者wap服务了,当然,在这之前,还必须将content(内容)准备好,也就是说,我们还得先将wml文件与相关的应用程序准备一下。 WML语言基础(WAP建站)三 元素和标签是wml的主要语法,它们决定了wml编程的基本原则。本章我们将从wml的元素、标签、属性等方面详细讲解wml的编程方法。学习本章知识之前,读者应当了解wml元素与标签的区别。wml的元素通常有一个首标签、内容、其它元素及一个尾标签组成。也就说,单独的标签是一个元素,成对出现的标签与其包含的内容也构成一个元素。由于元素牵涉及标签,标签又涉及属性。3.1卡片、卡片组及其属性 我们前面介绍了wml的卡片与卡片组,主要从概念和相互关系的角度进行了分析。我们这里则从卡片、卡片组的组成、相关元素、标签技术性等编程角度进行分析和讲解。3.1.1共有属性 wml元素的共有属性主要有3个:id、class和xml:lang属性。 wml的所有元素都有两个核心属性,即标示(id)和类(class)属性。它们主要用于服务器方的信息传输。其中,id属性用于定义元素在卡片组中的唯一标示,即它的名称;class属性用于给当前元素定义一个或更多的类(class)。与卡片组一样,类(class)也是有名字的,而且多个元素可以使用一个类(class)名。具有相同类名的单一卡片组中的所有元素均可被看作相同类的一个部分。类名是区分大小写的。如果在class属性列表中,一个元素多个唯一的类名,那么该元素可以看作这些类中的一部分。具有同一属性的多个类名必须用两个以上的空格间隔,wml程序执行时将忽视其中多余的类名及其属性。 另外,在wml程序,所有包含文本的元素均具有“xml:lang”属性。该属性用于指定当前元素及其属性所用的描述语言,如英国英语、美国英语、法语、德语等,并可以为用户浏览器选择显示文本的语言提供依据。 3.1.2wml程序的文件头 合法的wml卡片组均属合法的wml文件,因此它必须包含wml的声明及文件类型的声明。典型的wml程序的文件头包括我们前面多次提到的以下两行程序: <?xmlversion =" 1.0" ?><!doctypewmlpublic" -//wapforun//dtdwml1.1//en" " http://www.wapforum.org/dtd/wml_1.1.xml" > 编写wml程序时,我们必须写入这两行程序,并放在程序的开始处。其中" -//wapforun//dtdwml1.1//en" 是标准通用标记语言sgml的公共标示;" http://www.wapforum.org/dtd/wml_1.1.xml" 是wml程序文档类型的标示。文档类型标示也可以是" text/vnd.wap.wml" 或“application/vnd.wap.wmlc”,其中前者制定wml的原文类型,后者贫╓ml程序编译后代码类型。 3.1.3wml元素 wml的wml元素用于定义一个卡片组,并通过<wml>与</wml>标签包含和封装该卡片组中的所有卡片及信息。它的语法格式如下: <wmlxml:lang =" lang" >内容(content)</wml> 其中xml:lang =" lang" 用于指定文档所用语言(前面已有介绍),语言" lang" 的值属于nmtoken型数据。 wml元素中包含的内容(content)中除了文本、图像等信息之外,还可以包含head、template及card元素。其中head、template元素如果包含的话则只可包含一次,而card元素必须至少包含一次。有关这些元素的用法我们后面介绍。 3.1.4template元素 template元素用于为当前卡片组中的所有卡片定义一个模板,同一规定卡片的某些参数。模版中的事件处理功能则可将这些参数自动应用于同一卡片组中的所有卡片。不过,我们也可以是其中某个或某几个卡片不采用模板规定的形式,方法是在该卡片中定义一个同名的事件来替代模板块中相应的事件。template元素通过<template>和</template>标签含所需内容(content)而实现模板功能的,其语法格式如下: <templateoneterforward =" href" onenterbackwared =" href" ontimer =" href" >内容(content)</template> template元素包含的内容中,除了卡片的一般参数外,还可以包含任意多次的do元素和onevent元素。template元素属性的功能及用法说明如下: 1)oneterforward。当用户在浏览器中进入当前卡片时,该属性将指定超链(href)的url地址,浏览器将据此打开url指定的卡片或事件。 2)oneterbackward。与上一属性类似,该属性也可以指定其相应卡片或事件的url地址。如果用户浏览时执行prev任务,那么浏览器就会定位到该属性所指定超链(href)的url地址,并打开url指定的卡片或事件。 3)ontimer。当指定时间timer过期的时候,用户浏览器就根据ontimer属性指定的url打开相应的卡片。 3.1.5card元素 wml的卡片组是由一个或多个卡片(card)构成的,每个卡片都包含有一套用户和浏览器交互操作的配置及模式。用户对交互操作的需求是多样性的,所以卡片定义时也必须是多样性的。为此,wml提供了card元素,通过<card>和</card>标签定义一个卡片的各种属性、包含内容。它的语法格式如下: <cardid =" name" title =" label" newcontext =" boolean" ordered =" true" onenterforward =" href" onenterbackward =" href" ontimer =" href" >内容(content)</card> card元素中包含的内容(content)中除了文本、图像信息之外,还可以包含onevent、timer、do和p元素。其中,timer元素只可使用一次,其余3种可使用多次。而且,如果card元素包含onevent元素或timer元素的话,那么onevent元素必须放在最前面,timer元素放在onevent元素的后面,随后才可以使用do或p元素。这个优先顺序是不能乱的。 card元素属性的功能及用法介绍如下: 1)id。用于指定card的名字。改名字是程序导航定位的依据,可以用作程序段锚点,比如<gohref =" #cardname" />。其中的cardname便是由id指定的卡片名。 2)title。用于为卡片制订一个简单的标题或说明信息。 3)newcontext。用于指定wap手机浏览当用户重新进入的时候是否需要初始化卡片中所有的内容。它有true和false两种选择,当指定newcontext =" ture" 时,卡片的所有内容在用户重新进入时将进行初始化,也不清除历史纪录;否则,指定newcontext =" false" 时,将不进行初始化设置,也不清除历史纪录。默认状态下的设置值为false。另外,newcontext仅当作为go任务的一部分时才可被执行。 4)ordered。用于向用户手机的浏览器指明卡片内容的组织形式,以便让浏览器根据自身特点及卡片内容组织及时安排显示布局。它有两种布尔值得设置,即true和false。 当ordered =" true" 时,浏览器将按照线性顺序显示卡片各区域的内容。这个线性顺序通常是大多数用户所习惯采用的信息浏览顺序,比如发送e-mail信息时,我们依次需要e-mail首件人地址、主题及e-mail内容,这个逻辑顺序就数线性顺序。 当ordered =" flase" 时,浏览器将根据用户选择或指定的顺序来显示内容。这种情况主要是用于显示用户选项、无序组建或用户输入的简单数据纪录等。 5)onenterforward。onenterforward事件仅当用户使用go任务或类似于go的任务位和浏览卡片时才可发生,即如果用户执行go任务,则浏览器就会定位<go>标签中指定超链(href)的url指定的卡片。card元素中的onenterforward属性是onevent元素的一个简单格式,用于直接指定onenterforward事件的url地址。 6)onenterbackward。该属性可以指定其响应时间的url地址。如果用户浏览时执行prev任务,那么浏览器就会定位到该属性所制定超链(href)的url地址,并打开url指定的卡片。onenterbackward属性也属于onevent元素的一个简单格式。 7)ontimer。当指定时间timer过期的时候,用户浏览器就根据ontimer属性指定的url打开相应的卡片。它也属于onevent元素的一个简单格式。 3.1.7access元素 access元素是由一个单独的的标签<access>标签实现的元素。用于定义wml整个卡片组的操作权限,即访问控制参数。access元素必须在head元素内和其它的meta信息一起声明,而且每个卡片组只能有一个access元素。其语法格式如下: <head><accessdomain =" domain" path =" path" >...</head> access元素属性的功能及用法如下: 1)domain。用于指定对卡片组进行操作的url域,默认域是当前卡片组所在的域。domain的目的是限制访问,用户浏览时浏览器将根据domain值所规定的值来得出与值匹配的地址,并访问该地址对应的卡片或事件。2)path。用于指定卡片组操作的其它卡片组所在的根目录。默认目录是“/”,即当前卡片组所在的根目录。默认目录的规定使得所有在domain域下的卡片组都可以操作当前卡片组。path的值是访问时需要匹配的路径,它的工作原理与domain十分相似,需要与路径的每个子路径相匹配,否则均属无效。 3.1.8meta元素 meta元素用于定义wml卡片组相关的通用meta信息。该元素是由一个单独的标签即<meta/>标签实现的元素,其语法格式如下: <metaname =" name" http-equiv =" name" content =" value" forua =" true false" scheme =" format" /> 其中,name属性和http-equiv属性只能选择使用一个;content属性是必选的,其值根据属性而定;scheme属性目前尚不支持;forua属性为可选属性。各属性功能及用法说明如下: 1)content。该属性用于指定meta信息的性质的值,是不必选的。 2)name。用于指定meta信息性质的名称。用户浏览器通常忽略已经命名meta数据,网络服务企业拒绝发送包含该属性所指定meta数据名称的内容。 3)http-equiv。该属性用于替代name属性,可将meta数据转为wsp或http协议的响应头。 4)forua。该属性用于指定那些开发者希望传送值用户浏览器的性质。它有ture和fales两个取值,如果取false,则卡片组在发送往客户端以前必须用中间代理去除meta元素信息,这是因为传输的协议可能改变;若取值为true,则meta数据必须如实送往用户的浏览器。默认的状态下,该属性的值为false。 5)scheme。该属性用于指定解释meta信息性质值的形式或结构。具体的形式或结构因meta数据的类型不同而不同。 3.2任务及其元素 wml允许我们在程序中指定一些任务,当某些特定的事件激活时,即可执行这些任务,从而完成需要的操作。例如,我们可以设定任务,当用户按下相应的功能键时,浏览器就可以打开指定的卡片组或卡片。目前,wml提供了4个任务元素,即go、prev、noop和refresh,它们主要与do元素和onevent元素中指定的事件相响应。本节我们就对任务的这些元素做一详细介绍。 3.2.1go任务 go任务是通过go元素来声明的,而go元素是通过<go>和<go/>标签进行定义的。go元素主要用来定义浏览器需要导航的url地址。如果该地址是一个wml卡片或卡片组的名字,则浏览器就会打开并显示相应的卡片、卡片组;否则,浏览器就会执行该url指定的任务或事件等。在历史推栈中,go任务执行的是一个“推进(push)”操作,也就是说,它执行时浏览器浏览的url地址将送入历史纪录列表中,以被它用。 go元素中可以包含任意次的setvar元素或postfield元素。postfield元素前面已有介绍,这里不再重述,setvar元素我们后面介绍。 go任务的语法格式如下: <gohref =" href" sendreferer =" falsetrue" method =" getpost" accept-charset =" charset" >内容(context)<go/> 其中属性的功能及用法介绍如下: 1)href。该属性用于指定目标url地址,比如让浏览器显示的卡片的地址即名称等。属性是必选的,其它属性为可选。 2)sendreferer。该属性用于指定是否传递调用href所指定的url的卡片的url,也是当前页的url,即http头中http_referer。有两种选择:true或false。其中,默认值为false。 3)method。与html中的表单form的method属性一样,该属性用于指定表单是以get的方式还是post的方式递交,以便通用网关接口cgi处理。默认值为get,但如果没有指定method属性,而<go>和<go/>之间存在postfield元素,则wap手机浏览器会自动以post方式传递。 4)accept-charset。当web服务器处理来自浏览器的输入信息时,该属性可指定服务器进行数据编码时必须采用的字符集列表。也就是说,该属性指定的字符集替代http头里指定的字符集,以便作为服务器选用字符集的标准。 3.2.2prev任务 prev任务是由prev元素实现的。该元素通常是一个单独的标签<prve/>,不过有时也可由<prev>和</prev>一对标签进行定义。它用于指定将浏览器导航至历史推栈中的前一个url地址。在浏览器操作的历史推栈中,prev任务执行的是“取出”操作,将前一个url地址取出,并把当前url地址推进历史推栈。如果历史推栈中没有前一个url地址,即prev/元素不执行任何任务。 prev任务的语法格式为: <prev/>或<prev>内容(content)</prev> 在后一语法格式中,prev元素包含的内容里面一般是setvar元素,该元素的含义前面已有介绍,这里不再重述,具体的用法随后介绍。 3.2.3refresh任务 refresh任务由refresh元素声明,它用于刷新当前的卡片,对卡片内指定的变量进行更新。其语法格式为: <refresh>内容(context)</refresh> 其中包含的内容(content)中一般有setvar元素,其语法格式为<setvarname =" name" value =" value" />,它可指定更新的变量名name,即更新的变量值value。另外,refresh元素也可以不包含setvar元素。而通过时间限制(timer元素)对卡片进行刷新。 3.2.4noop任务 noop任务由noop元素进行声明,表示什么也不做,是一个空操作,在替代卡片组级的do元素是十分有用。该元素是一个单独的标签,即<noop/>标签。其语法格式如下: <nnop/> noop元素没有属性,下面的简单程序中就包含了noop元素实现得空任务操作: <cardid =" card1" ><dotype =" options" name =" dome" > <noop/></do>...</card> 3.3时间及其元素 wml提供了几个元素,专门用于处理用户浏览器的导航和事件。利用这些元素用户可以给某任务制定关联事件。那么当事件触发时,浏览器就会执行相应的任务,比如url导航就是通过事件实现的。而且,事件可以和一个需要完成的任务捆绑在一起。事件捆绑时一般是通过几种元素及其标签声明来实现的,如go、do和onevent等元素。下面我们就讲解wml的事件元素及事件。 3.3.1do元素 do元素提供了一个通用的事件处理机制,使得用户可以参与当前卡片的事件处理。通过<do>和</do>标签将用户交互和某一个任务联系在一起。用户交互可以是用户按下的功能键、选择的菜单项,也可以是用户的声音提示。当用户激活这些交互功能时,用户浏览器就会执行与do元素相关的任务。其语法格式如下: <dotype =" type" label =" label" name =" name" optional =" boolean" >任务(task)</do> 其中tast是与do元素关联的动作,也是条件激活时浏览器即将执行的内容。在do元素中,用户必须绑定且只能绑定go、prev、noop和refresh四种元素所实现任务中的一个任务(task)。go元素用于定位制定的url地址,prev元素用于定位并打开前一操作或任务,doop为空操作,refresh用于刷新当前卡片组或任务,有关他们的详细用法我们后面会陆续介绍。 do元素可以用于卡片一级,也可用于卡片组一级。当用于卡片一级时,do元素必须包含在card元素中;而用于卡片组一级时,do元素必须包含在template元素中,由此定义的do元素将同时应用于当前卡片组的所有卡片。此时如果某个卡片不想应用模板中的do元素及其任务,则需采用我们前面介绍的方法,使用同名事件处理来替代模板中的do元素的事件处理。而且,不论事件关联的任务是否相同,当do元素定义的事件名称相同时,卡片的do元素将忽视卡片组一级do元素的影响,及卡片一组的do元素将被优先执行。 另外,含有空操作任务的do元素,不论它是否被激活,它都不会传送或显示到用户的浏览器中,这在一定程度上可以加快浏览器的工作效率,因为服务器端体它抛弃了一些空任务的判断。do元素各个属性的功能及用法讲解如下: 1)type。用于指定do元素的类型(type),也即需要关联、绑定的用户交互事件,是必选属性。用户浏览器接到这些事件后,就会激活它们并执行相应的操作与处理。如果在一个卡片中定义了多个do元素并拥有同样type,那么用户必须为每个do指定不同的事件名才行,否则就会发生判断混乱的错误。 do元素典型的类型(type)及执行条件介绍如下: 1、accept。当用户选择或按下相应功能键时(accept)、选项、命名或按钮时,浏览器接收或激活当前所作选择。2、prev。激活prev键时,浏览器将导航到历史记录中的前一个卡片。 3、help。激活help功能键或相应按钮、命名时,浏览器显示与当前内容相关的帮助信息。 4、reset。激活reset功能键或相应按钮、命名时,清除或重置当前卡片组或浏览器的状态。 5、options。激活options功能键或相应按钮、命名时,浏览器显示与当前内容有关的选项或附加操作。 6、delete。激活delete功能键或相应按钮、命名时,删除当前项目或选择。 7、unknown。如果给出的类型不能为do元素所识别,则一律按照unknown型处理,相当于类型为空,即type =" " 。 8、vnd.*。vnd.*及其它不同大小写组合[vv][nn][dd].*。这种类型定义的都是vnd.cotype,用于激活供应商或用户浏览器自定义的某个特定功能,其中co为公司(company)名的缩写。 9、x-*与x-*。扩展类型,目前wml中还没有使用。 2)label。该属性指定的文本字符串可以表示用户的交互事件。例如,当涯骋桓鋈挝癜蠖ㄔ赼ccept键上之后,并设置了label属性,比如label =" gone" ,那么浏览器就会将label的值“gome”显示在屏幕上;如果不指定,浏览器则会显示默认的“ok”字符串。为了保证能在较小的手机上显示出来,label的属性值最多不超过6个字符。不过这可能因wap手机品牌、型号不同而稍有不同,有的手机最多不能超过5个字符。而且,如果手机浏览器不支持动态标签显示,那么它就会忽视label属性。 3)该属性用于指定do元索所绑定事件的名称。如果多个do元素制定了相同的name,那么他们绑定的事件统属一个。如果卡片一般与卡片组一级中do元素制定了相同的事件名,那么卡片一级的时间将被优先执行,卡片组一级的事件将被忽视。 wml规定,在同一卡片或在同一模板中,不得指定具有相同事件名(name)的两个或两个以上的do元素。 另外,如果name属性值为空,则相当于没有指定name属性,这时do元素执行的事件或操作由type的属性值决定。 4)optional。指定浏览器是否忽视do元素及其包含的任务。有两个可选值:true和false。如果值为true,则浏览器将忽视当前do元素,即不执行它所绑定的任务。反之,若值为false,则执行do元素。 3.3.2ontimer事件 ontimer用于指定一个事件。当<timer/>标签指定的时间到期后,浏览器就执行ontimer所指定的这个事件。ontimer的时间可以是一个url地址,一个卡片组,一个wml网页,一幅图像或其他符合url定位的规则的文件。<timer/>标签指定的时间为正整数,单位大小为1/10秒。 ontimer时间只能包含在card元素或template元素的标签中进行定义,其语法形式如下: <cardid =" name" title =" label" newcontext =" boolean" ordered =" true" onenterforward =" href" onenterbackward =" href" ontimer =" href" >内容(content)</card> 或: <templateonenterforward =" href" onenterbackward =" href" ontimer =" href" >内容(content)</template> ontimer事件只有一个属性,即ontimer。它用于指定一个超链(href)的url地址,指定时间timer过期的时候,用户浏览器就会按照超链(href)的url打开相应的卡片。 3.3.3onenterforward事件 onenterforward事件仅当用户使用go任务或类似于go任务的任务来定位和浏览卡片时才可发生。设置onenterforward事件后,当用户进入当前卡片组时,浏览器就会定位onenterforward属性或<go/>标签中指定超链(href)的url地址,并打开url指定的卡片。 onenterforward事件需要包含在card元素、template元素或onevent元素的标签中进行定义,其语法格式为: <cardid =" name" title =" label" newcontext =" boolean" ordered =" true" onenterforward =" href" onenterbackward =" href" ontimer =" href" >内容(content)</card> 或: <templateonenterforward =" href" onterbackward =" href" ontimer =" href" >内容(content)</template> 或: <oneventtype =" onenterforward" ><gohref =" href" />其他任务(task)</onevent> 前两种格式中,onenterforward事件作为card元素或template元素标签中的一个属性进行定义的,该属性即为onenterforward,它制定了一个超链(href)的url地址,当用户进入当前卡片时,浏览器就据此打开url指定的卡片。这种格式制定的任务相当与go任务。 3.3.4onenterbackward事件 当用户使用prev任务或类似的任务来导航至某一卡片时,onenterbackward事件才可发生。换句话说,当用户从历史堆栈中选取url地址,并通过浏览器打开这一地址对应的卡片时,onenterbackward事件才可能发生。 与onenterforward事件类似,onenterbackward事件也需要包含在card元素、template元素或onevent元素的标签中进行定义。其具体语法格式如下: <cardid =" name" title =" label" newcontext =" boolean" ordered =" true" onenterforward =" href" onenterbackward =" href" ontimer =" href" >内容(content)</card> 或: <templateonenterforward =" href" onterbackward =" href" ontimer =" href" >内容(content)</template> 或: <oneventtype =" onterbackward" ><gohref =" href" />其他任务(task)</onevent> 前两种格式中,onterbackward事件是作为card元素或template元素标签中的一个属性进行定义的,该属性即为onterbackward,它指定了一个超链(href)的url地址,当用户使用prev等任务项回到地址时,浏览器就会打开url指定的卡片。 后一种格式中,onterbackward事件作为onevent元素的一给类型值,并结合<go/>标签指定事件激活时浏览器需要打开的卡片的url地址。 3.3.5onpick事件 onpick事件在定义时一般通过onpick属性指定一些项目,当用户选择或取消这些项目时,即可触发onpick事件,执行onpick属性所指定的项目,如打开卡片、卡片组或其他事件等。onpick事件通常在option元素的标签中进行定义,其语法格式如下: <optionvalue =" value" onpick =" href" >内容(content)</opiton> 可以看出onpick时间作为option元素的一个属性来定义具体的动作。这个属性即onpick,它指定了事件触发时浏览器需要定位的超链的url地址。 3.3.6onevent元素 onevent元素通过<onevent>和</onevent>标签可以把包含的任务与特定的时间捆绑在一起。当用户激活这一特定事件时,onevent元素所绑定的任务就会被立即执行。onevent元素的语法格式如下: <oneventtype =" type" >任务(task)</onevent> 其中task是与onevent元素关联的动作,也是条件激活时浏览器即将执行的内容。与do元素一样,onevent元素中用户也必须绑定且只能绑定go、prev、noop和refresh四种元素所实现任务中的一个任务,go元素用于定位指定url地址、prev元素用于定位并打开前一操作或任务,noop为空操作,refresh用于刷新当前卡片组或任务。 onevent元素只有一个属性,即type属性,它是必选属性,主要用于定义特定事件的名称。该属性值的数据类型为cdata型。 3.3.7postfield元素 postfield元素用于指定当浏览器接到url请求时,向原服务器(originserver)传送的域名其域值。传输时,传输域及传输值的实际编码方式主要依赖于浏览器与原服务器的通信方式。postfield元素是通过单独?lt;postfield/>标签进行定义的,其语法格式如下: <postfieldname =" name" value =" value" > 它共有两个属性:name与value,它们的取值均属于vdata型数据。其中,name属性用于指定传输域的名称,value属性用于定义传输的值。这两个属性均为必选属性。 3.4变量设置元素与变量设置的有关规定 几乎所有的wml内容都可通过设置参数来实现,这为我们灵活的开发wml程序提供了方便。本节我们先介绍一个变量设置元素,然后再介绍与变量设置有关的一些具体规定。 3.4.1setvar元素 setvar元素用于指定在当前上下文内容中的变量的值,从侧面影响正在运行的任务。其语法格式如下:<setvarname =" name" value =" value" /> 它有两个属性:name和value。前者用于指定变量的名称,后者用于指定所需赋给变量的值。这两个属性都是必选的,它们的数据类型均属于vdata型。如果name属性所规定的变量名不合法或不符合运行环境的要求,那么setvar元素在wml程序运行中将被忽视,不能发挥其应有的作用。 3.4.2变量设置 wml编程中可以使用变量,变量使用前必须进行定义。变量的命名原则及定义方法我们上一章已经讲过了,这里不再重述。在这里,我们主要介绍wml程序中设置变量的规定。 如前所述,setvar元素可用来设置变量,设置时setvar元素一般需要在go、prev或refresh元素中进行定义。另外,利用input和select元素也可以设置变量。其中前者是将用户输入的文本赋给变量,作为变量的值;而后者则将用户从option元素中选择的value属性的值赋给变量。有关input元素和select元素的语法格式及具体用法我们后面再行介绍。 设置变量时,以下几种情况还应当引起大家注意: 1)可以使用wmlscript的变量值设置wml的变量,反之亦然。也就是说,使用wml及wmlscript编写程序时,它们可以使用同名编程。 2)在wap开发工具中,通常提供有对变量进行管理和维护的选项卡或对话框,开发人员从中也可以对相应的变量进行设置及编辑。 3)在当前上下文内容中,可以使用card元素的newcontext属性来消除所有的变量值。 3.5用户输入处理元素 通过wap手机的按键,用户可以向浏览器显示的卡片中输入数据信息或操作信息。wml为此专门提供了处理用户输入的元素。 3.5.1input元素 input元素用于定义文本实体对象,包含有对输入文本内容的格式、数据类型、长度、值、变量名等多种属性的具体规定。当用户输入满足input元素的规定时,则接收输入信息,并赋给指定的变量灵活进行相应的操作、处理;否则,就通过浏览器给出具体的处理意见,并进行是单个输入处理或变量初始化操作,比如刷新卡片以让用户重新输入,或给用户指出输入错误所在并等待进一步的处理指令等。input元素是wml编程中处理用户交互活动的重要元素,它通过单独的<input/>标签进行定义,其语法格式如下: <inputname =" variable" title =" label" type =" type" value =" value" default =" default" format =" specifier" emptyok =" false true" size =" n" maxlength =" n" tabindex =" n" /> 其中除了name属性是必选的以外,其他属性都是可选的。这些属性的功能和用法介绍如下:1)name。该属性用于指定用来保存用户输入文本的变量和名称。定义name属性后wml将根据该属性也即变量名,为即将输入的文本实体对象与之存储空间,以便接收用户输入。 2)title。该属性用于input元素的标签,通常是位于输入框前的提示信息。 3)type。用于指定文本输入区的类型,有text和password两种选择。默认值为text,指定的用户可以输入文本,而且输入的文本会同时逐渐响应并显示在浏览器中。如果选择password,则指定用户输入的文本作为密码文本处理,wml程序按文本实体接收输入的数据,而浏览器上响应用户输入显示时逐渐均为星号(*),由此起到保密的目的。 4)value。该属性用于指定name属性所定义变量的值,它将显示在输入框中。 5)default。该属性用于指定name属性所定义变量的默认值。 6)format。该属性用于格式化输入的数据。 7)maxlength。该属性用于指定用户可输入字符串的最大长度。该属性的上限为256,最多不能超过256个字符。 8)emptyok。用于指定用户是否可以不在输入框内输入内容。 9)size。该属性用于指定输入框的宽度,宽度值为字符个数。 10)tabindex。用于指定多个输入框存在时,类似于html中tab键的具体位置。 3.5.2select元素 选择列表属于输入元素,允许用户从选项列表中选择需要的项目。wml不仅支持单选列表,及单选项,而且支持多选列表,也就是复选项。select元素允许用户从选列表中选择所需的项目。列表中的选项采用后面我们就要讲到的option元素进行定义,一般是一行格式化的文本。编程时,我们可以使用optgroup元素将option元素的情况项目分成不同级别或层次的选项组,为用户选择提供方便。 select元素是通过<select>和</select>标签进行定义的,语法格式如下: <selecttitle =" label" multiple =" false true" name =" variable" default =" default" iname =" index_var" ivalue =" default" tabindex =" n" >内容(content)</select> 其中所有属性都是可选的。select元素各个属性的功能和用法介绍如下: 1)multiple。该属性用于指定选择列表是否可以使用复选框。 2)name。该属性用于指定接收选项值的变量的名称,变量值由value属性预设定。 3)value。用于制定name属性所定义变量的默认值。 4)iname。用于指定包含排序号的变量的名称。 5)ivalue。用于指定选择列表中被选中选项的值,是一个具有排序号性质的值。6)title。用于指定选择列表的标题。 7)tabindex。用于指定当前选择光标在选择列表中的具体位置,该位置即为当前选择操作将要选择的选项所在的位置。 3.5.3option元素 option元素用于定义select元素中的一组单选项。它通过<option>和</option>标签进行定义,并可包括事件和单选项的显示文本等信息,其语法格式如下: <optiontitle =" label" value =" value" onpick =" href" >内容(content)</option> option元素的属性均为可选,各属性功能及用法说明如下: 1)value。该属性用于设置键值。当用户选到该选项之后,option元素就会将该值赋给selet元素的name属性所指定的变量。 2)title。用于option元素制定的一个标题,以便提示用户操作。 3)onpick。该属性用于指定用户选到该项并按accept键后所打开卡片组的l。 3.5.4optgroup元素 optgroup元素用于将多个相关的option元素进行分组,用户浏览器可以借助这种分组来安排选项列表的显示布局,以方便用户选择。optgroup元素是通过<optgroup>和</optgroup>标签进行定义的,其语法格式如下: <optgrouptitle =" label" >内容(content)</optgroup> 它所包含的内容中需要包含至少一次option元素或其他的optgroup元素。 optgroup元素只有一个属性,即title属性,用于定义optgroup元素的标题,以便提示用户操作。 3.5.5fieldset元素 fieldset元素用于设定输入框和相应的说明文本,从而用户就可以利用input元素等借助该输入框输入所需的数据信息。fieldset元素的语法格式如下: <fieldsettitle =" label" >内容(content)</fieldset> 由于fieldset元素和输入有关,所以它们的内容中可以包含与输入有关的其他元素。其语法格式可以看出,fieldset元素只有一个属性,即title属性,用于定义fieldset元素的标题,以便提示用户操作。 3.6锚、图像、定时器及其元素 本节我们讲解与定位和定时控制有关的3类元素,包括anchor、a、img、timer几种元素。使用它们可以在wml卡片中创建超链接,或在文本流中显示一幅图像,或设置定时器来控制用户操作及卡片显示等。 3.6.1anchor元素 anchor元素用于创建一个超链接的头部,超链接的其余部分为用户指定的url地址。当程序运行中用户选中该超链接时,浏览器就会被引入到超连接指定的地址,如其他卡片组或同一卡片组中的其他卡片。 anchor元素由<anchor>和</anchor>标签进行定义,它所包含的超连接必须是真实存在的,而且是能够正确连接的超连接。anchor元素定位超链接时,必须通过相关的任务元素完成定位处理,如go元素、prev元素、refresh元素等。不过,在anchor元素中只能包含1个定位任务,多于一个时会导致wml运行错误。 anchor元素的语法格式如下: <anchortitle =" label" >任务文本</anchor> 其中的任务需要包含一个进行定位的任务元素。可以看到,anchor元素只有一个属性,即title属性,用于定义fieldset元素的标题,它用于定义即title属性,用于定义fieldset元素的标题,以便提示用户操作。元素的超连接的标题。用户浏览时可利用这一标题来及时了解操作的超连接的名称或者有关提示信息。 3.6.2a元素 a元素是由anchor元素的简化形式,它内含了anchor元素需要包含的go元素功能爱完成超连接定位,并且不再包含其他任何变量设置。它使用<a>和</a>标签进行定义。 3.6.3img元素 img元素用于格式化的文本中防止和显示一幅图像。当然,前提是用户所用的浏览器必须支持图像显示。img元素由单独的<img/>标签进行定义,它不包含其它元素。其语法格式如下: <imgalt =" text" src =" url" localsrc =" icon" aligh =" alignment" height =" n" width =" n" vspace =" n" hspace =" n" /> 属性中alt和src是必须要有的,其他可选。另外,需要注意的是img元素要放在p元素里,而不能放在do或option元素里。 img元素各个属性的功能和用法介绍如下: 1)alt。该属性用来指定当手机不支持图像显示用来替代现实的文字文本。 2)src。该属性用于指定图像文件的url地址。 3)localscr。该属性用来指定显示存在手机rom的图标文件。 4)align。该属性用来指定图像显示是相对当前文本行的对齐方式。 5)height。用于设定图像显示时的高度。 6)width。与height属性类似,用于设定图像显示时的宽度或宽度百分比。 7)vspace。该属性用于指定图像显示时的上边距和下边距,默认值为0。 8)hspace。与vspace属性类似,该属性用于指定图像显示时的左边距和右边距。 3.6.4timer元素 timer元素用于设定一个定时器,可以延时显示卡片组、卡片,或实现wml程序的等待操作,或在卡片组和卡片之间实现切换以取得动画效果。 一个卡片只能使用一次timer元素,也即是说只能设置一个定时器。当用户进入还有定时器的卡片时,定时器就会开始工作,其时间值就会逐渐减小。timer元素指定的时间值单位1/10秒。其语法格式如下: <timername =" variable" value =" value" /> 它的两个属性中,value属性是必选的,name属性为可选。name属性用于指定表示时间值的变量的名称,该变量的取值由定时器的时间值决定,时间值减小,该变量的值也相应地减小,并终始保持不变。 value属性用于指定name属性所定义变量的初始值。如果name属性定义的变量在定时器初始化时还没有值,那么该变量就将采用value属性指定的值;否则,改变量就会忽视value属性的值。如果没有定义name属性,也就是说,没有指定时间变量,那么timer元素指定的定时器仍将采用value属性的值进行延时处理。 3.7文本格式化及其元素 wml程序中,为使显示的文本呈现出丰富的样式,wml提供了一些用于格式化的元素,我们通过这些元素及其相应的标签可以对文本进行标注和控制,从而实现不同的显示效果。 3.7.1增强元素 增强元素都是一些成对的标签,用于指定文本的增强显示信息。比如b元素通过<b></b>标签可以控制其中的文本按照粗体字进行显示。3.7.2br元素 “br”即break,是用于换行的元素,它是使用单独的<br/>标签进行定义的。br元素的作用相当于插入一个回车符。 3.7.3p元素 “p”即指paragraph,p元素用于划分段落,是当前文本换行并插入一个空白行。p元素可以使用单独的<p/>标签进行定义,也可以使用<p>和</p>标签成对的进行定义。其语法格式为: <paligh =" alignment" mode =" wrapmode" /> 或 <paligh =" alignment" mode =" wrapmode" />文本</p> 1)align。该属性用于设置段落在浏览器中的对齐方式,有left、center和righ三种取值。这三种参数值分别表示p元素当前定义的文本段落及浏览器窗口的左侧、中间和右侧进行对齐。默认值为left,及段落与浏览器窗口的左侧对齐排列。 2)mode。该属性用于指定下一段落的换行方式。 3.7.4td元素 td元素用于规定表格单元格的内容。其语法格式如下: <td>单元格内容</td> 3.7.5tr元素 wml中的表格是按照行、列进行组织的。一个表格由若干行组成,每行由若干列组成。tr元素用于定义表格的行。其语法格式如下: <tr>单元格内容</td></tr> 3.7.6table元素 table元素与tr元素、td元素一起,可用来创建能容纳文本和图像的表格,并可设置表格各列中文本和图像的对齐方式。其语法格式如下: <tablealign =" alignment" title =" label" columns =" n" > 或 <tablealign =" alignment" title =" label" columns =" n" >内容</table> 其中各个属性的功能和用法介绍如下: 1)align。该属性用于指定表各个列中文本和图像的对齐方式。 2)title。该属性用于指定table元素的标题。 3)columns.该属性用于指定表格的列数,该数不能为0。 WML语言基础(WAP建站)四 wmlscript语法基础 wmlscript是属于无限应用协议wap应用层的一部分,使用它可以向wml卡片组和卡片中添加客户端的处理逻辑,目前最新的版本是1.1版。wmlscript1.1是在欧洲计算机制造商协议会制定的ecmascript脚本语言的基础上,经过修改和优化而指定的。它能够更好的支持诸如移动电话类的乍带宽通信设备,在wml编程中使用wmlscript可以有效的增强客户端应用的灵活性,而且,我们也可以把wmlscript作为一个工具使用,开发出功能强大的wap网络应用和无限网页。本章我们将详细讲解wmlscript1.1编程的基础预法制时,如基本规则、变量预数据类型、操作赋予表达式等。为了叙述上的简便,以后我们将“wmlscript1.1”简称“wmlscript薄?4.1wml程序中调用wmlscript函数 经过前两章的学习,熟悉c语言的读者可能会认识到,wml的函数功能、逻辑运算功能等都是十分有限的。而wmlscript提供了丰富的函数功能,我们在wap应用开发可以使用wmlscript来增强wml编程。因此,wmlscript成为扩展wml编程能力的主要开发工具。 4.2wmlscript的主要优点及其字节码解释器 wmlscript具有一套定义好的字节码和一个解释器参考结构。无线网络传输中wmlscript的数据均以二进制格式进行传输,所以,用户可以使用乍带宽通信信道,从而能够保持客户端手机只需要最小限度的内存。ecmascript修改后得到的wmlscript能够更快、更小、更容易的编译程序为字节码形式。所有这些特点,是wmlscript具备了wml所不能具备的很多优点和功能。 4.2.1使用wmlscript的主要优点 wmlscript的设计宗旨是为wmlscript系统提供一般的脚本处理能力,使用wmlscript我们可以进一步补充基于xml的wml语言的编程功能,开发针对乍带宽的网络应用及内容,如文本、图像、选择列表等,我们可以使用简单的格式编写出更灵活和更具可读性的用户界面。wmlscript具备的wml所不能具备的优点和功能,主要包括如下几个方面:(1)检查用户输入的合法性: (2)扩展用户浏览器的功能,比如允许程序员开发手机的电话呼叫、发送短信息、存储电话号码、管理电话簿或sim卡等; (3)生成用户端的确认、提示、警告信息或操作对话框,并使之快速显示在浏览器上; (4)在用户浏览器的更改后,能够对浏览器端的软件和参数进行扩展与配置; (5)最大程度克服客户端的乍带宽通信连接限制,并提供丰富的程序功能; (6)补充wml并使之实现针对微型移动终端设备的多种服务,如支持高级用户界面、增加客户端智能型、提供用户浏览器外围功能的访问能力,以及在服务器与客户端浏览传输数据是减少带宽占用等。 4.2.2wmlscript的字节码解释器 在wmlscript的字节码解释器解释之前,wmlscript语言编写的文本格式的程序将被首先编译为二进制格式的代码。编译时,编译器通常先将wmlscript程序分成若干个编辑单位,每个单位的程序都包含一定数量的语句行和wmlscript函数,然后,wmlscript的编译器将按照这些编译单位,逐一将wmlscript程序作为输入内容,而把对应的字节码作为输出内容。当用户通过wap手机调用wmlscript程序时,编译器的编码功能即被激活、执行。 4.3wmlscript基本规则 wmlscript在许多基本规则方面沿用了wml的做法。不过,由于wmlscript是以c语言为蓝本而指定的,所以它的语法特征和c语言非常相像。如果大家对c语言比较熟悉,那么学习和掌握这部分内容应当是比较容易的。 4.3.1wmlscript与url 与wml一样,wmlscript也沿用了www和html访问资源的url、http等规范,并扩大了url使用的范围。在wmlscript中,不仅超链接、文件路径即文件名可以作为url处理,外部函数、访问控制信息等也可以作为url处理。 为此,wmlscript采用了wml的变通方法,即改进html命名资源为值的方式,采用程序段锚点(fragmentanchor)的形式来处理资源定位。程序段锚点根据文档url规则进行定义,并按照程序段标识符前加井字号(#)的方式书写。使用程序段锚点,wmlscript程序可以在wmlscript编译单位内可任意指定的函数,并可在调用该函数的同时传递所需的参数。 4.3.2词法结构 wmlscript编程中的词法结构并不复杂,我们下面就从大小写敏感、空格、换行、注释即保留字等方面讲解相关的具体规则。 (1)内容类型。wmlscript的内容类型主要针对文件形式和二进制形式两种情况,类型结构可以在服务器端进行指定,具体形式为: 文本形式:text/vnd.wap.wmlscript; 二进制形式:application/vnd.wap.wmlscriptc。 具体指定方法我们在第4章已经介绍过,这里不再重述。 (2)大小写敏感。wmlscript1.1是一种大小写敏感的脚本语言。它所设计的各种关键字、变量和函数名都必须合理的使用大小写。 (3)空格和换行。一般情况下,wmlscript程序值形式将忽略所有的空格、制表符合换行符等。但如果把这些特殊字符通过代码进行表述,或者作为字符串进行处理时,wmlscript将不再忽略它们。了如,字符串" oct28,2001" 中含有空格,该空格在执行时就不会被忽略,它与不含空格的字符串" oct28,2001" 是不同的。 (4)注释。与wml编程一样,在wmlscript脚本程序中也可以加入注释内容。注释内容不被程序执行,且注释不能嵌套。wmlscript的注释方法有两种: 其一,行注释。即使用双斜行号(//)引导以一行内容,这一行内容全部作为注释内容。如: //这是以行注释,由双斜杠号开始到结束都是注释。 其二,块选择。即以符号“/*”开始,而以符号“/*”结束的期间所有内容都是注释内容。如: /*这就是块注释,加在中间的内容就是注释内容*/ (5)数据类型与直接编码。wmlscript允许将4种类型的数据直接编码并可嵌套并可嵌如在程序之中。直接编码的4中数据类型为:整数、浮点数、字符串和布尔值。另外,“无效性”值也可直接编码”1.整数。当以十进制、十六进制或八进制方式使用整数时,可对这类整数进行直接编码。 编程序时,十进制的数字均不以0开头,只包含0~9的数值串;十六进制的数据以ox或者ox开头,只包含0~9、a~f或者a~f的字符串;八进制的数均以0开头,只包含0~7的数字串。 2.浮点数。浮点数通常定义为含有小数点的数字,可以包含小数和指数部分。浮点数的形式较多,可以使十进制的整数或浮点数,可以是分数,也可以是指数;但一个浮点数必须至少有一个数。 指数是以e或e开头,后面跟着一个整数。指数是以10为底幂。例如:e0时10的零次幂,例如:e0时10的另次幂,e-2时10的负2次幂集等于0.01。指数可以带符号,正好(+)或者减号(-),它们分别代表是正指数和负指数。 3.字符串。字符串是指定义在成对的双引号(" " )或单引号(‘’)之间的内容。 由于wmlscript只允许使用成对的双引号或但引号来定义字符串,所以程序中使用一个单引号或一个双引号时就会出现编译错误。 考虑到有些特殊字符不能在字符串中直接显现出来,所以wmlscript提供了转译序列来表示这些特殊字符。 4.布尔型。它只是ture和false两个数值,用于表示wmlscript中的“真值”或“假值”。布尔型数据可参与异、或等运算,具体规则我们后面介绍。 5.无效型。也称为“空类型”,它是wmlscript支持的一个表示无效值的量,以invalid表示。该两与c语言中的null类似。 4.保留字。wmlscript中定义有一个保留字集合,含有一些表示特殊意义的单词这些次不能另外定义,也不能最为其他标识符。wmlscript中的保留字如下: acceshttpagentifbreakisvalidcontinuemetaheader divnamediv =pathdomainreturnelsetypeofwhile equivurlexternuseforuserfunctionvar 另外,wmlscript还为将来的版本预留了一些保留字,主要有: casefinallycatchimportclassprivateconstpublicdebugger sizeofdefaultstructdosuperenumswitchexportthrow extendstry wmlscript还有一些没有使用的保留字: deletenullinthislibvoidnewwith 7.标识符。wmlscript的标识符可以指定或命名3种元素:变量、函数和标注。标识符不能以数字开头,但能一段下划线(-)开头,而且,标识符不能是wmlscript的保留字。例如,timeofday、speed、quality、home_address、_myname、__、varo等都是合法的标识符;而以数字或非短下划线的特殊符号开头的字串,以及保留字等都属于不合法的标志赋,如while、for、if、my~name、$sys、123、3piecs、take.this等。 由于wmlscript是严格区分大小写的,所以字母相同但大小写不同的标识符不是同一个标识,例如,work和work就是不同的标识符。 8.名称空间。wmlscript提供了比较自由的名称空间,同一标识符可以同时用作不同的目的。例如,作为某一函数名称的标识符,还可以同时用作变量名、函数参数、程序标注等,使用时他们的属性或值等并不相互影响。在下面的简单的例程中,mytest这一标识符即用作了函数名,又用作了变量名、函数参数名、函数参数名、常量名。显然,wmlscript的这一特定为我们编写程序提供了很大的方便。 4.3.3wmlscript程序的基本书写规则 wmlscript程序的基本书本写规则: 1.程序由若干语句或函数组成,函数有由若干语句组成; 2.每个完整的语句后面必须加上分号(;),语句关键词语操作数之间必须有空间;分号(;)是wmlscript程序的组成部分; 3.函数体之间必须使用成对的花括号({})括起来,而且函数结束时在右花括号(})的后面还要加上分号(;);函数说明部分,如函数名、函数类型、函数参数等要放在花括号({})的前面; 4.有些语句可能也需要实用花括号({})办含内容,这类语句通常也可以放在函数中,所以花括号({})是可以嵌套的。 当然,不同的语句、参数、变量等元素在声明和书写时可能还有一些更细的要求,具体我们后面介绍这些元素是再专门给出, 4.4变量与数据类型 变量即数据类型是所有编程语言的概念和组成部分,wmlscript对此也不例外。它对其变量使用方法和数据类型定义方法给出了详细的规定。变量通常与某数据之相对应,我们可以给变量赋值,并可在程序执行中改变变量的值。下面我们讲解wmlscript有关变量与数据类型的详细规定。 4.4.1变量及其声明 变量是在wmlscript脚本程序中具有值的符号名,或说标识符。使用变量可以存储和改变程序中需要的数据。与c语言不同的是,wmlscript仅支持函数内定义的变量或用于传送数的参变量。 变量使用前必须进行声明,也就是定义变量,即指定变量的名字。声明变量的关键字是var,它的后面根上作为变量名的合法的标识符,并于最后加上分号(;),即完成一个量的声明。声明变量是可以使用var一次声明多个变量名,相邻变量之间使用都号(,)间隔。 一般情况下,我们在给变量命名的时候,都希望能够使用有意义的变量名。例如,当需要使用一个变量表示一本书的价格时,虽然将变量命名为j或book都没有什么错误,但若能命名为bookprice则会是的wmlscript脚本程序具有更好的可读性,可以方便编程人员进行脚本的编写和调试工作。而且,由于wmlscript在给变量命名是不能使用保留字,所以考虑到避免由于一时的疏忽时变量名欲保留字发生冲突,我们建议使用多个单词组合在以其作为一个变量的名称,这是一个比较好的解决办法。例如,如果要定义一个变量来存储的、一本书的价格,那我们可以不妨使用bookprice或者book_price作为变量的名称,这样,一方面可以时变量显得更加清晰,另一方面也可以避免变量与保留字的冲突问题。 以上只是我们对于变量命名的建议,并不是强制性的要求,用户完全可以不按照我们的要求来做,只要遵守wmlscript对于标识符命名的要求就可以了,但养成良好的编程风格不论是对编程人员还是对脚本编写人员来说,都是十分有意义的。 4.4.2变量的作用域与生命期 一个变量的作用域是指在程序中能够引用这个变量的一段代码。由于wmlscript仅支持函数内定义的变量,所以wmlscript变量的作用与通常就是定义它们的那个函数。在该函数之外,变量不再发挥直接作用。 变量的生命起始值从变量声明开始到失效为止。变量的生命期也被称为变量的持久期、存活期。一个变量在定义它的整个函数内都是有效的,函数内的任何语句块都不会削减变量的生命期或限制变量的作用域。 如果一个变量未经生命就直接使用,或声明过后再次声明,都会破坏变量的生命期。前一种情况会导致变量没有开始声明期,即没有“生命”;而后一种情况则导致变量声明期没有结束以前就重新赋予声明期,即让它多次“降生”。这都会导致变量无效使用。下面函数中的变量使用就说明了这一问题: functionfoo(){ x =1;//错误:变量使用前没有声明,改变量还没有“声明”。 varx,y,z; y =x+3; varzd =invalid if(x){ var(y);//错误:这一变量已经声明,这里是重复声明。 }; }; 4.4.3变量的使用 wmlscript的变量只能在定义它的函数内使用。使用时需要声明变量,声明变量是可以同时对变量赋值,甚至对变量进行运算。例如,下面的简单函数就说明了变量的这种灵活的使用方法: functionourage(){ varmyage =38; varyourage =26; varourage =myage+yourage; returnourage; }; 使用变量时可通过调用变量名字的形式来实现。上面例子中的“varourage =myage+yourage;”一句,通过调用变量名,变量ourage对变量myage和变量yourage实行了求和操作。 4.4.4变量类型与数据类型 wmlscript是一种“弱类型”的语言,及其变量没有确定的类型。wmlscript变量的类型有改变量所赋数据的类型决定,并根据数据类型的改变而改变。wmlscript只支持内部定义的数据,因此我们编写程序是无需指定wmlscript变量的类型,wmlscript减根据变量而赋数据的类型自动进行匹配。由于wmlscript的数据类型共有整数、浮点数、字符串、布尔型和“无效型”五种类型,所以wmlscript变量的类型所能匹配的也就是这五种类型。 4.4.5变量值域 由于变量类型尤其所赋数据的类型决定,所以变量值与域其所赋数据的可取范围等价的。下面的我们就给出整数、浮点数、字符串和布尔型的区值范围,以参照确定应类型变量的值域。1.整数的范围。wmlscript支持的整数是32位的,也就是说整数的区值范围是从2147483648到+2147483647。我们可以在程序运行期是用lang函数来取得这些值,如: lang.maxint();//获取最大的整数 lang.maxint();//获取最小的整数 2.浮点数的范围。它是指wmlscript浮点数的精度所能表示的最小和最大数值wmlscript支持32为的单精度浮点数,其最大至时3.40282347e+38,最小的非零的数是1.17549435e-38或更小(按照正常的精度)。 我们可以使用浮点float函数库在程序运行其取得这些数值: float.maxfloa();//获得wmlscript所支持的最大浮点值 float.maxfloa();//获得wmlscript所支持的最小浮点值对于运行期出现的一些特殊的浮点数,wmlscript将按照下述规则处理: 其一,如果操作结果是一个不能被单精度浮点数所能表示的数值,那么该结果将被认为是invalid,即无效值; 其二,如果操作结果发生下溢出,那么结果将作为0.0处理: 其三,负的零和正的零是完全相等的。 3.字符串的范围。任何由于字母、数字或特殊字符组成的符号串都是wmlscript中定义的有关字符串的操作或string库中的函数控制字符串。 4.布尔型数据的范围。布尔型数据只有ture和flase两个取值,这也是布尔型变量的两种数值。我们可以使用布尔型数据取初始化或指定某一变量的数值,或将布尔值变量写入一个需要布尔值作为参数的语句。布尔值可以是数值运算的结果,也可以是逻辑运算的结果。 下面就是定义布尔型变量并赋初值的例句: vartruth =truth; varlie =!truth; 4.5操作符与表达式 在wmlscript中,表达式可以把变量、常量与操作符结合起来,经过运算能够产生一定的运算结果。表达式运算后产生的结果可以是整数型、浮点数型、字符串型或布尔型的数据。其实,对于表达式我们并不陌生,例如,1+2就是一个简单的表达式。 wmlscript的表达式主要有两种类型。一种是赋值表达式,即把数据赋给变量的一种表达式,例如,mybook =3,在这个表达式中,将3赋给变量mybook,同时,这个表达式本身也有一个运算结果,那就是3。另外一种是运算表达式,它是指产生一个运算结果而不进行赋值操作的表达式,例如1+2就是一个运算表达式,在这个表达式运算产生的结果是3,但这个表达式并没有把运算结果赋给变量。 在表达式运算的过程中,表达式中操作一个或这两个数据产生运算的符号做操作符,被操作符操作的数据称作操作数,在wmlscript中我们会使用到各种操作符,下面就对操作符及有关的表达式进行详细讲解。 4.5.1赋值操作符 赋值操作符用于赋值操作,即给变量指定所需的数值,它能把有操作数的运算结果给做操作数,最简单的赋值操作符就是“ =”,例如x =2,就是将2赋值给变量x。在如以下几行语句都是赋值操作: var =" abc" ; varb =a; b =" def" ; 赋值操作符不需要指定使用对象,也不会改变赋值操作符右边变量的数值。wmlscript的赋值操作符主要包括以下几种: 1. =。用于赋值操作,将有操作数赋给左操作。 2+ =。将有操作数与左操作数进行相见运算,然后把运算结果赋值给左操作数。例如,假设x =3,那么x+ =2运算后的结果为x =5。 + =是比较特别的操作符,因为它可以将两个字符串相连,所以+ =操作符也可以对字符串进行操作,然后将连接后的字符串赋给左操作数。例如,假设x =" happy" ,那么x+ =" newyear" 运算后结果是x =" happynewyear" 。 3.- =。将左操作数简取有操作数,然后把运算结果赋值给左操作数。例如,假设x =3那么x- =运算后的结果为x =1。 4* =。将左操作属于有操作符进行相乘运算,然后把运算结果赋值给左操作数。例如,假设x =6,那么x* =2运算后的结果为x =6。 5/ =。将右操作属于右操作符进行相乘运算,然后把运算结果赋值给左操作数。例如,假设x =6,那么x* =2运算后的结果为x =6。 6div =。拥有操作数处理左操作数,然后把运算结果中的整数部分赋值给左操作数,例如x =7,那么xdiv =2运算后的结果为x =3。 7% =。功能是求余数并赋值,用右操作数除以做操作数,最后把运算得到的余数值给操作数。例如,假设x =7,那么x% =3运算后的结果为x =1。 8<< =。功能是带符号左位移并赋值,即将左操作和右操作数进行左位移操作,在将结果赋给左操作数。 9>> =。可将左操作和右操作进行右操作进行补零右位移操作,在将结果赋给左操作数。 4.5.2数学运算操作符 数学运算操作符可以对数值类型的操作数进行运算,然后返回一个数值类型的运算结果。 1+。这是加运算操作等,它对应着数学运算中的加法运算,例如表达式1+2的运算结果为3。 加操作符还可以对字符串类型的操作数进行运算,然后将两个字符串相连起来作为运算 2-。即检操作符,对应着速学运算中的减法运算,例如表达式2-1的运算结果为1。 同时,“-”还是一个取负操作符,当它作为取负操作符的是一个操作数,取负操作符的功能使返回操作数的相反数。 3*。这是乘操作符,它对应着数学运算中的乘法运算,例如表达式2*3的运算结果为6。 4/。即除操作符,对应着数学运算中的除法运算,但wmlscript中的除法运算有些特别,在wmlscript中,除法运算后的结果是一个浮点数,而不想c语言或者java语言那样在整数进行除法运算式井运算结果强行转化整数。在wmlscript中,1/2 =0.5,而在jave中,1/2 =0。 5div。这是整除操作符,对应着数学运算中的整数运算,运算后的结果一个整数,这一点与c语言或者java语言中的情况是一样的,可以在整数进行除法运算式将运算结果强行转换整数。 6%。即取模操作符,它对应着数学运算中的取莫运算,也就是将两个操作相除,返回相除后的余数。 取模操作符主要用于判断一个数字是否能被另一个数字整除。 ((theyear%3 = =0))&&(theyear%100! =0)) (theyear%400 = =0) 其中&&代表的是逻辑运算中的与运算, 代表的是逻辑运算中的或运算,关于逻辑运算,我们后面会详细介绍。 7++。这是递增操作符,它只有一个操作数,操作可以在操作符的左边,也可以在操作符的右边,它所完成的运算操作是将操作数加1。假设操作数名称为j,值为2,那么++j加1,然后返回j的值3;而j++则实现返回j的值2,然后将j加1。 在循环中,我们常常会用到递增操作符的作用正好相反。递减操作完成的运算操作是经操作数减1。例如,假设操作数名称为j,值为2,那么--j先将j减1,然后返回的值1;而j--是先返回j的值2,然后将j减1。 4.5.3位操作符 为操作符在运算实现将操作转化32位的二进制数,然后对每个操作数分别按位进行运算,运算后在将二进制的结果按照标准wmlscript数值类型返回运算结束。 1&。这是为与操作符,它可以对两个操作数按位进行于操作,其运算规则是: 0&0 =0,0&1 =0,1&0 =0,1&1 =1 2 。这是位或操作符,它可以对两个操作数按位进行或操作,运算规则是: 0 0 =0,0 1 =1,1 0 =1,1 1 =1 3^。这是唯一或操作符,它可以对两个操作按位进行异或操作,其运算规则是:0^0 =0,0^1 =1,1^0 =1,1^1 =0 4~。这是位非操作符,它只有一个操作数,可对操作数按位进行非操作,运算规则是:~0 =1,~ =0 5<<。这是左移操作,它可以对左操作数进行向左一位的操作,由操作数给定了要移动的位数,在移动过程中,左操作数的最低为补充0。 6>>。这是右移操作符,它可以对左操作数进行向右移位的操作,由操作数给定要移动的位数,在移位的过程中,丢弃向右移的位。 7>>>。这是填0右移操作符,它与右移操作符相似。当对证正数进行操作时,它们的效果完全相同;不同之处在于,当进行负整数右移操作时,因为负责转化为二进制后,最高为1,所以在进行右移操作后,最高位仍然补充1,而在进行填0右移操作时,最高为补充的是0,因此,这是负数将转化为正数。 4.5.4逻辑操作符 逻辑操作符可以将布尔类型的表达式组合起来,完成逻辑运算操作,然后返回逻辑运算的结果--真或假,这样就可以完成比较复杂的逻辑判断工作。逻辑操作共有3种; 1&&。即逻辑与操作符它只有在两个操作数都为ture的时候,返回结果为ture,在其他情况下,返回结果为false或者invalid。 2 。这是或操作符,它在两个操作数至少有一个为ture的时候,返回结果为ture,在其他情况下,返回结果为false或者invalid。 3!。即非操作符,它只有一个操作数。当操作数为ture时,返回结果为flase;返回结果为ture. 4.5.5比较操作符 比较操作符可以把操作数进行比较,然后返回一个逻辑值,表明这个比较操作的结果是否为真。比较操作的操作数可以是数值类型或者字符串类型的数据。比较操作符也常被称为关系运算符。 wmlscript支持的比较操作符共有6种,下面被介绍一下。 1. = =。即等于操作符,它可以比较两个操作数是否相等。如果两个操作数相等,则返回ture,否则返回false 2.! =。即不等操作符。它可以比较两个操作数是否相等。如果两个操作数相等,则返回false,否则返回ture。 3.>。即大于操作等。其运算规则时,如果左操作数大于右操作数,则返回ture。 |