CMSware-熟悉WML语法

来自站长百科
跳转至: 导航、​ 搜索

导航:返回上一页

学习自然语言的最好方法就是溶入相应的语言环境在交流中学习,学习一种编程语言的最好方法就是看例程。为了帮助大家建立WML应用的第一印像,所以请大家先看第一个例子:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WApFORUM//Dtd WML 1.1//EN"
"http://www.wapforum.org/Dtd/wml_1.1.xml">
<wml>
  <head>
    <meta http-equiv="Cache-Control" content="max-age=7" forua="true"/>
    <meta http-equiv="Content-Type" content="text/vnd.wap.wml; charset=utf-8" />
  </head>
  <template>
    <do type="" label="back">
      </>
      <!--provide a button you can clink to back a step-->
    </do>
  </template>
<card id="friends" title="Hot link">
  <p>
    <a href="http://wap.lonmo.com/">Lonmo WAp</a><br/>
    <a href="#card"> Card</a>
  </p>
</card>
<card id="card">
  <p>
   this is the second card.
  </p>
</card>
</wml>

通过以上示例大家应该了解到以下内容:

1、语法:WML的语法与HTML相似,仍然是一种标记语言,而且延续了XML语法规则

2、元素:在XML和WML 语言中,语言的基本元素称之为"标签"

标签必须被 < 和 > 括起来。
大多数标签都包括"起""止"两部分,例如:

某些特殊标签可以只有一个标签,但是必须有结束标记,例如:</>

3、属性:XML语言的标签可以包含很多属性,给标签提供必要的附加信息

属性内容通常在起始标签内使用
属性只作为参数为标签提供必要的信息,不会被浏览器显示
属性的值需要被引号括起来,可以是单引号或者双引号,引号可以成对嵌套使用
例如:<card id="friends" title="Hot link">

4、注释

注释内容是方便制作者阅读源代码,不会被浏览器显示
WML不支持注释嵌套
例如:<!-- This is a comment. -->

5、文档结构

WML文档是由Card和Deck构成的,一个Deck是一个或多个Card的集合。在得到客户终端的请求之后,WML从网络上把Deck发送到客户的浏览器,访问者可以浏览Deck内包含的所有Card,而不必从网上单独下载每一个Card。

其它一些示例中没有涉及到的基本内容:

6、大小写敏感

无论是标签元素还是属性内容都是大小写敏感的,这一点继承了XML的严格特性,任何大小写错误都可能导致访问错误,这是WML制作者必须注意的问题。

7、躲避语法检查的方法-CDATA LCDATA内的数据内容都会被当作文本来处理,从而避开语法检查,直接作为文本显示。 L示例:

   < ! [ CDATA [ this ia <b> a test ] ] >
   显示结果为
   this ia <b> a test

8、定义变量

WML可以使用变量供浏览器和Script使用,通过在Deck中的一个Card上设置变量,其它Card不必重新设置就可以直接调用。
变量的语法如下:
   $identifier
   $(identifier)
   $(identifier:conversion)
如果变量内容包含空格就需要用圆括号括起来。由于变量在语法中有最高的优先级,包含变量声明字符的字符串会被当作变量对待,所以如果要显示$,就一定要连续使用两个$。
示例:
   <p> Your account has $$15.00 in it.</p>
   显示结果为:Your account has $15.00 in it
XML是一种语法非常严格的语言,WML也继承了这种规则,任何地不规范语法都会导致错误。

9、HTTp头与meta元素

不过要在WML文档里设置这些消息头,就要用到meta元素,它只能出现在WML文档<head>段里。下面是几个消息头和它们的表示形式:
Expires: Mon, 10 Jan 2000 00:00:00 GMT
Cache-Control: max-age=300
Cache-Control: no-cache

<meta http-equive="Expires" content=" Mon, 10 Jan 2000 00:00:00 GMT"/>
<meta http-equive="Cache-Control" content="max-age=300"/>
<meta http-equive="Cache-Control" content="no-cache"/>

网关在WML文档中扫描到元素时,就会把它们转换成WSp等效的HTTp消息头,然后用户终端就可以据此对缓存进行控制了。

