非常不错的WAP常见问题问答大全(二)

  WAP常见问题问答大全(二)

  二、关于WML的常见问答

  1. 简单说WML代表什么?

  WML代表“Wireless Markup Language”。WML就是无线标记语言(Wireless Markup Language),内置于移动设备中的微型浏览器能够解释这种标记语言。虽然它和HTML语言很相像,但WML其实是XML的一个应用子集。

  2. 什么是WML?

  WML代表Wireless Markup Language,就象HTML对普通的Web浏览器一样。有人说它是基于XML,但是更准确地说WML是XML的一个应用。虽然在语法上和HTML相似,但更多的是XML。如果准备从HTML到WML,但是没有任何的XML知识,将会发现WML“非常”严格。就像HTML,WML被读取并且通过WAP设备中的浏览器解释,然后显示在屏幕上。对于WAP设备,浏览器,或者用户代理,通常叫做微型浏览器。微型浏览器的功能是受到WAP设备的限制的。

  为什么使用WML而不是使用广泛的HTML原因是由于WAP的工作方式以及WAP是为一个“窄小”的无线世界工作的。在Netscape、Opera或者IE上显示HTML需要更强的计算能力。计算能力某种意义上是移动设备中的电能。由于移动设备中的电能是有限的,所以WML在发送给WAP设备之前,通常要经过转换和压缩。所以WAP使用的是WML。

  读者也许可能想到WML非常简单,甚至不能处理HTML中的多媒体类型。这个不是问题。标记语言(WML、HTML等等)没有操作设备的权限,例如播放声音或者显示动画。仔细地观察HTML,就会发现没有一个HTML标签能够显示动画或者播放音乐。限制是来自于运行标记语言的浏览器。毕竟在大多数情况下,是谈论移动电话。但是这个限制应该随着无线Internet的发展而逐渐取消。

  3. WML与HTML有什么区别?

  虽然WML看起来十分像HTML,但是在技术上两者的差别还是很大的。WML是为微型浏览器所设计的HTML的一个子集。WML的标准定义是基于XML的。

  4. Phone.com的 HDML和WML有什么区别?现在有电话支持 HDML吗?

  HDML(Hand-held Devices Markup Language)是Phone.com开发的。它使得Web页面可以在移动电话上显示,其标准的公布先于WAP标准。Motorola、 Neopoint、Qualcomm 等等公司的电话使用Phone.com的浏览器,它支持HDML。最新的UP.Browser支持HDML和WAP。

  5. 为什么使用WML而不是HTML?

  首先是WAP协议要求使用WML。可能已经有能够支持HTML的WAP设备,但是那不是真正的。有一些和无线设备很像的WAP设备支持HTML,但它们也不是直接使用HTML(例如:Microsoft Mobile Explorer支持HTML和WML)。MME设备只是将两个分离的部分做到了一起。当然也有HTML的变种,例如 iMode 浏览器使用Compact HTML。简单的说,如果谈论WAP设备,那么标记语言就是WML。

  有很多理由说明选择WML而不是HTML。现在最重要的一个原因就是WML与HTML相比需要很小的带宽。随着无线技术的提高,带宽会越来越宽。这个原因可能不再是主要原因,但是在达到这么高带宽之前需要许多年的时间。

  另外一个就是HTML需要相对来说比较强的处理器。处理器的能力意味着需要更强的能量。在无线设备中能量来自于电池。而一个低处理能力的处理器就意味着电池的使用时间可以更长。

  另外,HTML的确需要一个很大的显示屏幕。移动电话上的屏幕显然不能满足要求。当然也许会有一个大屏幕的移动电话,但是这样它就离移动更远(也就是说越不像移动电话)。即使iMode支持彩色和一个类似HTML的显示,它的尺寸已经是你可以方便携带的最大尺寸。

  6. 为什么对于无线设备要专门设计一种特别的语言才能访问Internet ?

  许多年来,HTML标记越来越丰富,越来越庞大。此外,浏览器对各种HTML标记的支持也大不相同。这种状况已经与当初想建立一个简单的标准相背离。

  移动设备(例如:移动电话)具有小屏幕、内存少、缺少方便的输入设备和带宽窄的特点。这种状况驱使WAP讨论组发展一种新的为无线设备所使用的语言,WML就此诞生了。

  7. 无线设备也能支持HTML格式吗?

  从技术的角度上来说答案是肯定的。既然HTML是为普通PC浏览器所编写的,也可以使用微型浏览器来浏览一个HTML页面,但是可能没有效果。因为移动电话不知道如何显示该文件。这样通常导致微型浏览器出现混乱。并且HTML页面通常都比较大,它会把移动设备“撑坏”的。

  8. 如何将HTML转换成WML?

  当考虑转换HTML时,要想到WML是为小屏幕设计的,不可能像HTML那么丰富多采。任何转换都将忽略很多HTML标记和许多内嵌的脚本。只有一些简单的HTML页面可以被满意地转换。转换可以使用工具包如:Spyglass Prism,也可以通过在线的WAP网关过滤。

  9. 用什么可以浏览到WML页面?

  首先需要一个具有WAP功能的手机,例如:Nokia 71110,Ericsson R320等等。用于PC机的桌面WML浏览器也很多,例如:WinWap、WapMan等等。

  10. 在哪里可以学到更多的关于XML的知识?

  可以访问站点:www.w3c.org/xml。在该网站上有许多关于XML的知识有详细的讲解。

  11. WML的一般语法是什么?

  WML非常像XML。和HTML相比其语法规则更加严格,从而保证当微型浏览器解析和解释的时候不会有太多的错误信息。

  和HTML一样,WML使用“<”和“>”组成的格式化标签。许多标签都是以<tag>开头,以</tag>结尾。在开头或者结尾中包含的部分叫做元素。有些标签叫做空元素,只有标签,没有内容,如:<tag/>。

  许多元素有属性来描述应其中还有那些内容。属性名字必须小写,并且属性值必须使用双引号括起来。有些属性是必须的,有些是可选的。一般的属性标签格式就像:<tag attribute1="value">。

  变量可以在WML卡片中定义,它们的一般格式是 $(variablename)。

  一个WML页面有一个专门的格式,它必须以XML的文档声明为开头:

  <?xml version="1.0"?>

  <!DOCTYPE wml PUBLIC "-//WAPFORUM/DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">

  所有的页面中的元素,都必须在<wml>和</wml>标签之间。

  12. 什么是一个“deck”?

  一个WML文档有许多卡片(cards)组成。一个卡片是一系列完整的WML代码。这些卡片被称为一个“deck”。卡片和“deck”的概念就有点像HTML中的锚标记<a name="#achor1">和一个HTML页面。也就是说卡片是“deck”中的一个组成部分。也可以把“deck”称为WML中的页面。它们之间的关系可以比做一副扑克牌。整副扑克牌就是deck,而每一张牌就是card。

  13. 什么是WML的“deck”?

  WML的“deck”或者WML文件是指decks。每个deck包含一个或者更多的card。每个deck都以<wml>开始和结束。并且每个card都以<card>开头或者结束。

  当WML微型浏览器处理WML文件或者deck的时候,它阅读整个deck,并且在deck内的各个card之间进行导航。当装入deck的时候,deck里面所有的card都已经装入到内存中,直到浏览器装入另外的deck。

  如果熟悉 HTML中的<a name>标签。WML的<card>标签将是非常类似的:

  <wml>

  <card id="start_menu">

  ...some code...

  </card>

  <card id="purchase">

  ...some more code...

  </card>

  </wml>

  deck和card可以按照这种方式调用:[deckname][#cardname]。如果deckname省略,那么浏览器就会查找当前内存里的cardname名字的card。如果使用了deckname和#cardname,那么浏览器将装入deckname的整个deck,然后跳入到#cardname。这个和HTML的工作方式很像。

  14. WML是大小写敏感的吗?

  是的!要注意WAP 1.1使用小写的标签。

  15. 如何显示一个美元符号?

  使用两个在一起的美元符号来表示,即“$$”。

  16. 想显示价格的格式该怎么办?

  “$”是一个特殊的字符,使用“$$”来显示一个“$”。

  例如:

  <p>

  The price is $$11.20

  </p>

  17. fieldset标签有什么作用?

  编写WML页面的时候要考虑到设备的屏幕很小。如果试图想把一个大的form在一个屏幕里面显示,就要指定那些标签保持在一个屏幕中。那么fieldset标签将这些标签捆绑在一个屏幕上。

  18. postfield标签有什么作用?

  postfield标签使允许提交参数到服务器端。注意有些早期的模拟器还不支持该标签,这将给开发工作带来麻烦!

  19. WML有类似HTML的<mailto>标签吗?

  没有。但是你可以使用WML表单和服务端脚本来得到同样的效果。

  20. 无法让<input/>格式正常工作是怎么回事?

  至少Nokia WML Reference没有讲清楚有关<input/>标签的用法。format参数控制着用户输入数据的类型和长度。

  注意到不是所有的WAP 1.1浏览器都接受所有的格式化代码。例如:Nokia 7110就支持得不是很好。Mitsubishi Trium在处理“*f”代码的时候有点问题,“*”必须为1或者更大。专门的格式化代码如下:

  A

  从A到Z的任何大写字母,没有数字或其他字符。

  a

  从a到z的任何小写字母,没有数字和其他字符。

  任何0到9的数字。

  X

  从A到Z从0到9的任何字符。

  x

  从a到z从0到9的任何字符。

  M

  任何字符,输入默认从大写开始。

  m

  任何字符,输入默认从小写开始。

  *f

  (星号)意味着任何数字(包括0),f是格式的代码。

  nf

  意味着恰好要输入的字符个数。n从1到9。f是格式代码。

  \

  是转义输出字符。

  格式化字符可以组合使用来表示一种特定的格式输入。但是强制一定的输入应当避免在用户出错的时候没有提示信息。如果输入是不正确的,该填写的区域一般仍保持空白,直到让用户知道应该输入什么。如果只想输入数字,使用“*N”那么将直接转跳到数字输入模式。如果只想输入大写的字符,使用“*M”转跳到大写输入模式。现举一些例子:

  “N” 只接受一个数字字符。

  “*N” 接受任何数字字符。

  “NN” 只接受2个数字字符,不多不少。

  “ANN” 接受一个大写字符(没有数字),后面跟着两个数字,不多不少。

  “X*N” 表示可以接受一个字符(没有数字)后面跟着任意多的数字字符。

  “NNN\-NNN\-NNNN”表示接受美国的电话号码格式,例如:“123-456-1234”。

  “2N\:2N\:2N” 表示接受时间格式,例如:“12:02:34”。

  “NNNNNNNNN” 表示接受9个数字字符。

  “9N” 同样表示接受9个数字字符。

  maxlength参数控制着输入字符的总个数。

  21. 如何防止一个空的field?

  在大多数情况下需要知道用户确实是输入了一些内容在field中,不能让这些内容为空。这个可以通过在服务端的检测来完成,也可以通过WML来完成。

  在WML中,这个检查可以通过合适的格式化代码来完成,或者使用一个在input标签中叫做emptyok="false" 的参数来实现(只有当必须要求用户输入的时候才使用)。如果使用了value="something" 或者value="" 用户仍然可以发送空的fields。

  以下的行将接收任何值到username field, 甚至用户将整个field清空。另外field中没有任何东西,也能够提交form。

  <input name="username" type="text" value="things" format="*M"/> 

  除了用户将整个field清空,以下的行将接收任何值到username field。如果field是空的,他将不能提交form,。

  <input name="username" type="text" value="things" format="M*m"/>

  以上的应用是针对大多数的浏览器。在Nokia 7110 ,emptyok参数可以有同样的效果:

  <input name="username" type="text" value="things" format="*M" emptyok="false"/>

  22. 使用option标签的时候,无法一屏显示完该怎么办?

  许多WAP电话的显示屏幕只能显示三到四个选项。按以下的方法分割option字段就可以输入更多的选项。

  <select title="longselectlist">

  <optgroup title="option1">

  <option>option1-1</option>

  <option>option1-2</option>

  <option>option1-3</option>

  </optgroup>

  <optgroup title="option2">

    <option>option2-1</option>

      <option>option2-2</option>

      <option>option2-3</option>

  </optgroup>

  <optgroup title="option3">

      <option>option3-1</option>

      <option>option3-2</option>

      <option>option3-3</option>

  </optgroup>

  </select>

  23. 想有一个永久的BACK在屏幕的右下方。有些好像是自动的,若没有,该怎么做?

  可以加入以下代码。

  <do type="prev" label="Back">

  </prev>

  </do>

  更好的是使用template。

  ……

  <template>

  <do type="prev" label="Back" name="back">

  </prev>

  </do>

  </template>

  ……

  24. WAP支持列表吗?

  是的,WAP1.1支持列表和相关的标记。

  25. 可以在WML中使用表单吗?

  可以。但是Nokia 7110在显示表单的时候有些问题。

  26. WML支持什么样的表单提交方式?

  WML支持GET和POST方式。但是Nokia 7110在处理GET方式的时候有些问题。

  27. WML中如何增加参数到URL字符串中?

  和HTML的工作方式很像,如下所示:

  ……

  www.someserver.com/someurl?parameter1=value1¶meter2=value2

  ……

  唯一的不同是将“&”变成“&”。

  28. 如何从WML向ASP传送数据?

  假设有一个ASP叫做“myasp.asp”,并且有一个WML变量叫做 “wmlvar”。当发出请求“myasp.asp?wmlvar=something”,可以使用下面的方法得到变量的内容。

  dim aspvar

  aspvar = Request.QueryString("wmlvar") 

  ASP变量“aspvar”将包含字符串“something”。当然ASP变量也可以与WML变量同名。

  29. 如何让WML页面自己更新?

  有过Web经验的人喜欢使用:

  <meta http-equiv="refresh" content="1;http://somewhere.com/"> 

  来强制浏览器自动更新。

  虽然在WAP中也支持一些META标签,一个更好的办法是使用<ontimer>标签。

  以下的代码显示了如何自动转跳到另外一个卡片:nextdeck.wml。

  <?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="splashscreen" ontimer="nextcard.wml">

      <timer value="40"/>

      <p>Please wait for the timer to run out...</p>

    </card>

  </wml>

  下面的代码将强制浏览器在一段时间后重新装入同一个卡片。这个页面叫做loop.wml。

  <?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="loop" ontimer="loop.wml">

      <timer value="40"/>

      <p>This text will be shown over and over again...</p>

    </card>

  </wml>

  注意必须避免浏览器可能要使用的cache机制。

  30. WML页面的最大大小是多少?

  1397 bytes/deck

  31. WML页面的限制是多少?

  由于WAP设备只有很少的内存,因此就存在着一个最大的WML deck的界限。这里没有一个绝对的标准,根据浏览器的不同而不同。表10-5列出了几种浏览器的限制。

  注意WML deck的大小是指编码压缩成二进制格式下的大小,一个没有压缩的WML deck可能很大,但是压缩后可能比较小。

  表10-5 不同浏览器的限制

  浏览器    压缩后的WML大小限制

  UP.Browser 3.2    1492 bytes

  UP.Browser 4.x    2048 bytes

  Ericsson R320    大约3000 bytes

  Ericsson R380    大约3500 bytes

  Ericsson MC218    多于8000 bytes

  Nokia 7110    1397 bytes

  32. 如何防止对WML页面的非法访问?

  WAP可以防止通过HTTP协议对文件和目录的非法操作。注意:有些WAP模拟器和虚拟的WAP浏览器可能不支持这个特点。在这个时候是不知道是否有可能使用其他类型的验证方式。

  为了使用这种方式,用户的HTTP服务器必须支持这个特点,其实大多数服务器都支持。当一个WAP浏览器请求一个URL,它将提醒用户输入用户名和密码。这些都转换成无法直接阅读的字符,但不是加密。也就是说如果网络上有人在使用合适的设备监听,那么用户名和密码将被泄露。

  这个特点在Apache文档中有详细的说明,但是文档的描述很弱,这里有如何在Apache HTTP服务器上配置的说明:

  要保证Apache已经配置过,使得一个名叫.htaccess的文件可以覆盖全局的操作配置。操作配置既可以在每个目录使用分离的文件,也可以在全局的access.conf中。但是在这个例子中,我们将集中在.htaccess文件上。并且检查AllowOverride的设置。这个必须设置到AuthConfig,那样意味着Apache在目录中寻找.htaccess文件,并且使用该文件中的规则。记住在配置后要重新启动Apache服务器。

  下一步是在目录里放置需要保护的文件叫做.htaccess。(注意点代表文件名的开头)。一个.htaccess文件的基本内容如下:

  AuthType Basic

  AuthName "WAP FAQ Authentication Demo"

  AuthUserFile /home/httpd/html/wap-faq/extras/auth/auth.passwd

  require valid-user 

  AuthType设置是指定验证的类型,AuthName指定领域,AuthUserFile指定口令文件的位置,require指定所想得到的操作。在这个例子中,任何在口令文件中的用户都有一个正确的口令。

  现在需要产生一个口令文件,Apache使用一个叫做 .htpasswd来完成这个特殊格式文件的生成。运行程序如下:

  #htpasswd /home/httpd/html/wap-faq/extras/auth/auth.passwd demo

  New password:

  Re-type password:

  Adding password for user demo

  注意:在第一次创建文件的时候,必须使用“-c”选项。

  现在加入了一个叫做“demo”的用户,并且输入了他的密码两次。考虑到安全的原因,口令文件不应该放在文件根目录下。笔者在这里只是做演示。

  现在最后就是测试,笔者建议使用HTML浏览器。输入含有想保护的URL目录的地址,一个对话框就会弹出来询问用户名和口令。如果一切顺利,就可以使用WAP浏览器来测试了。

  一个目录保护的例子在这个服务器上,用户名是demo,口令是demo。可以使用HTML或者WML浏览器来做测试。

  这个例子同样可以通过输入http://wap.colorline.no/demos.html来得到。

  或者只要点到保护的区域:

  http://wap.colorline.no/wap-faq/extras/auth/

  或者查看.htaccess文件。

  最后点击查看口令文件的内容。

  33. 怎么使用非拉丁字符?

  在文件开头加上:

  encoding="ISO-8859-1"?

  或者:

  encoding="UTF-8"?

  ISO-8859-1和UTF-8编码支持更多的字符。

  34. 一些特殊字符破坏了代码和连接该怎么办?

  锚/链接有时候包含了一些字母和数字之外的字符。典型的如:“~”(波浪号)和“&”(与号)。如果根据书编程,就应该告诉WAP浏览器使用的是什么字符集。这个在XML定义中可以完成:

  <?xml version="1.0" encoding="iso-8859-1"?> 

  “iso-8859-1”是Latin字符集。这个应该在大多数场合下能满足需要。但是,还是需要对那些转义字符进行转义。即使指定了字符集,也是没有用处的。

  字符实体是某些特殊字符的标准名字,例如:“&”就是“&”。

  大多数浏览器在反编码名字实体的时候会出现问题,例如Nokia列出了7个兼容的名字实体:“quot”、“amp”、“apos”、“lt”、“gt”、“nbsp”和“shy”。只有在使用它们的十进制代码的时候(在上述所说的Link中),浏览器可以显示几乎所有字符。如果Nokia的浏览器接收到无法支持的实体名,它就会崩溃。

  通过使用HTML或者WML浏览器(在HTML格式下,虽然不是很好),可以操作在线的实体名列表,该列表在http://wap.colorline.no/wap-faq/apps/charentref.html。

  这个表同样有一个例子在:http://wap.colorline.no/demos.html。

  第一步,选择将要使用的字符集,Latin1,Latin1 Mathematical和Greek symbols,最后是Latin1 Markup symbols。注意到列表被分割了,是由于deck的限制。真正的列表显示了实体名,实体的十进制值和真正的符号。从这里就可以看到哪个字符浏览器可以显示。

  注意上面的在线列表,不要设置为“charset=iso-8859-1”(真正的Latin1),那是个XML定义。

  35. 可能在WML页面上显示一个可选的Link吗?当用户选择后就可以直接拨号?

  现在不行。但是一旦支持WTAI的设备出现,那么就可能实现。