本书讲述的是下一代的移动通信,其中的内容是WML和WMLScript的编程。Web开发者应该立即快速学习这些不久就要在工作中使用的新语言。本书详细介绍了WAE(无线应用环境),以及它的两个主要组件:WML(无线标记语言)和WMLScript。\r\n\r\n WAE允许信息显示在诸如移动电话这样的移动设备上,并允许用户与信息进行交互作用。使用WML WMLScript,开发者可以编排几乎所有应用程序中的信息,并在移动设备中显示。\r\n\r\n 那些喜欢预言未来的人说,人们通过非桌面设备来浏览大多数Web文档的时代就要到来了。本书是希望处于无线领域最前端的应用程序开发者的首选资源。不要使用过时的插件:你需要升级你的技术和站点,因为将来是从现在开始的!\r\n
\r\n
第一章 介绍WML \r\n\r\n 一个完整的例程 \r\n\r\n 卡片 \r\n\r\n 空元素标签 \r\n\r\n 元素 \r\n\r\n 属性 \r\n\r\n 实体 \r\n\r\n 注释 \r\n\r\n 第二章 WML变量和上下文 \r\n\r\n 变量替换 \r\n\r\n 设置变量 \r\n\r\n 浏览器上下文 \r\n\r\n 第三章 WML任务和事件 \r\n\r\n 任务 \r\n\r\n 事件 \r\n\r\n 第四章 WML用户交互作用 \r\n\r\n Web交互作用的问题 \r\n\r\n WAP中的交互作用 \r\n\r\n <input>元素 \r\n\r\n <select>元素 \r\n\r\n <option>元素 \r\n\r\n <optgroup>元素 \r\n\r\n <do>元素 \r\n\r\n <anchor>元素 \r\n\r\n <a>元素 \r\n\r\n tabindex属性 \r\n\r\n 第五章 WML定时程序 \r\n\r\n 在WML中使用定时程序 \r\n\r\n <timer>元素 \r\n\r\n 第六章 WML卡片组. 模板和卡片 \r\n\r\n <wml>元素 \r\n\r\n <head>元素 \r\n\r\n <access>元素 \r\n\r\n <meta>元素 \r\n\r\n <card>元素 \r\n\r\n <template>元素 \r\n\r\n 第七章 WML文字和文字格式 \r\n\r\n <p>元素 \r\n\r\n <br>元素 \r\n\r\n 字符格式编排 \r\n\r\n 表格 \r\n\r\n 第八章 WML图像 \r\n\r\n <img>元素 \r\n\r\n WBMP图像格式 \r\n\r\n 第九章 介绍WMLScript \r\n\r\n WMLScript和WML \r\n\r\n 什么是WMLScript? \r\n\r\n 第十章 WMLScript数据类型. 变量和转换 \r\n\r\n 数据类型和字面值 \r\n\r\n 变量 \r\n\r\n 类型转换 \r\n\r\n 第十一章 WMLScript运算符和表达式 \r\n\r\n 操作数转换 \r\n\r\n 赋值运算符 \r\n\r\n 算术运算符 \r\n\r\n 按位运算符 \r\n\r\n 移位运算符 \r\n\r\n 逻辑运算符 \r\n\r\n 递增和递减运算符 \r\n\r\n 比较运算符 \r\n\r\n 类型运算符 \r\n\r\n 条件运算符 \r\n\r\n 逗号运算符 \r\n\r\n 优先顺序和结合性 \r\n\r\n 第十二章 WMLScript语句 \r\n\r\n 作为语句的表达式 \r\n\r\n 语句块 \r\n\r\n 条件 \r\n\r\n 循环 \r\n\r\n 从函数返回 \r\n\r\n 其他语句 \r\n\r\n 第十三章 WMLScript函数 \r\n\r\n 函数声明 \r\n\r\n 函数调用 \r\n\r\n 其他脚本单元的调用 \r\n\r\n 从WML调用WMLScript \r\n\r\n 标准函数库 \r\n\r\n 第十四章 WMLScript附注 \r\n\r\n access附注 \r\n\r\n meta附注 \r\n\r\n 第十五章 Lang函数库 \r\n\r\n abort \r\n\r\n abs \r\n\r\n characterSet \r\n\r\n exit \r\n\r\n float \r\n\r\n isFloat \r\n\r\n isInt \r\n\r\n max \r\n\r\n maxInt \r\n\r\n min \r\n\r\n minInt \r\n\r\n parseFloat \r\n\r\n parseInt \r\n\r\n random \r\n\r\n seed \r\n\r\n 第十六章 Float函数库 \r\n\r\n cell \r\n\r\n floor \r\n\r\n int \r\n\r\n maxFloat \r\n\r\n minFloat \r\n\r\n Pow \r\n\r\n round \r\n\r\n sqrt \r\n\r\n 第十七章 String函数库 \r\n\r\n charAt \r\n\r\n compare \r\n\r\n elementAt \r\n\r\n elements \r\n\r\n find \r\n\r\n format \r\n\r\n InsertAt \r\n\r\n isEmpty \r\n\r\n length \r\n\r\n removeAt \r\n\r\n replace \r\n\r\n replaceAt \r\n\r\n Squeeze \r\n\r\n subSrting \r\n\r\n toString \r\n\r\n trim \r\n\r\n 第十八章 URL函数库 \r\n\r\n escapeString \r\n\r\n getBase \r\n\r\n getFragment \r\n\r\n getHost \r\n\r\n getParameters \r\n\r\n getPath \r\n\r\n getPort \r\n\r\n yetQuery \r\n\r\n getReferer \r\n\r\n getScheme \r\n\r\n isValid \r\n\r\n loadString \r\n\r\n resolve \r\n\r\n unescapeString \r\n\r\n 第十九章 WMLBrowser函数库 \r\n\r\n getCurrentCard \r\n\r\n getVar \r\n\r\n go \r\n\r\n newContext \r\n\r\n prev \r\n\r\n refresh \r\n\r\n setVar \r\n\r\n 第二十章 对话框函数库 \r\n\r\n alert \r\n\r\n confirm \r\n\r\n Prompt \r\n\r\n 第二十一章 完整的实例 \r\n\r\n 计算器 \r\n\r\n 战舰 \r\n\r\n 附录一 绝对和相对URL \r\n\r\n 附录二 WAP网关和WSP \r\n\r\n 附录三 WMLScript运算符的总结 \r\n\r\n 附录四 从标准Web服务器提供WAP内容 \r\n\r\n 词汇表 \r\n
\r\n
Martin Frost是英国伦敦Digital Mobility公司中WAP技术的主管. 他自1998年以来一直从事WAP工作, 他曾经编写过一个完整的WAP浏览器, 并长期从事WAP网关的设计工作. 他从伦敦皇家学院取得了数学和计算技术的学位.
无线应用协议(WAP)是一个在无线网络上应用的业界规范, 它主要针对移动设备(特别是移动电话). 标准由WAP论坛发布, 该论坛是由Ericsson. Nokia. Motorola和Unwired Planet公司于1997年6月成立的组织, 现在已经联合了一百多家公司, 其中包括IBM. HP. Visa和Microsoft等公司. 根据WAP论坛的官方统计数字, WAP论坛的成员代表了全球90%以上的移动电话制造商.
许多类型的设备都支持WAP, 从当分随处可见的移动电话到带有大触摸屏和许多自带应用程序的新一代“能”电话. 另外还包括个人数字助理(PDA), 从掌上电脑到带有键盘的微缩化计算机. 所有这些设备最终都将有WAP功能, 它们可以直接从制造商那里获得或者借助第三方的升级程序. 每个设备都具有不同类型的显示和不同的用户输入方法. WAP规范的作用就是将这些混乱的内容进行分类, 并提供公用的框架来允许应用程序在所有这些不同类型的平台上运行.
由于WAP工作于移动环境, 因此它还必须应付无线网络的特殊问题:低带宽(通常是9600bps或者更少). 长时间等待(秒数量级的往返时间并不少见)和不可靠性(有些用户可能在火车通过隧道时或者在高建筑物劳步行时使用WAP电话). 每个使用移动电话的用户都知道可靠性问题.
这些问题使WAP应运而生. 一些用户可能会问, 他们为什么不能使用在标准TCP/IP连接上传递(这是无线链接与家庭个人计算机之间的惟一差别)的普通Web页面. 普通Web技术的问题在于它们是针对高带宽和大屏幕的. WAP延续了Internet模式, 但是优化了每个组件以更加适用于移动环境. 它跟踪连接中断时会话的状态, 提供传输数据的压缩格式, 并处理应用程序的显示, 无论有无输入和输出.
WAP堆栈
WAP堆栈(stack)这个术语是指WAP规范中的各个部分. 这是因为其各个组成部分在概念上可以认为是堆栈中的各个层. 用户与堆栈的顶端进行交互作用, 而通信硬件位于最底层的下面. 在图P-1中解释了这个概念, 其中有所涉及的各个规范的名称.
我们从下往上看, 图中的最底层含有各种不同的协议(因此称为载体协议), 它们实际上并不是WAP部分, 但是它们提供了WAP与实际通信硬件之间的链接:
IP(网际协议)和PPP(点到点协议)是在普通拨号Internet访问中的两个最低级协议. (许多第一代WAP设备是通过普通的拨号呼叫, 以及将WAP数据通过调制解调器链接发送来进行工作的. IP和PPP就是在这种情况下使用的. )
SMS(短消息服务)是大多数数字移动电话系统所提供的一个功能, 它允许发送短消息, 并通过无线链接来接收. (用户可以将它视为发送短文字消息的功能, 有点像电子邮件. )它还可以传输二进制数据, 并用于WAP.
GPRS(普通数据包无线电发送系统)是下一代移动电话系统, 它具有更高的带宽, 以及到移动电话和其他无线设备的永久网络连接. 移动电话不是拨号到服务器上, 而是具有永久的Internet连接. GPRS是以IP为基础的.
其上一层包括各种低级WAP通信协议:WAP(无线传输协议). WTLS(无线传输层安全协议)和WDP(无线数据报协议). WTP和WDP提供上层与低层通信之间的连接. WTLS提供了安全服务(加密和认证). 这些协议与普通应用程序开发人员无关:除非你在设计一个浏览器, 否则无需了解这些内容.
堆栈上部的第二层是高级通信协议, 称为WSP(无线会话协议). 它是HTTP(超文本传输协议)的一种完全替代品, HTTP协议是在Web服务器与Web浏览器之间所使用的协议. 尽管你无需知道该层的工作方式, 但是其中有一两个功能可以直接使用, 它们在附录二中进行介绍.
最高堆栈层是WAE(无线应用程序环境), 它是用户可以实际看到并与之交互作用的部分. WAE的目的是为编写应用程序提供一个类似于WWW的模式, 它允许现在的Web开发者轻易地过渡到为移动设备制作内容和应用程序.
为了达到这一点, WAE合并了几个我们所熟悉的主要Web功能, 其中包括URL(如http://www. wap. net)和MIME内容类型(例如text/html和image/gif). 另外, 它为其他功能提供了相似的替代:WML(无线标记语言)替代了HTML, 而WMLScr巾t(无线标记语言脚本)替代了JavascriPt. 几乎所有的WAP应用程序都可以使用这两种语言和 WBMP(无线位图, WAP的图像格式)来编写, 这样它们就构成了一个开发者所需知道的主要内容(也就是本书中主要介绍的内容!).
从服务器到客户端
图P-2中介绍了用户访问WAP内容的完整过程. (该图省略了通信的细节, 因为它们是不重要的, 它们根据实际所使用的低级运营商协议的不同而有所不同. )
图中的WAP浏览器可以运行在任何支持WAP的设备上, 从移动电话到PDA. 通常, 移动电话需要设计为支持WAP, 而当今大多数PDA可以购买浏览器软件并进行安装, 从而升级到支持WAP. PDA需要随移动电话一起使用, 从而提供连接性.
源服务器(在图的最右边)自身存储或产生内容. 在几乎所有情况中, 用来与源服务器进行通信所使用的协议是标准HTTP, 因此源服务器可以是标准的Web服务器. 通常需要对服务器配置做一些小的修改(注1), 从而使它可以提供WAP内容. 大多数流行的Web服务器软件都可以执行该任务. 一个有趣的解决方案是使用诸如 XSLT(XML样式表语言转换)这样的技术, 它允许HTML和WML自动从同样的原始数据中生成.
实际中存在一些后台数据库服务器, 并未包括在该图中. 源服务器使用标准的Web技术(例如CGI脚本或者Java servlet)来生成所需的动态内容. 这些脚本可能需要与数据库进行通信, 以获得输出的原始数据. (但是, 这超出了本书所研究的范围. 在服务器上生成Web内容的所有技术也可用于WAP, 因此可以阅读这方面的书籍. )
WAP网关
图P-2中的WAP网关更有意思. WAP网关的工作是在浏览器的WAP通信协议(WSP. WTP等)与源服务器所需的标准HTTP和TCI/IP协议之间进行转换. 它还负责将源服务器输出的内容(文字格式)转换成浏览器所需的WML和WMLScript的压缩二进制格式.
网关由执行该转换的软件所组成, 通常运行在某种标准硬件上. (大多数严格意义上的网关运行在任务繁重的Unix服务器上, 但是有些低端网关软件也可以运行在基于Windows的个人计算机上. )网关的所有者还必须处理与运营商网络的连接. 对基于拨号的运营商, 该过程是通过标准访问服务器来完成的(用户使用该设备来拨号连入到Internet), 但是对于像SMS和GPRS这样的载体, 连接可能会使用到运营商的专用线路.
由于这些基础设施的要求, 大多数提供WAP内容的人们并不运行自己的网关. (许多人运行自己的源服务器, 因为它与运行标准的Web服务器没什么太大区别, 但是很少有人运行整个WAP网关. )所有想要支持WAP的移动电话运营商(即大多数移动电话运营商)可能会运行自己的网关, 许多其他人口站点已经存在, 也会运行网关. 由于其中大多数运营商都允许用户来访问Internet上的内容, 因此用户仅需一个账号就可以访问第三方内容.
关于本书
本书并不着重介绍通信协议(就你看来, 它们很像HTTP)或压缩文件格式(你无需关注应用程序如何连接到设备, 你所需关注的是用户要访问的内容)的详细内容. 我也不会深入介绍安全性和加密是如何进行处理的(这些是通信过程的另一部分). 大多数Web开发者并不关心学习HTTP或TCP/IP是如何工作的, 他们的注意力都集中于编写Web页面所需要的知识. 如果你想了解这些内容的详细资料, 那么可以从WAP论坛的Web站点(http://www. wapforum. org)下载最新版的规范.
本书排版约定
本书使用以下英字体约定:
斜体(Italic)
表示操作系统路径名. 文件名. 程序名. Internet地址(例如域名和URL), 以及定义的新术语.
黑体(Bold)
表示GUI项的名称:窗口名. 按钮. 菜单选项等等.
等宽字体(Constant width)
表示代码. 命令行和需要逐字输入的选项, WML和WMLScript程序中的名称和关键字, 包括函数名. 变量名和XML元素标签.
等宽斜体(Constant width italic)
表示代码中用户和程序员必须提供名称或值的项.
建议与评论
本书的内容都经过测试, 尽管我们做了最大的努力, 但错误和疏忽仍然是在所难免的. 如果你发现有什么错误, 或者是对将来的版本有什么建议, 请通过下面的地址告诉我们:
美国:
O'Reilly & Associates, Inc.
101 Morris Street
Sebastopol, CA 95472
中国:
100080北京市海淀区知春路49号希格玛公寓B座809室
奥莱理软件(北京)有限公司
也可以以电子形式来发送消息. 如果要添加到邮件列表或者查询一个目录, 请发
送电子邮件到:
info@oreilly. com
如果要询问技术问题或者有对本书的评论, 请发送电子邮件到:
bookquestions@oreilly. com
本书有一个Web站点, 上面列有实例. 勘误表和今后出版的计划. 这个站点还包括到一个论坛上的链接, 你可以在这个论坛上与作者和其他读者就本书进行交流.
网址为:
http: //www. oreilly. com /catalog/learnwml
关于本书的更多信息以及其他内容, 请访问O'Reilly的Web站点:
http: //www. oreilly. com
http: //www. oreilly. com. cn
致谢
本书是许多人辛勤工作的结果.
我深深地感谢本书的编辑John Posner, 他不断地给我提出许多建设性的批评和无数有益的意见. 没有他, 本书将一无是处. 这可并不是夸张. 感谢Christien Shangraw和Katie Gardner, 他们为我提供了StarOffice模板, 并耐心地解答我的询问. 同样要感谢O'Reilly公司, 为我提供了编写本书的机会.
感谢我的朋友们, 并向你们致歉, 为了我编写本书而一次又一次地取消周末计划. 特别感谢在我完稿之前通读本书的朋友们:非常抱歉, 我没有能更早地完成本书的编写, 以致大家等了这么长的时间.
一些精英人士在我几乎要完全放弃编写本书时, 表现出特别的理解和原谅.
感谢我的主管, 允许我将编写本书的工作放在第一位, 并在最后的时间一再提醒我完成的期限.
最后, 特别感谢Leon, 因为他允诺如果我在本书中提及他, 他就请我喝美味的啤酒.