10、缓存(Caching)

根据[RFC2616]的定义,缓存是:"程序中响应消息的本地储存区以及控制这些消息储存、重新获取和删除的子系统。缓存保存可以缓存的响应消息以便降低将来的响应时间和网络带宽消耗,同样也适用于请求消息。"
由于WAp信道带宽的限制,我们在编写WAp应用的时候都希望最大限度地减少消息的传送量。要做到这一点,就要尽量地使用缓存,经常地从缓存中获得以前的消息。幸运的是目前大多数WAp设备都有一定级别的缓存,在默认情况下,会尝试最大化的缓存。几乎所有指向URL的响应都会被缓存下来。
当WAp用户终端缓存一个响应的时候,会保存几乎所有的信息:URL、响应文本、消息头以及其它可以验证响应的内容(参看下一节"验证和历史堆栈")。每个被缓存的项目都可以根据它的URL组成部分(域名、路径、协议、参数、端口等等)唯一的识别。
有两种HTTp消息头可以让你控制WML的DECK缓存,对我们最重要的是Cache-Control消息头。它能够直接通过请求/响应链来控制所有的缓存实体。所有的缓存机制都必须遵守这些消息头的定义。Cach-Control消息头通常用来屏蔽一个设备的默认缓存行为。他们在消息链中传递时必须直接穿过所有的代理服务器和网关而不被改变。
  • Cache-Control: no-cache。设定这个选项的URL不能被缓存,包括用户终端和所有处于内容服务器和用户终端之间的其它服务器;
  • Cache-Control: max-age=<second>。定义URL保存在设备缓存中的最长时间。时间到了以后,这个实体会从缓存中清除;
  • Expired:<date> 。指定URL在缓存中存放的最后日期期限。[RFC1123]定义了日期的格式,通常是这样的:Expires: Sun, 29 October 2000 17:30:47 GMT

在写一个WAp应用的时候,你要先假设用户终端会尽量最大化缓存以便使向内容服务器获取信息的动作减少到最少。下面做些解释:

1、 永久缓存URL

WAp用户终端通常会尽量长地在它的缓存中保存存取过的URL,这个"尽量长"在phone.com浏览器中的定义是大约30天。不过,也许你会想把一个 URL的缓存时间尽量延长,比如你公司的LOGO,这样每次打开页面的时间就会减少。用下面两种方法能够很简单地实现:
  • 指定一个离现在很远的过期日,比如:Expires: Tue, 01 Jan 2002 00:00:00 GMT;
  • 指定一个很大的缓存时间,如:Cache-Control: max-age=3153600。这个例子可以让URL缓存一年。用户终端允许的最大整数是2,147,483,647,所以你可以让一个URL保存超过 68年之久。当然,到那个时候,你的手机早就那报废了。

2、 指定对URL的缓存时间

通常的情况是对一个URL你只需要缓存一段时间。比如股票报价系统,网页可能需要5分钟更新一次,那么你只要在DECK的head部分指定Cache- Control: max-age=300就行了。 如果用户在5分钟以内再次检索该页面,看到的还是缓存里的网页。如果在5分钟以后,就会到服务器上获取最新的数据。
另外一种控制缓存时间的方法是使用前面提到过的Expires,不过这种方法只能告诉用户终端:只要过了指定时间,无论什么时候访问页面都要刷新。如果你下次要控制时间,只能改变Expires里的时间值。

3、 禁止对URL的缓存

对于快速变化的内容,一般都会希望每次都得到最新的数据。所以这个时候要完全禁止对相关网页的缓存。方法有三种:
  • 设定Cache-Control: no-cache;
  • 设定最大缓存时间为0,Cache-Control: max-age=0;
  • 设定缓存到期日为一个早就过去的日期,Expires: Mon, 1 Jan 1990 00:00:00 GMT。

实际上,后两种不是最好的选择。首先这样会多占用终端的处理时间,因为当碰到这个DECK时,终端需要计算一下过期时间。其次,这样会多占用一些字节,而且在表达上也不够清楚。



参考来源[ ]