探索和处理 WURFL
wurfl.xml 文件只包含一个 <devices>
标记,该标记中包含大量的 <device>
标记。每个 <device>
标记都代表一个无线设备。清单 6 显示了 <devices>
标记的一种简化形式。
清单 6. 包含大量 <device> 标记的 <devices> 标记
<devices> <device id="generic" user_agent="" fall_back="root"> <group id="markup"> <capability name="preferred_markup" value="wml_1_1"/> <capability name="wml_1_1" value="true"/> </group> <group id="wml_ui"> <!--Device capabilities--> </group> <group id="xhtml_ui"> <!--Device capabilities--> </group> <group id="chtml_ui"> <!--Device capabilities--> </group> <!--Other groups of capabilities--> </device> <device id="nokia_generic" user_agent="Nokia" fall_back="generic"> <!--Groups of device capabilities--> </device> <device id="nokia_3300_ver1_sub425" user_agent="Nokia3300/1.0 (4.25) Profile/MIDP-1.0 Configuration/CLDC-1.0" fall_back="nokia_3300_ver1"/> <!--Groups of device capabilities--> </device> <!--Other devices--> </devices> |
注意,每个 <device>
标记都有三个属性 —— id
、user_agent
和 fall_back
—— 以及很多 <group>
标记。id
属性只定义设备的标识符(或 ID)。user_agent
属性包含一个 user-agent 字符串,该字符串将包含在设备向 Web 应用程序发送的 HTTP 请求中。WALL 使用该字符串标识请求客户机。例如,清单 7 显示 Nokia 3300 设备的 HTTP 请求。
GET /MultiServeRestaurantMenu/multiServeMenuCategories.jsp HTTP/1.0
User-Agent: Nokia3300/1.0 (4.25) Profile/MIDP-1.0 Configuration/CLDC-1.0
Host: localhost:8080
Accept: text/vnd.wap.wml, image/vnd.wap.wbmp,
application/vnd.wap.wmlc, application/vnd.wap.wmlscriptc
|
可以看到,Nokia3300/1.0 (4.25) Profile/MIDP-1.0 Configuration/CLDC-1.0
字符串包含在 HTTP 请求的 User-Agent
参数中。这个字符串构成了 清单 6 中第三个 <device>
标记的 user_agent
属性的值。
WURFL 处理应用程序(例如之前看到的 multiServeMenuCategories.jsp 页面)将通过以下步骤确定哪个无线设备正在发送 HTTP 请求:
- 查看
User-Agent
参数。 - 在 wurfl.xml 文件中查找
user_agent
属性值相匹配的<device>
标记。
WURFL 随附的 Java API 提供了这种处理 HTTP 请求、检查 wurfl.xml 文件了解设备功能的能力。WURFL 的 Java API 一节介绍 Java API 的工作方式以及如何在多服务应用程序中使用它,在此我们首先讨论 清单 6 中 <device>
标记的 第三个属性(fall_back
)的作用和用法。
|
WURFL 设计了一种机制,可以定义一般设备,再使用一般设备描述来指定实际设备功能。这种机制使用 fall_back
属性工作。
清单 6 中的第一个设备标记(它的 id
属性值为 generic
)表示最一般的设备。 清单 6 中第二个 <device>
标记的 fall_back
属性值为 generic
。这意味着第二个 <device>
标记使用(或专门处理)一般设备的设备描述。
还要注意,清单 6 中第二个 <device>
标记的 id
属性值为 nokia_generic
。这意味着第二个 <device>
标记是所有 Nokia 设备的最一般形式。实际的 Nokia 设备使用通用 Nokia 设备的设备描述。当设备在 wurfl.xml 文件中指定一般设备时,只需要描述它自己具备但在一般设备中缺少或与采用一般形式定义的功能不同的功能即可。
因此,需要跟随 wurfl.xml 文件中的 “返回路径” 以了解设备的功能。为了跟随返回路径,可以读取 fall_back
属性值,然后查找具有匹配 ID 的 <device>
标记,以便找到更为一般的设备描述。处理 wurfl.xml 文件 一节将详细介绍返回路径。
现在,让我们看看 WURFL 如何使用 <device>
标记描述无线设备的功能。
|
WURFL 使用 <group>
标记将设备的相关功能组合到一起。例如,可以在 清单 6 中找到 <group>
标记,它的 id
属性值为 markup
。
<group>
标记中的每个功能都由 <capability>
标记表示。<group>
标记可以包含很多 <capability>
标记。
WURFL 将设备功能定义为名称/值对。每个 <capability>
标记都具有 name
属性,它的值定义设备的功能。例如,清单 6 包含一个 <capability>
标记,它的 name 属性为 preferred_markup
。这个 <capability>
标记指定无线设备的首选标记。
<capability>
标记还具有 value
属性,它指定功能的值。例如,清单 6 中一般设备的 preferred_markup
功能的值为 wml_1_1
,这意味着通用设备使用 WML 1.1 作为它的首选标记。
|
WURFL 定义了几组设备功能,其中最重要的功能组与标记和用户界面有关。清单 8 包含三个这样的 <group>
标记。
<group id="markup"> <capability name="preferred_markup" value="wml_1_1"/> <capability name="wml_1_1" value="true"/> <capability name="wml_1_2" value="false"/> <capability name="wml_1_3" value="false"/> <capability name="html_wi_w3_xhtmlbasic" value="false"/> <capability name="html_wi_oma_xhtmlmp_1_0" value="false"/> <!--Other markup capabilities--> </group> <group id="wml_ui"> <capability name="menu_with_select_element_recommended" value="false"/> <capability name="card_title_support" value="true"/> <capability name="access_key_support" value="false"/> <capability name="table_support" value="true"/> <capability name="numbered_menus" value="false"/> <capability name="menu_with_list_of_links_recommended" value="true"/> <!--Other wml_ui capabilities--> </group> <group id="xhtml_ui"> <capability name="xhtml_supports_css_cell_table_coloring" value="false"/> <capability name="xhtml_supports_forms_in_table" value="false"/> <capability name="xhtml_honors_bgcolor" value="false"/> <capability name="xhtml_select_as_dropdown" value="false"/> <capability name="xhtml_table_support" value="false"/> <!--Other xhtml_ui capabilities--> </group> |
注意,每个 <group>
标记都具有 id
属性,它标识组。例如,清单 8 中 id
为 markup
的组包含所有与标记相关的功能。同样,id
为 wml_ui
的组包含设备的所有功能,这些功能与 WML 中表示用户界面的组件相关。例如,名为 menu_with_select_element_recommended
的功能指定是否建议使用 <select>
标记在 WML 无线设备的屏幕上显示菜单项。
id
为 xhtml_ui
的组包含 XHTML 用户界面功能。例如,名为 xhtml_supports_css_cell_table_coloring
的功能指定是否可以使用颜色在 XHTML 无线设备的屏幕上显示表单元格。
上面已经介绍了 WURFL 如何使用 <devices>
、<device>
、<group>
和 <capability>
标记以及它们的属性指定无线设备的功能。下一节介绍如何跟随返回路径并且处理 wurfl.xml 文件,以了解有关设备功能的信息。
|
假设您想使用 wurfl.xml 文件来了解是否建议为特定请求客户机设备使用 WML <select>
标记。为此,您需要的一切就是客户机设备的 HTTP 请求和 wurfl.xml 文件。如果有了这些内容,就可以执行以下步骤来了解请求客户机的功能:
- 从 HTTP 请求中读取 user-agent 字符串。
- 在
user_agent
属性与 user-agent 字符串匹配的 wurfl.xml 文件中查找<device>
标记。 - 在第 2 步的
<device>
标记中查找wml_ui
功能组。 - 检查设备的功能组中是否存在一个名为
menu_with_select_element_recommended
的功能。如果存在,则读取这个功能的值。已经发现了所要查找的内容,则不再需要进一步处理。 - 如果这个功能不存在,则跟随返回路径。查找
id
属性与第 2 步的<device>
标记的fall_back
属性相匹配的<device>
标记。 - 使用第 5 步的
<device>
标记重复第 3 步到第 5 步。继续重复,直到找到menu_with_select_element_recommended
功能或者达到最一般的<device>
标记为止。
这里的工作量非常大,上面列出的 6 个步骤只是为您展示了 WURFL 的工作方式。但 WURFL 的 Java API 会为您处理所有这些难题,因此您将不再需要亲自处理 wurfl.xml 文件。
下一节介绍 WURFL 的 Java API 的工作方式。