技术开发 频道

精通 Grails: Grails 与移动 Web

  结合使用 WML 1.x 和 Grails

  WML 是一种类似于 HTML 的标记语言,但它并不是真正的 HTML(WML 1.0 于 1998 年标准化。WML 1.3 为最新版本)。WML 并无法在 Web 浏览器中查看(至少不借助于仿真器是不行的),同样您也无法在 WML 浏览器中查看 HTML。手机供应商通常都会提供在后台实现 HTML 与 WML 之间相互转换的网关。

  WML 通过无线访问协议(Wireless Access Protocol,WAP)传输,这和 HTML 通过 HTTP 传输很相似。WAP 和 WML 在临时对话中通常可以相互转换:手机说明书总是会夸耀该手机带有 WAP 浏览器,或者支持 WML 1.x(参阅 参考资料 获得 WML 和 WAP 规范的官方链接)。

  如果您针对的是 Research in Motion 的 BlackBerry 用户的话,就得提高关于 WML 的知识了。(BlackBerry 大约占了智能手机市场的 40%,iPhones 和 Windows® Mobile 居于第二和第三位)。虽然很多技术过硬的用户也可以下载真正的 Web 浏览器,比如 Opera Mini(参见 参考资料),但是 BlackBerry 智能手机还是配备了 WAP 浏览器。

  继续设计旅行计划

  如果您一直都在关注 精通 Grails 系列文章的话,那么您可以修改已经熟悉的旅行计划应用程序,使它便于在手机上浏览。在旅行计划应用程序的 web-app 目录中创建一个文件,命名为 testwml.gsp,并输入清单 1 中的静态 WML:

  清单 1. 静态 WML

<% response.setContentType("text/vnd.wap.wml") %>
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN"
  
"http://www.phone.com/dtd/wml11.dtd" >

<wml>
  
<card id="f1" title="Flight 1">
    
<p mode="wrap">From: DEN</p>
    
<p mode="wrap">To: ORD</p>
    
<p mode="wrap">UAL 1234</p>
    
<p mode="wrap">Jun 30, 10:30am</p>
    
<p>
      
<anchor>Next<go href="#f2"/></anchor>
    
</p>  
  
</card>

  
<card id="f2" title="Flight 2">
    
<p mode="wrap">From: ORD</p>
    
<p mode="wrap">To: DEN</p>
    
<p mode="wrap">UAL 9876</p>
    
<p mode="wrap">Jul 02, 1:15pm</p>
    
<p>
      
<anchor>Previous<go href="#f1"/></anchor>
    
</p>  
  
</card>
</wml>

  您用手机访问 http://www.davisworld.org/testwml.gsp 同样可以看到这个页面。您可能习惯于在 GSP 中查看 HTML。但在这里使用的是 WML。

  当从 GSP 中发送出 WML 时,切记要将默认的 MIME 类型 text/html 替换为 text/vnd.wap.wml,如清单 1 中的第一行所示。如果直接提供静态 WML,那么只需赋予文件一个 WML 扩展名,而不是 GSP 扩展名。大多数 Web 服务器会在这之后自动返回一个正确的 MIME 类型,无需调用 response.setContentType。在 $TOMCAT_HOME/conf/web.xml 中,您会发现 MIME 针对 WML 文件的映射已经就位。如果您使用的是 Apache HTTPD 的话,那么您可以在 $APACHE_HOME/conf/mime.types 文件中找到类似的 WML 文件的映射。清单 2 向展示了 Tomcat 的 MIME 类型映射:

  清单 2. 在 Tomcat 中设置 MIME 类型

<mime-mapping>
  
<!-- WML Source -->
  
<extension>wml</extension>
  
<mime-type>text/vnd.wap.wml</mime-type>
</mime-mapping>

  回过头来在看一下 清单 1,接下来需要注意的是 DOCTYPE。包含文档类型定义(Document Type Definition,DTD)语句可以帮助将 WML 文档识别为 testwml.gsp。

  注意该文件并未打包在常见的 标记中。它的开头和结尾为 。您可能还注意到 清单 1 中缺少 和 部分。每一个 WML 页面为一个 card,拥有一个独立的 id 属性和便于用户使用的 title 属性。

  通常情况下,在一个单一文件中可以下载多个页面/卡片。早期的手机的数据通道非常狭窄,而这种方法刚好就缓和了这些设备及其网络的局限性。一次下载得越多,手机与服务器之间的数据转就越少。因为一次只能查看一个页面,这样就可以有效地提前获取其余的页面。对于这种情况,导航只发生在客户端。

  HTML 开发人员一定要熟悉标记。WML 标记在本质上与 HTML 标记是类似的,即使它们在语法上有所不同(参阅 参考资料 了解更多关于 WML 的信息)。

  下面是 WML 的一个小技巧。由于处理的是专用于手机的内容,因此可以创建一个超链接,用户一旦选定链接,就可以拨出电话。清单 3 的中例子可以拨出电话号码 303-555-1212 :

  清单 3. WML 拨号链接

<do type="accept">
<go href="wtai://wp/mc;3035551212"/>
</do>

  注意该链接使用的协议并非常见的 http:// — 而是 wtai://,这是无线电话应用程序界面(Wireless Telephony Applications Interface)的缩写。

0
相关文章