zoukankan      html  css  js  c++  java
  • wap2.0开发

    前言

    移动通信和互联网的迅速发展,使得互联网从固定向移动转移(即移动互联网)成为一种必然的趋势。由于手机终端本身的限制条件和无线链路的特点,现有无线传送技术的效率和可靠性会越来越难以令用户满意。如何让手机上网是WAP协议所要解决的问题。

    一、认识WAP协议

    无线应用协议WAP(Wireless Application Protocol)也称为无线应用程序协议,是在数字移动电话、Internet及其他个人数字助理机PDA、计算机应用之间进行通信的开放性全球标准。WAP由一系列协议组成,用于标准化无线电通信设备,也可用于Internet访问,包括收发E-mail、访问WAP网站上的页面等等。WAP将移动网络和Internet以及企业的局域网紧密地联系起来,提供了一种与网络类型、运行商和终端设备都独立的、无地域限制的移动增值业务。通过这种技术,无论用户身在何地、何时,只要通过WAP手机,即可享受无穷无尽的网上信息资源。

    利用WAP实现的网络业务以其移动性、灵活性、个人化、信息实时性、信息简短实用而受到广大数字移动电话用户的普遍欢迎。据预测,到2002年,中国Internet用户将达6500万,其中移动上网的用户可达3000万,超过使用PC上网的用户;到2004年,全球Internet用户将突破10亿,其中约有3.5亿用户将通过移动方式接入Internet。显然,用于解决无线移动接入的WAP技术将发挥愈来愈重要的作用。

    二、WAP的前世今生

    1. wap 1.x

    WAP1.0版本是WAP的第一个版本,在1998年夏被通过。这一版本推介出了WAP的核心内容、i.e.WAP协议条款、WML以及WMLScript等。

    WAP1.1版本于1999年夏推出,这是1.0版本的改良版,是对以前的版本进行归纳反馈的结果。1.1版是第一个商业版,在这一版本中的主要变化仍然是用XHTML对WML进行编排以得出W3C的详细说明。这一版本支持WBMP格式的图像操作,从而提高了无线电话应用(WTA)-规格及WML的所有标记,现在它已用小写取代了大写。

      WAP1.2版本现已被通过,这一版本采用了WAP推进架构、用户代理结构(UAPROF)、WDP通道、提高无线电话应用(WTA)规格以及包括支持附加的用户网络技术。

    2. wap推陈出新

            1 WAP2.0于2001年8月正式发布,它在WAP1.x的基础上集成了Internet上最新的标准和技术,并将这些技术和标准应用到无线领域。这些新技术和标准包括XHTML、TCP/IP、超文本协议(HTTP/1.1)和传输安全层(TLS)。在这些新技术的支持下,新增加了数据同步、多媒体信息服务、统一存储接口、配置信息提供和小图片等新的业务和应用,同时加强了无线电话应用、Push技术和用户代理特征描述等原有的应用。这些新的业务和应用将会带来一种全新的使用感受,并极大地激发人们对无线应用服务的兴趣,从而推动移动互联网的发展。

    3. wap2.0最新的标准和技术

    3.1 对XHTML的支持

    XHTML是由万维网联盟W3C制定的一项新标准,它是在HTML4.0的基础上产生的,是现在和将来要产生的文档类型和模块的集合。这些文档类型是在HTML4.0基础上的扩展、改进或者是其子集的某一部分;XHTML是基于XML的,其最终将会在基于XML的用户代理环境中执行。

    在XML中引入新元素和新属性相对简单一些,在XHTML集合中的扩展是通过使用XHTML的各种模块和采用开发基于XHTML模块的技术来实现的。这样,在进行内容开发和用户代理设计时,在这些模块中就能够将原来和现有的特征集合组合在一起。

    利用XHTML的好处有以下3点:XHTML文档符合XML的标准,可以使用标准的XML工具对其进行浏览、编辑和验证;XHTML文档可以在XHTML的用户代理中执行,也可以在现存的HTML4.0的用户代理中执行;XHTML文档可以开发基于HTML文档对象模型的应用,也可以开发基于XML文档对象模型的应用。随着XHTML集合的演进,基于XHTML的文档更容易在各种各样的XHTML环境中或者它们之间进行互操作。通过利用XHTML,内容开发商能够逐步进入XML,同时还能保持它们内容的前后兼容。

    XHTMLBasic文档类型包括了保持XHTML语言特征的最小的模块集合。此外它还包括了图像、窗体、基本表格和对象支持等,文档类型丰富,但它不包括全部的XHTML集合,因为有些网络客户端不支持全部的XHTML特征,如移动电话、PDA、寻呼机和机顶盒等设备。XHTMLBasic被设计成能扩展的通用的基本集合,例如,其中事件模块比传统的XHTML4.0的事件系统更加通用,而且能通过另外的XHTMLModularization模块集合进行增减和功能扩展。XHTMLBasic的目标是能够支持各种各样的用户代理的通用语言。XHTMLBasic是WML2.0的基础。

    WAP2.0利用XHTML和CSSMobileProfile等标准,同时保持了对WML1.x的向后兼容,减少了开发、测试一种应用和为多种设备编制内容的时间,减少了开发成本。另外,XHTML的模块化架构可以很容易、很快地适应不同的硬件环境的应用。通过使用级联样式单(Cascading Style Sheets,CSS),开发商可以将实际编码和一个或多个XML文档的样式属性分离开,减少了在浏览器缓存中的代码量。

    我们可以利用现有的开发固定互联网内容和应用的工具和资源来开发WAP2.0的内容和应用,允许开发商使用通用的语言子集和开发工具同时为PC和WAP客户端开发应用。因此支持WML2.0的浏览器同样能够支持XTHML,也能够支持HTML。另外,支持WAP2.0的手机完全可以浏览现有的Internet内容。这样,可以大大丰富WAP2.0的应用。

    3.2 对TCP/IP协议栈的支持

    互联网工程任务组(IETF)一直致力于TCP/IP协议的优化研究,并特别制定了针对无线链路的TCP/IP协议。WAP论坛吸收了IETF的最新的技术成果,除了继续支持原有WAP1.x的协议栈以外,在WAP2.0中还采用了如下IETF规范。

    在传输层,WAP2.0采用具有无线特征的WP-TCP/IP协议,以使得网络可以基于IP进行数据传输。WP-TCP提供面向连接的服务,它被优化用于无线环境,可与互联网上的标准TCP应用充分交互操作。IETF PILC小组推荐使用一些在长距离瘦网络中的TCP实现机制。这些机制已经被Standards Track RFC收录,并作为有效的性能稳定的机制被互联网组织接受。

    在会话层,WAP2.0采用具有无线特征的HTrP协议(WP-HTTP),WP-HTTP规范针对无线环境的HTTP的协议子集,完全能够与HTTP/1.1共同使用。WAP设备和WAP代理服务器/WAP服务器之间交互工作的基本模型是HTTP请求/回应处理机制。WP-HTTP支持回应的信息体压缩和安全通道的建立。这样,在WAP2.0中不一定需要WAP代理服务器,因为在客户端和源服务器端通过使用HTTP/1.1就可以直接完成。

    WAP2.0增加了更多的安全保证措施,包括采用TLS协议,提供改进的端到端的安全,集成有线Internet等,以保证使用移动商务和移动银行应用等移动业务的安全。TLS协议的无线协议子集允许针对安全传输的交互操作。TLS的协议子集包括加密簇、验证字格式、签名规则和会话恢复等安全措施。

    4. 新增加和增强的业务和应用

    WAP2.0规范能够帮助内容开发商向移动互联网用 户提供更丰富和更安全的移动互联网服务。WAP2.0在世界标准领域是一个巨大进步,它允许应用开发商利用他们已经非常熟悉的开发Intemet应用的技术和工具开发各种移动应用。据Cahners ln-Stat Group预测,无线互联网的用户从2000年的3000万可以发展到2005年的74200万,WAP2.0通过新的应用和下一代的设备将极大地促进这一进程。在WAP2.0中听融合的新技术将会使用户切身体验到WAP2.0中的新业务。

    (1)推服务(WAP Push)

    这种业务是一种基于服务器的应用,利用推代理服务器(Push Proxy)将内容送到或者推到手机设备中。这种功能在WAP2.0发行版中得到了加强,这种推的功能实际上是将像短消息、股票价格和交通信息之类的实时应用信息发给用户:没有这种推功能时,需要这种实时应用信息的用户就要去询应用最务器以得到最新的信息,在无线环境里这种询操作效率不仅低,而且还浪费了无线网络的资源。

    (2)用户代理特征描述(User Agent Profile,UAProf)

    这种壹务羹供了一种机制,这种机制是将客户的能力和用户的喜好描述提供给应用服务器。WAF2。0是以W3C的能力组合/喜好特征(CC/PP)工作成果为基础的。UAProf支持客户机、服务器交互模式,用户可以请求向服务器端发送客户端或者用户信息。服务器可以根据这些信息准备定制的内容响应给客户端或者用户,这种业务模型允许直接增加一些业务适配层。插人中间代理来提供增值业务。

    考虑到用户隐私的重要性,所以这种业务模型能够由用户控制其请求中的个人信息。

    (3)无线电话应用(Wireless Telephony Application, WTA)

    这种业务提供了一种可以开发一系列高级电话应用的工具。其中的高级电话应用可以在支持传统数据功能的应用环境里运行。这些电话应用所有的呼叫处理服务,如呼叫建立、呼叫应答、呼叫挂起和呼叫转移,可以和数据业务无缝地结合,这一点可以使得小区电话成为充分整合互联网和语音业务得平台。

    (4)外部功能接口(External Functionality Interface,EFI)

    EFI定义了WAE和WAE范围之外所能运行的应用程序中的各组件或者实体之间得接口,类似于提供了一种插件,这种插件扩展和增强了终端浏览器或者终端中其他应用的功能。EFI的框架结构能够支持WAP设备的未来发展和可扩展能力,而且还可以用来定义接人外部设备(如智能卡、GPS设备、医疗保健设备和数字相机)的特定接口。

    (5)统一客户存储界面(Persistent Storage Interface)

    这种能力规定了一套标准接口的存储设备,通过这个接口可以在无线设备或其他相连的存储设备上进行数据的组织、存取、存储和采集。

    (6)数据同步(Data Synchronization)

    数据同步是指各种网络设备(包括手机终端、PDA、PC)和各种网络服务器之间某些数据集合保持一致的过程。这些数据集合包括名片信息、约会信息和公司的销售账单等。WAP论坛在WAP2.0中的数据同步的解决方案是采用SyncML发起组的工作成果,选择SyncML语言作为数据同步解决方案的。在WAP和HTTP/1.1协议中均可以支持SyYncML的消息。

    (7)多媒体信息服务(Multimedia Messaging Service,MMS)

    MMS为实现丰富多彩的多媒体信息的传递提供了整体架构,它的特点和功能就是能够传送各种类型的内容。根据这种业务模型,MMS允许消息的快速发送(如SMS)和消息的存储转发(如E-mail)或两种模式同时运行。这种灵活性使用户和运营商可以根据合理的使用体验定制服务。结合其他的WAP服务,如UAProf和Push服务,MMS还提供了一种高效的信息服务的解决方案,它可以提供消息公告,即主动调整服务,以将需要发送的信息组合在一个表格中,终端接收设备可以利用这个表格高效地接收信息。

    (8)配置信息提供(Provisioning)

    这种业务提供了一种标准方法,利用这种方法可以给WAP客户端提供在无线网络上进行操作所必要的初始化信息。这就使得运营商可以利用一套通用的工具管理其网络上的终端设备;

    (9)小图片(Pictogram)

    用户可以使用像笑脸符之类的小图像进行信息的传递,有时候比文字更加有效,也更生动活泼。

    三、WAP应用

    3.1 WAP应用优势

    与普通Internet相比,应用WAP协议的无线Internet在终端、接入方式、带宽、稳定性以及商业运作模式之间存在巨大差异。无线Internet可以通过掌上服务,把每个用户个体与Internet紧密地结合在一起,因此用户可以得到比传统的Internet更多的个性化信息服务。从WAP的组成和特点来看,它具有以下应用优势:  

    (1) 适用于无线数据的传输机制;

    (2) 独立于网络标准;  

    (3) 开放的标准,并独立于各生产厂商;  

    (4) 可以用作Internet浏览器,支持超文本链接,具有较强的交互能力;  

    (5) 可以从服务器上直接下载应用,从而可以快速提供新的服务。这一点也是WAP与嵌入式软件明显不同的地方。

    3.2 WAP应用限制

    尽管WAP具有较强的应用优势,但目前也有一些条件限制了WAP的应用。这主要表现在ISP环节、网页显示内容、无线接入及通信速度等方面。

    随着无线技术、Internet接入和内容服务的日益相互融合,许多厂商都想尽快解决在手持设备上显示各种信息的方法。虽然说这对无线上网用户而言是个好消息,但令人遗憾的是,用户要享受到这样的服务,必须经由无线ISP这个重要的环节,也就是说在目前的技术条件下,这个环节是不能越过的,解决这个问题还有待时日。

    手持设备的显示屏幕非常小,单屏显示信息有限,这在一定程度上限制了WAP技术的应用。不过,为了使手持设备用户可以访问尽可能多的网站,获取尽可能多的信息,许多厂商都在想办法研究信息的表现形式。例如,美国Digital Paths公司开发出了Digital Paths技术。利用这种技术,服务商可以把所有信息以一种简单实用的文本形式显示在手机设备上,这可以大大改善网页内容的可读性。

    另外,Digital Paths公司还采用一台服务器作为网站与用户之间取得联系的中介。服务器上的应用软件可以根据用户手持设备的类型,对截获的网页内容重新进行格式处理,以实现较好的显示效果。这种方法突破了普通手持设备160×160像素的分辨率和手机屏幕5行显示空间的限制。不过这种技术真正达到标准化并获得广泛普及,恐怕还需要一段时间。

    除了上述几点外,无线接入问题目前一时难以解决,也会限制WAP应用。例如,Palm VII这种设备就必须通过一个采用802.11技术的基站进行无线电连接,虽然说已有一些厂商推出了802.11基站设备,但种类和数量都十分有限,与市场要求的标准还有很大差距。

    而且,WAP手机在收发E-mail、浏览网站信息等功能之外,很难提供更复杂的通信应用,比如在线采购和视频会议等。其关键是目前移动通信网的运行速度根本无法达到要求。只有将来移动通信网进行全面“提速”,并使Internet实现快速移动后,更高级的WAP应用功能才可成为现实。

    3.3  WAP未来

    1999年全球有1.35亿移动电话用户,根据IDC公布的调查报告,到2005年,全球无线电通信用户预计将达到10亿。调查中还发现了一个值得注意的现象,即许多手机用户,往往同时也是Internet用户,这些人在本国内的所占比例,通常决定了该国的通信市场大小。一般来说,这些人所占比例越高,他们国家的通信市场就越发达。比如日本,由于对移动电话技术和相应的基础设施进行了巨额投资,使得日本移动电话的用户很早便享受到了互动信息业务,虽然一时还不完备,但却极大地刺激了市场的发育。据预测,到2002年日本的手机用户数将会达到全世界移动电话用户数的10%。同样,欧洲的情况也非常令人乐观。未来几年中,欧洲移动电话市场的增长速度可能达到300%以上。早在1999年,Ellison,这位美国Oracle公司的CEO便在瑞士日内瓦举行的“TELECOM 99”展览会上指出,Internet将取代PC在历史舞台上扮演主角,利用无线终端与Internet连接的用户将很快超过使用PC与Internet连接的用户。

    中国信息产业部电子信息中心和蓝田市场研究公司联合进行的全国性大范围调查,形成了国内信息产业多层面的基础数据(简称ITD2000)。结果显示,我国移动电话用户绝对数量超过5000万户,无线寻呼用户超过7000万户,已经成为名副其实的移动通信大国。据ITD2000显示,10年来,我国移动电话的发展从无到有,空前迅猛。移动电话用户数量一直保持高速增长。1999年我国移动电话用户达到4000万户,目前已超过5000万户,仅次于美国和日本,居世界第三位,增长速度居世界第一。而且,国产移动通信制造业已取得群体性突破。在移动通信市场上,中兴、大唐、华为、金鹏等民族通信企业迅速崛起,并获得移动设备入网证。国产品牌手机占领的市场份额日益增大。  

    基于WAP的移动通信设备上网将为我们展示一个全新的空间。虽然WAP技术本身仍在不断地完善和发展,但随着技术的不断进步和用户市场的日益成熟,所有的问题都会逐步加以解决,与之相应,在移动通信设备中发生的这场信息术革命,也将变得更加轰轰烈烈。

    WAP目前已经成为通过移动电话及其他无线移动终端使用无线信息服务的全球性的技术与工业标准,它不但使现有移动网络的许多应用得到了迅速发展,同时也催生更多的全新的增值业务,而且这些应用还将由纯信息的服务逐渐向更加交互化和电子商务化的方向发展。 

    如果说移动电话的出现使我们摆脱了地理位置的束缚,那么Internet的出现则给我们提供了一片广阔的信息天地;移动电话与Internet的结合,不仅使人们对于信息的获取能独立于所处的地理位置,而且还可以独立于信息的来源。所以WAP技术必将给我们带来一个全新的未来,人类最终将超越时间和空间对沟通的束缚,进入更为激动人心的美好时代。

    四、WML 编程

      WML(Wireless Markup Language - 无线标记语言)这种描述语言同我们常听说的HTML语言同出一家,都属于X ML语言这一大家族。HTML语言写出的内容,我们可以在我们的PC机上用IE或是Netscape等浏览器进行阅读,而 WML语言写出的文件则是专门用来在手机等的一些无线终端显示屏上显示,供人们阅读的,并且同样也可以向使用者提供人机交互界面,接受使用者输入的查询等信息,然后向使用者返回他所想要获得的最终信息。

    1.基本规则

    * WML使用XML文档字符集,目前支持 Unicode 2.0,和HTML不同,WML的所有标签,属性和规定的可接收值必须小写,CARD的名字和变量也是区分大小写的。和HTML一样,对于连续的空字符,只显示一个空格。标签内属性的值必须用"或者'括起来,属性名,=和值之间不能有空格。对于不成对出现的标签,必须在 > 前加 / ,比如<br/>。在对变量的引用上和HTML基本相同,有:

       $(var1:esc)

       $(var1:noesc)

       $(var1:unesc)

    三种形式,具体含义参见前面HTML的相关部分。在对保留字符的处理上也基本相同,对应的取代字符有:

       < &lt;

       > &gt;

       ' &apos;

       " &quot;

       & &amp;

       $ $$

       空格 &nbsp;

       - &shy;

    这里要指出的是在URL的传递过程中,用来连接参数的 & 必须转化为 &amp;。

    2.基本格式和文件头

    wml文件的一般格式:

    <?xml version="1.0"?>

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

    <wml>

    <head>

    <access/>

    <meta..../>

    </head>

    <card>

    Some contents...

    </card>

    <wml>

       结构看上去和HTMl文件很类似,对于每一个DECK(板块),在其文档开头必须指明以下的类型声明:

    <?xml version="1.0"?>

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

    千万注意字母的大小写。对于一个DECK,其文件大小最好不要超过1.2K。

       <wml>标签和HTML中的<html>标签一样,用来表明这是一个 WML的DECK,它有一个可选的xml:lang属性来制定文档的语言,比如<wml xml:lang="zh">表示文档语言为中文。

       和HTML一样<head>标签包含了该DESK的相关信息。<head> 标签之间可以包含一个<access>标签和多个<meta>标签。

       <access domain="域" path="/路径" />相当于HTML中的<BASE>标签,指定该DECK的访问控制信息,它用两个可选的属性,domain用来指定域,默认值为当前域, path用来指定路径,默认值为"/",即根目录。由于 <access>单独使用,所以要用/结尾,以后对于类似的情况不再赘述。

       <meta 属性 content="值" scheme="格式" forua="true|false"/> 和HTML中的类似,提供了该DECK的meta信息。属性是必选的,包括一下三种情况

       name="name" UP.Link Server忽略meta数据

       http-equiv="name" UP.Link Server将meta 数据转为 HTTP 响应头(同HTML)

       user-agent="agent" UP.Link Server 直接将 meta 数据传给手机设备,content属性也是必选的,其内容根据属性而定。scheme属性目前尚不支持。forua 为可选属性,指定在该wml文件传到客户端之前,<meta>标签是不是被中间代理删除(因为传输的协议可能改变),默认值为false。

       目前支持的meta数据:

       <meta http-equiv="Cache-Control" content="max-age=3600"/>指定DECK在手机内存缓存中的存储时间段,默认的为30天(除非内存耗尽),在该期间,手机对于访问过的DECK直接从缓存里调用。如果信息是对时间敏感的,可以用max-age指定DECK在缓存里的生存期,最小单位是秒, 如果指定为0, 则每次都需通过连接服务器来调用该DECK。

       <meta user-agent="vnd.up.markable" content="false"/>和<meta user-agent="vnd.up.bookmark" content="指定的URL"/> 类似于普通浏览器的书签功能。当用户将一个CARD做了书签后,手机浏览器首先用一个标记记录该CARD,这个标记默认的是<card>标签中的title属性(以后会讲到),然后当用户选择了该书签以后,浏览器就会打开被记录的URL。但是因为在默认的情况下,手机会记录所有的DECK,所以,一般<meta>被用来使手机不要记录当前的URL,即

    <meta user-agent="vnd.up.markable" content="false"/>。此外, 如果要为书签指定不同于当前DRECk的 URL,用<meta user-agent="vnd.up.bookmark" content="指定的URL"/>。

       一个DECK可以包含多个CARD,每个CARD的内容可能不止一屏显示,注意DECK,CARD和屏幕显示范围的关系。一个CARD用<card>和</card>包含。<card>可以包含以下可选的属性:

    <card id="name" title="label" newcontext="false" ordered="true" onenterforward="url" onenterbackward="url" ontimer="url">

       *id属性用来指定CARD的名字,可用来在CARD间跳转,相当于在HTML中在页内跳转时用<A NAME="jumpHere">。

       *title属性用来作为书签的标记,该属性一般不会显示在屏幕上。

       *newcontext属性,默认值为false, 用来指示当跳转到本CARD时,手机是不是要清除以前保留的信息,包括变量,堆栈里的历史记录,重新设置手机状态等。

       *ordered属性,默认值是true,表明该CARD里的内容是按固定的顺序显示, 还是按用户的选择来显示。这点和HTMl不同,CARD 页面里的内容可以按一定的顺序显示,默认的是按线性顺序显示,即按代码的顺序,但是,要注意的是,以下三个标签必须按以下顺序来写<onevent> <timer> <do>, (这和以后要讲的“事件”有关)。这样做是为了方便填表单,当ordered设置为true时,如果一个表单的内容不能在一屏里显示完,就分成多屏显示;当ordered设置为false时,手机可以显示一个概要CARD来总结有效的选项,用户可以从中选取表单选项来填写。

       *onXXX属性,类似于HTML标签中的onXXX属性,用来捕捉事件,当事件被触发时执行指定的操作(任务),在这里是转向某个URL。

    3.显示文本

    在文本的显示上WML基本和HTML相同。文字段落包含在<p align= "alignment" mode=" wrapmode">和</p>之间,align属性指定该段文字的对齐方式,默认的是left,其他可选择right和center;mode属性指定当一行显示不下所有的文字时是否自动换行,默认的是自动换行wrap,如果选nowrap,则在一行中显示,浏览器会通过类似于水平滚动条的机制来显示所有文字。

       换行标签也一样为<br/>,这里先替一下,在标单中如果有多个<input>或者<select>,其间不要用<br/>,否则会使手机浏览器认为是断点而把表单分页显示。

       文字的修饰标签有<b>、<i>、<u>、<em>、<strong>、<big>和<small>,意义和HTML里的相同。

       表格的显示标签也和HTML相近,使用<table title="name" align="left|right|center" columns="列数">、<tr>和<td>来显示,<table>的title属性用来给表格取个名字,columns属性指定表的列数,不能为0,可选的align属性和前面提到的一样是对齐方式。表格中可以包含文字和图片。

    test1.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>

    <p align="center">

    <i>Hello</i><br/>

    <b><i>World!</i></b>

    <table title="mytable" align="right" columns="2">

    <tr>

    <td>1-1</td>

    <td>1-2</td>

    </tr>

    <tr>

    <td>2-1</td>

    <td>2-2</td>

    </tr>

    </table>

    </p>

    </card>

    </wml>

    4.显示图片

      显示图片(1位黑白BMP图片)的标签一样类似于HTML,<img alt="text" src="url" localsrc="icon" align="left" height="n" width="n" vspace="n" hspace="n"/>,属性中alt和src是必须要有的,其他可选。另外要注意的是<img>要放在<p>里,不能放在<do>和<option>等功能健标签和选单标签里。

       *alt属性用来指定当手机不支持图片显示时用来显示的文字。

       *src属性指定图片的URL,但当有了以下的localsrc属性时,手机浏览器就忽略src属性。

       *localsrc属性用来指定显示存在手机ROM中的图标,如果找不到,则到UP.Link Server上去找。

       *可选的align属性用来表明图片同当前行文本的对齐方式,默认值为bottom,可选to和middle。

       *height、width、vspace、hspace属性分别指定图片的长宽和距环绕文字的间距,目前不是所有的WAP手机都支持这些属性。

    test2.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>

    <p align="center"><img alt=":)" src="xxx.bmp" localsrc="smileyface"/></p>

    </card>

    </wml>

    5.锚和任务

    连接是 HTML 页面里最基本的功能, 在 WML 里也一样用 <a href="url" title="label"> 和 </a>来包括用来建立连接的文字,必选属性href指定了要打开的URL,可选的title属性给该连接取个标记名字,这个名字将作为软按钮之一的ACCEPT键(详见以前的HDML入门文章)的标记显示在屏幕的软按钮区,所以通常可以将属性作为提示文字是用。

       然而,以上的连接在WML里只是任务的一种情况,为了能够使用其它任务,所以引进了新的标签<anchor title="label">任务标签 文本</anchor>,<a>其实是当任务标签为<go/>时的简单表示方式。

    test3.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>

    <p>

    <anchor title="Link1"><go href="test1.wml"/>News</anchor><br/>

    <a title="Link2" href="test2.wml">Sports</a>

    </p>

    </card>

    </wml>

       WML里的任务标签有以下几种,除了用于<anchor>,还可以用在事件中:

       1)<go>用来指示浏览器显示指定的URL,包括DECK的第一个CARD或者指定的CARD。语法如下:

       <go href="url" sendreferer="false|true" method="get|post" accept-charset="charset">

       <postfield name="name" value="value"/>

       <setvar name="name" value="value"/>

       </go>

       其中href属性为必选,其他为可选。sendreferer属性表示是否传递调用href所指定的URL的页面的URL,也就是当前页的URL,即 HTTP 头中的HTTP_REFERER,默认值为false,可选值为true。method和HTML中的表单FORM的method属性一样,指定表单是以get的方式还是post的方式递交,以便cgi处理,默认的值为get,但如果未指定method但<go></go>间存在<postfield>,手机自动以post方式传递。accept-charset 属性可覆盖在HTTP头里指定的字符集,可以写多个字符集,如accept-charset="UTF-8,US-ASCII, ISO-8859-1"。

       <postfield name="name" value="value"/>可以看作是HTML表单FORM中的<INPUT TYPE="HIDDEN" NAME="变量名" VALUE="值">,通过它可以向指定的URL传递以“变量名/值”形式的数据。name和value属性都是必选的。注意只有这里的变量是用来递交给CGI程序的。

       除了<postfield>,还可以在<go>和</go>间加入一句或者多句<setvar name="name" value="value"/>,该语句的意思是,当触发某一事件时,给变量赋值。

       要注意的是,当<go>和</go>之间没有任何语句时,要用<go/>的形式,这点比较特别,比如<anchor title="Link1"><go href="test.wml"/>News</anchor>。

       2)<prev>用来将当前页面的URL压入URL历史堆栈,并打开此前的URL,若该URL不存在,则<prev>无效。语法类似<go>:<prev><setvar name="name" value="value"/></prev>,<prev>和</prev>之间可加入一句或多句<setvar name="name" value="value"/>,若不加,则必须变成<prev/>的形式。

       3)<refresh>用来刷新当前的页面,从而使得页面内的变量刷新,语法为<refresh><setvar name="name" value="value"/></refresh>。

       4)<noop>,表示什么也不做,该标签不能用在<anchor>中,一般用在覆盖DECK级的<do>(以后会说明)

    6.显示表单

    类似于HTML的<FORM>,<fieldset>可用来包括一组表单选项,但不是必须的。前面说过,当<card>的ordered设置为false时,手机可以显示一个概要CARD来总结有效的选项,方便用户从中选取表单选项来填写,概要CARD就是根据<fieldset>和独立的输入框<input>以及选单<select>来总结的。语法为, <fieldset title="label">表单内容</fieldset>,可选的title属性除了可用来表示表单的名字外,还在概要CARD里作为选择项的标题。表单内容可以是嵌套的<fieldset>,输入框<input>,选单<select>和必要的提示文本。

       <input name="variable" title="label" type="type" value="value" default="default" format="specifier" emptyok="false|true" size="n" maxlength="n" tabindex="n"/>,用来输入文本,除了name属性是必要的,其他可选。

       *name属性,指定了用来存储该输入文本的变量名字。

       *title属性,该输入框的名字,同样可被用来作为概要CARD页中的选项名。

       *type属性,默认值为text,如选择password,则输入的数据显示为*。

       *value属性,在语法和行为上等同于下面的default属性,

       *default属性,指定输入框的默认值,即name属性指定变量的默认值,当用户输入新值时,该值无效,如果该值不符合以下format属性的规定,则手机也忽略该默认值。

       *format 属性,用来格式化输入的数据,可用的标记如下,使用时可用“一位数字标记”和“*标记”的形式,前者代表N个标记型字符,如3X, 后者代表任意个(小于maxlength属性的值)标记型字符。

       标记   描述

       A     任何符号或者大写字母(不包括数字)

       a     任何符号或者小写字母(不包括数字)

       N     任何数字(不包括符号或者字母)

       X     任何符号、数字或者大写字母(不可改变为小写字母)

       x     任何符号、数字或者小写字母(不可改变为大写字母)

       M     任何符号、数字或者大写字母(可改变为小写字母)或者多个字符,默认为首字大写

       m     任何符号、数字或者小写字母(可改变为大写字母)或者多个字符,默认为首字小写

       *maxlength属性,指定了用户可输入的最大字符长度,最大限制为256个字符。

       *emptyok属性,表示用户可否不填输入框,默认为false,即要填。

       *size属性,输入框显示长度,目前未被支持。

       *tabindex属性,类似于在HTML表单中按TAB键后,焦点落在哪个选项上,该值决定了这个选择顺序,数字大的排在后面。目前未被支持。

    test4.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="card1" ordered="false">

    <p>

    USERNAME:<input name="userName" title="User Name" type="text" value="YourNameHere" format="*M" emptyok="false" maxlength="12" tabindex="1"/>

    PASSWORD:<input name="password" title="Password" type="password" format="8x" emptyok="false" maxlength="8" tabindex="2"/>

    COMMENTS:<input name="comments" title="comment" type="text" value="YourCommentsHere" format="*M" emptyok="true" maxlength="30" tabindex="3"/>

    </p>

    </card>

    </wml>

       将上例<card>中的odered的值改为"true"试试看,然后再在<p>和</p>内加入<fieldset title="field1">和</fieldset>试试看。

       <select>选单类似于HTML表单中的<SELECT>,<select>和</select>间可包含<optgroup>和<option>标签,语法如下,所有属性都为可选:

       <select title="label" multiple="false|true" name="variable" default="default" iname="index_var" ivalue="default" tabindex=" n">

       <optgroup title="label">选单内容</optgroup>

       <option title="label" value="value" onpick="url">

       事件或者文本

       </option>

       </select>

       *title属性,如以上<input>的title属性。

       *multiple属性,指定用户可否进行多项选择,默认值为false。

       *name属性,用来存储用户选择项的变量名,其值为 <option>标签的value属性,若用户没有选择又没有用 default 属性指定默认值,则手机将改变量赋值为空字符串"",对于多项选择,每个值用“;”分开。

       *default属性,可为name属性指定的变量赋默认值。

       *iname属性,用来记录用户选择项的位置,相应的值从 1 开始。 若没选,则该值为0。

       *ivalue属性,用来记录默认值所在的位置。

       <optgroup>可用来将多个<option>分组,<optgroup>和</optgroup>间还可包括<optgroup>和<option>,该标签目前尚未被支持。

       <option>,类似于HTML中选单的<OPTION>,用来表示选单的可选项。<option>和</option>间可包括事件(见下节)和选单的显示文本。<option> 的属性为可选,其中value属性用来提供值,当选到该项后,将该值赋给<select> 的name属性所指定的变量。onpick属性,用来指定用户选到该项并按ACCEPT键后所打开页面的URL。

    test5.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="card0" ordered="false">

    <p>

    Please select a city...

    <select title="Cities List" name="city">

    <option title="Beijing" value="c1">Beijing</option>

    <option title="Shanghai" value="c2">Shanghai</option>

    <option title="Hongkong" value="c3">Hongkong</option>

    </select>

    Please select columns...

    <select title="Column List" multiple="true" name="col">

    <option title="Hot News" value="l1">News</option>

    <option title="Cool Sports" value="l2">Sports</option>

    <option title="Pop Enter,,," value="l3">Entertainment</option>

    </select>

    </p>

    </card>

    </wml>

    WML的事件基本上分为两大类,一类是键盘(包括软硬按钮)输入事件,用<do>标签来处理,另一类是相关页面内部的事件,用<onevent>标签来处理。

       <do>的语法如下:<do type="type" label="label" name="name" optional="false|true">任务</do>,任务就是以前提到的四种任务。<do>的属性中,type是必选的,其他为可选。

       *label属性,指定了软按钮在屏幕上的显示文本。目前type属性为delete,help,prev时该属性无效。 

       *name属性,为<do>取个名字,同一的CARD里的<do>不能重名。如果CARD级的<do>和DECK级的<do>同名,则覆盖DECK级的<do>。

       *optional属性,指定手机是不是可以忽略这个事件,默认值是false。

       *type属性,指定触发的事件,具体如下;

       type值    触发原因

       accept    调用ACCEPT按钮机制

       delete    调用DELETE按钮机制

       help     调用HELP按钮机制

       options   调用选择按钮机制

       prev     调用PREV按钮机制

       reset    调用清除和重新设定手机状态时的RESET机制(目前不支持)

       unknown    调用unknown机制,等于type=""(目前不支持)

       vnd. co-type 调用厂商特定的机制(目前不支持)

       X-*, x-*   供以后使用(不保留)(目前不支持)

    test6.wml

    ---------------

    <?xml version="1.0"?>

    <!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=0"/>

    </head>

    <card id="card0" ordered="false">

    <do type="accept" label="InputName" name="do1">

    <go href="#card01"/>

    </do>

    <p>

    NAME:<input name="userName" title="User Name" type="text" format="*M" emptyok="false" maxlength="12"/>

    </p>

    </card>

    <card id="card01">

    <p>

    You name is $(userName:noesc).

    </p>

    </card>

    </wml>

       <onevent>的语法如下,<onevent type="type">任务</onevent>,必选属性type的取值如下:

       type值     如果用户执行了以下操作就执行任务

       onpick     用户选择或不选一个<option>项时。

       onenterforward 用户使用<go>任务到达一个CARD时。

       onenterbackward 用户使用<prev>任务返回到前面的CARD时,或者按BACK按钮时。

       ontimer     当<timer>过期时。

    test7.wml

    ---------------

    <?xml version="1.0"?>

    <!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=0"/>

    </head>

    <card id="card0" ordered="false">

    <p>

    Please select a city...

    <select title="Cities List" name="city">

    <option title="Beijing" value="Beijing">

    <onevent type="onpick">

    <go href="#card01"/>

    </onevent>Beijing</option>

    <option title="Shanghai" value="Shanghai" onpick="#card01">Shanghai</option>

    <option title="Hongkong" value="Hongkong" onpick="#card01">Hongkong</option>

    </select>

    & lt;/p>

    </card>

    <card id="card01">

    <p>

    You are Living in $(city:noesc)

    </p>

    </card>

    </wml>

       <timer/>可以用来在用户不进行任何操作的一段时间后,自动执行一个任务,任何激活CARD页面的任务和用户操作都会启动<timer/>,而任务进行时,<timer/>就停止。每个CARD只能有一个<timer/>,一个<timer/>只能触发一个任务。语法如下:<timer name="variable" value="value"/>,其中name为可选属性,指定为一个变量名,当退出该CARD时,该变量存储此时定时器的值,当定时器超时时,手机将该变量设为0;value为必选属性,用来设置定时器的定时值,最小单位为0.1秒。

    test8.wml

    ---------------

    <?xml version="1.0"?>

    <!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=0"/>

    </head>

    <card id="card1" ontimer="#card2">

    <timer name="time1" value="50"/>

    <p align="center">

    After 5s, goto card2

    </p>

    </card>

    <card id="card2">

    <onevent type="ontimer">

    <go href="#card1"/>

    </onevent>

    <timer name="time2" value="50"/>

    <p align="center">

    Here is card2!

    </p>

    </card>

    </wml>

       再提一下,<onevent> <timer> <do>三者必须按以上顺序写。

       此外在DECK级还可以加入<template>,用来将事件捆绑在DECK级上,语法如下:

       <template onenterforward="url" onenterbackward="url" ontimer="url">

       <do>或者<onevent>

       </template>

    test9.wml

    ---------------

    <?xml version="1.0"?>

    <!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=0"/>

    </head>

    <template>

    <do type="accept" label="deckPress" name="do1">

    <go href="#card01"/>

    </do>

    </template>

    <card id="card0" ordered="false">

    <do type="accept" label="cardPress" name="do1">

    <go href="#card02"/>

    </do>

    <p>

    Press ACCEPT...

    </p>

    </card>

    <card id="card01">

    <p>

    Here is card01

    </p>

    </card>

    <card id="card02">

    <p>

    Here is card02

    </p>

    </card>

    </wml>

    7.编程

      1)在WEB服务器上添加WML的MIME类型

        对于IIS4,可在其管理器里的站点属性中加入新的MIME类型,后缀.wml和 MIME类型text/vnd.wap.wml。

        对于PWS,可修改注册表,先在 HKEY_CLASSES_ROOT层加入主键.wml,再加入串值Content Type为text/vnd.wap.wml,然后在HKEY_LOCAL_MACHINESoftwareCLASSESMIMEDatabaseContent Type中加入主键text/vnd.wap.wml,再加入串值Extension为.wml。

        以前提到的HDML也用类似的方法。

       2)以http方式访问wml文件

        在手机浏览器的URL栏里输入http://localhost/test.wml,就可以访问WML文件了。

       3)CGI设计

        和普通CGI变成的方式差不多,只是返回结果时,先要输出Content-Type为text/vnd.wap.wml,然后再输出WML内容。

    test10.wml

    ---------------

    <?xml version="1.0"?>

    <!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=0"/>

    </head>

    <card id="card0">

    <do type="accept" label="Input Name" name="do1">

    <go href="http://localhost/test.asp" method="post">

    <postfield name="uid" value="123456"/>

    <postfield name="uname" value="$(userName:esc)"/>

    </go>

    </do>

    <p>

    NAME:<input name="userName" title="User Name" type="text" format="*M" emptyok="false" maxlength="12"/>

    </p>

    </card>

    test10.asp

    ---------------

    <%

    uid=Request.Form("uid")

    userName=Request.Form("uname")

    Response.ContentType="text/vnd.wap.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>

    <p>

    USERNAME:<%=userName%>

    USER__ID:<%=uid%>

    </p>

    </card>

    </wml>

     

    五、流行的手机浏览器

    1.YoYo手机浏览器是一款可以运行于大多数手机上的受浏览器,具有快速、稳定、省流量、方便、快捷等特点。

    2.UCWEB UCWEB是一款国产手机网络浏览器,拥有众多的功能,安装过程方便快捷且不过多占用手机中宝贵存储资源,在兼容性和网页支持方面较出色。

     3.Opera 著名浏览器的手机版本,在全球约有两千万用户,拥有很好的人性化设计和兼容性。

    4.   GO浏览器是3G门户独立开发的一款手机浏览器软件,可以在手机上实现浏览WAP、WWW网页。

    六、jsp技术在WAP开发中的应用

    1  jsp技术 

    使用jsp(java server api)技术可以简单而快速地在wap终端上生成动态的wap页面,而且能够利用jsp的诸多功能,实现复杂的wap应用。我们仍以wml为例,讲解jsp技术在wap开发中的应用。

    2  基本规则

    使用jsp技术前,首先要建立它的开发环境。一般是在windows nt上安装并建立java server web development kit(jswdk),其版本可为1.01版或更高的版本。

    为了测试和浏览jsp实现的wap应用,还需要安装wap模拟器(浏览器),如nokia wap toolkit,并安装java runtime environment (jre) 1.2.2或以上版本。

    安装配置好tomcat

    完成以上准备工作之后,就可以按照以下的基本规则使用jsp编写wml程序了。

    (1) wml的标签和语句均可直接写在jsp程序中。

    (2) 如果想使用jsp来处理wml的标签和语句,则需要使用“<%”和“%>”引起来,格式为:

    <%

    ……(jsp编写的wml语句行);

    %>

    例如,以下几行语句就是利用jsp的out.println来输出wml的标签和语句:

    <%

             out.println("<p>");

                       out.println("hello from script code!<br/>");

             out.println("</p>");

    %>

    (3) jsp编写的wml语句要用引号(" ")引起来,然后再用括号括起来,而且后面还要加上分号( ; ),格式为:

    jsp对象.方法/关键字(" ……wml标签或语句行 ");

    例如,下面就是反映jsp书写wml语句格式的例子:

    out.println("hello from script code!<br/>");

    (4) wml的文件类型可以使用jsp的response对象进行声明,也可以在声明页面语言时一块儿声明,它们的格式分别如下:

    <% response.setcontenttype("text/vnd.wap.wml"); %>

    或 <%@ page language="java" contenttype="text/vnd.wap.wml" %>

    (5) 最后的程序文件保存时要采用“.jsp”的扩展名,即保存为jsp的程序文件。jsp将被编译成java源文件,最后成为servlet。

    了解了以上基本规则,我们下面给出一个利用jsp向wap浏览器显示“hello from script code!”信息的简单程序,通过该程序大家可以进一步认识利用jsp开发wml页面的具体方法。

    <?xml version="1.0"?>

    <!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/ wml_1.1.xml">

    <% response.setcontenttype("text/vnd.wap.wml"); %>

    <wml>

             <card id="start">

                       <do type="accept">

                                <go href="index.jsp#test"/>

                       </do>

                       <p>jsp test:<br/>

                                press accept to continue!<br/>

                       </p>

             </card>

             <card id="test">

                       <do type="prev">

                                <prev/>

                       </do>

             <%

                       out.println("<p>");

                                out.println("hello from script code!<br/>");

                       out.println("</p>");

             %>

             </card>

    </wml>

    3  程序举例

    我们下面利用jsp和wml实现一个为移动用户定时更新约会的例子。该例的应用程序共包括两个页面。第一个页面的文件是pick_appointment.jsp,它提供了一个选择卡片,当用户选择了其中某一个约会时间时,浏览器就会带着本次约会的id号进入到第二个页面,即文件名为show_appointment_data.jsp的页面。我们在第二个页面编写了两个卡片,其中第一个卡片用于显示会面的时间,第二个卡片用于显示数据输入,让用户通过输入id而取消约会。

    程序中动态的约会数据是通过java bean的实例来取得的,具体过程其实是通过jdbc连接到数据库的过程。取消约会的操作是通过servlet实现的。由于用户可能随时取消某个约会,所以我们需要对pick_appointment.jsp页面进行定时刷新。下面我们就给出这一应用程序的源程序。

    pick_appointment.jsp页面文件的程序代码如下:

    <%@ page language="java" contenttype="text/vnd.wap.wml" %>

    <jsp:usebean id="appointmentbean" class="mwebber.samples.appointmentbean" scope

    ="application" />

    <%!

    // 下面创建针对每次约会的选项<option>元素

    private string getoptions(mwebber.samples.appointmentbean appointmentbean) {

             stringbuffer sb = new stringbuffer();

             int[] appointmentids = appointmentbean.getappointmentids();

             for(int i=0; i<appointmentids.length; i++) {

                       sb.append("<option onpick="show_appointment_data.jsp?id=");

                       sb.append(i);

                       sb.append("">");

                       sb.append(appointmentbean.getappointmenttime(i));

                       sb.append("</option>");

             }

             return sb.tostring();

    }

    %>

    <%! string strxmlprologue = "<?xml version="1.0"?>"; %>

    <%-- wml内容开始 --%>

    <%= strxmlprologue %>

    <!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/ wml_1.1.xml">

    <wml>

             <card id="pick" title="appointments">

                       <!-- 每分钟刷新一次卡片组 -->

                       <onevent type="ontimer">

                                <go href="pick_appointment.jsp"/>

                       </onevent>

                       <timer value="600"/>

                       <!-- 回显卡片 -->

                       <do type="prev">

                                <prev/>

                       </do>

                       <!-- 为要选择约会而显示"select" -->

                       <p>

                                <select title="appointments">

                                         <%= getoptions(appointmentbean) %>

                                </select>

                       </p>

             </card>

    </wml>

    <%-- wml内容结束 --%>

    show_appointment_data.jsp页面文件的程序代码如下:

    <%@ page language="java" contenttype="text/vnd.wap.wml" %>

    <jsp:usebean id="appointmentbean" class="mwebber.samples.appointmentbean" scope="application" />

     <%

    // 使用request对象的方法获取"id"参数的值

    int intappointmentid = integer.parseint(request.getparameter("id"));

    %>

    <%! string strxmlprologue = "<?xml version="1.0"?>"; %>

    <p>

    <%-- wml内容开始 --%>

    <%= strxmlprologue %>

    <!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/ wml_1.1.xml">

    <wml>

             <card id="main_data" title="main data">

                       <p align="center">

                                <b>

                                         <%= appointmentbean.getappointmenttime(intappointmentid) %>

                                </b>

                       </p>

                       <p>

                                <br/>

                                         <%= appointmentbean.getappointmentdetails(intappointmentid) %>

                                <br/>

                                <a href="#check_off">check off this appointment</a><br/>

                                <a href="http://localhost:8080/pick_appointment.jsp">back to appointments list</a>

                       </p>

             </card>

              <card id="check_off" title="check off">

                       <!--设置向服务器发送输入数据的选择项 -->

                       <do type="accept">

                                <go href="/servlet/processcheckoff" method="post">

                                         <postfield name="check_off_code" value="$check_off_code"/>

                                </go>

                       </do>

                       <p>

                                <input name="check_off_code" emptyok="false" maxlength="6"/>

                       </p>

                       <p>

                                <a href="#main_data">back to appointment data</a>

                   &nbsp;            <br/>

                                <a href="http://localhost:8080/pick_appointment.jsp">back to appointments list</a>

                       </p>

             </card>

    </wml>

    <%-- wml内容结束 --%>

    结束语

    WAP2.0将世界上最新的标准和技术集成在一个移动环境中,提供了更多的移动业务和应用,是一个具有更丰富移动体验的平台:在WAP2.0的支持下,设备制造商有机会开发支持经过优化的具有WAP2.0特征的WAP应用的手机设备,这些WAP2.0的特征包括彩色显示、多媒体信息、大文件下载以及改善的导航功能、优化的用户界面等。而网络运营商将会在支持WAP的这些新业务中受益。可以相信,WAP2.0的推出必定会推动移动互联网的发展。

  • 相关阅读:
    『华为』[行业要闻]华为,我们的光环还能顶多久(转)
    总结几点Quartz的经验
    LVS
    postfix邮件服务器安全
    让IE浏览器支持RGBA颜色
    PostgreSQL在何处处理 sql查询之六十四
    PostgreSQL在何处处理 sql查询之六十三
    PostgreSQL在何处处理 sql查询之六十五
    对PostgreSQL的prepared statement 的理解
    PostgreSQL在何处处理 sql查询之六十六
  • 原文地址:https://www.cnblogs.com/tuyile006/p/3728191.html
Copyright © 2011-2022 走看看