构建多服务的 Java 应用程序,第 1 部分: 探索 WURFL(4)
2009-06-17 15:28
387 查看
WURFL 的 Java API
Java API 中的类
WURFL 的 Java API 包含几个类,这些类可以帮助您轻松使用 WURFL 功能。图 5 显示了 WURFL 应用程序中的 WURFL 类。
图 5. WURFL 的 Java API 中的类与一个 WURFL 应用程序
注意,WURFL 的 Java API 由以下四个类组成:
本节首先介绍
Wurfl 类
具有一个参数的
另一个
另一个
所有这些构造函数都提供相同的服务,即它们打开 wurfl.xml 文件(以及补丁文件,如果可用的话)、解析它的内容(设备、返回路径、组以及功能)、将内容加载到内部变量中以及准备
现在,让我们讨论一下
Wurfl 类的方法
WURFL 的 Java API 中的其他类使用这些
ObjectsManager 类
在 使用 WURFL 的 Java API 了解设备的功能 一节中使用 wurfl.properties 文件。
同样,
UAManager 和 CapabilityMatrix 类
在服务器端应用程序中使用
下一节介绍如何使用
使用 WURFL 的 Java API 了解设备的功能
清单 9 显示名为
清单 9. CapabilityTester 类
注意,
首先,
然后,
为了实例化
最后,
现在,
解析 HTTP 请求以从 HTTP 请求中提取 user-agent 字符串。
使用
现在,
最后讨论使用 WURFL 类查找设备功能。您已经具备了所有基础知识,接下来将了解 WALL 标记库(已在前面的 如何使用 WURFL 一节中介绍)如何使用这些类进行多服务。
Java API 中的类
WURFL 的 Java API 包含几个类,这些类可以帮助您轻松使用 WURFL 功能。图 5 显示了 WURFL 应用程序中的 WURFL 类。
图 5. WURFL 的 Java API 中的类与一个 WURFL 应用程序
注意,WURFL 的 Java API 由以下四个类组成:
Wurfl、
ObjectsManager、
UAManager和
CapabilityMatrix。WURFL 应用程序使用
ObjectsManager、
UAManager和
CapabilityMatrix了解设备的功能。这三个 WURFL 类反过来使用
Wurfl类的功能,它包含 wurfl.xml 文件,并公开其他三个 WURFL 类将使用的方法。
本节首先介绍
Wurfl类的功能,然后介绍其他 WURFL 类(也就是
ObjectsManager、
UAManager和
CapabilityMatrix)如何使用
Wurfl类进行多服务。最后介绍 WURFL 应用程序如何使用 WURFL 类。
|
Wurfl类具有几个构造函数,所有构造函数都是受保护的,因此不能直接实例化
Wurfl类。但可以使用
ObjectsManager类实例化
Wurfl对象。 ObjectsManager 类 一节介绍
Wurfl对象的实例化。
具有一个参数的
Wurfl构造函数将 wurfl.xml 文件的路径作为参数。它解析 wurfl.xml 文件的内容,并且准备好服务于特定设备功能的请求。
另一个
Wurfl构造函数采用两个字符串类型的参数。第一个参数指定 wurfl.xml 文件的路径,第二个参数指定另一个称为补丁文件的文件的路径。WURFL 利用这个补丁文件允许应用程序更新设备描述,由于具有改良功能的新无线设备不断涌现,因此这种更新非常重要。可以使用 WURFL 补丁文件使设备描述保持最新。
另一个
Wurfl构造函数将两个
File对象作为参数。第一个
File对象保存 wurfl.xml file 文件,第二个
File对象保存补丁文件。
所有这些构造函数都提供相同的服务,即它们打开 wurfl.xml 文件(以及补丁文件,如果可用的话)、解析它的内容(设备、返回路径、组以及功能)、将内容加载到内部变量中以及准备
Wurfl对象以提供有关特定设备功能的信息。
现在,让我们讨论一下
Wurfl类中的重要方法。
|
WURFL 的 Java API 中的其他类使用这些
Wurfl类方法来了解设备功能:
isCapabilityDefinedInDevice()
getCapabilityValueForDeviceAndCapability()
getDeviceIDFromUA()
getDeviceIDFromUALoose()
isCapabilityDefinedInDevice()方法检查设备的功能并且接受两个字符串类型的参数。第一个参数是要检查其功能的设备的标识符(或者简写为 ID)。第二个参数指定要检查的功能的名称。
isCapabilityDefinedInDevice()方法只有在这个功能是为特定设备定义的情况下才返回
true;否则返回
false。
getCapabilityValueForDeviceAndCapability()方法同样接受两个参数,并且返回设备功能的值。该方法搜索整个返回路径以查找设备功能的值。
getDeviceIDFromUA()方法采用 user-agent 字符串(如 清单 7 中的
Nokia3300/1.0 (4.25) Profile/MIDP-1.0 Configuration/CLDC-1.0), 并且返回使用这个 user-agent 字符串的设备的标识符。如果想使用
getDeviceIDFromUA()方法,则必须首先从 HTTP 请求(如在 清单 7 中看到的 HTTP 请求)中提取 user-agent 字符串。
getDeviceIDFromUALoose()方法会自行完成此类额外的处理。您可以将完整的 HTTP 请求传递给
getDeviceIDFromUALoose()方法,该方法将在内部处理 HTTP 请求、从 HTTP 请求中提取 user-agent 字符串并且告诉您发送这个 HTTP 请求的设备的 ID。
|
ObjectsManager类包含
Wurfl类的功能并且提供几个有用的静态方法。例如,
ObjectsManager具有一个名为
getWurflInstance()的方法,该方法不接受任何参数,并返回
Wurfl类的一个实例。为了实例化
Wurfl对象,
getWurflInstance()方法需要知道查找 wurfl.xml 文件的位置。
getWurflInstance()方法首先在当前目录中打开 wurfl.properties 文件。该文件在名为
wurflpath的属性中包含 wurfl.xml 文件的路径。然后
getWurflInstance()方法使用 wurfl.xml 文件的路径实例化
Wurfl对象。
在 使用 WURFL 的 Java API 了解设备的功能 一节中使用 wurfl.properties 文件。
ObjectsManager类还提供名为
getUAManagerInstance()的静态方法,该方法实例化并返回
UAManager对象。在实例化
UAManager对象之前,
getUAManagerInstance()方法首先检查是否存在
Wurfl类的实例。如果不存在,则实例化
Wurfl对象(如讨论
getWurflInstance()方法时的说明),并将
Wurfl对象放置到
UAManager对象中。
UAManager对象充当
Wurfl对象的一个非常有用的包装器。
同样,
ObjectsManager类具有另一个名为
getCapabilityMatrixInstance()的方法,该方法返回
CapabilityMatrix对象。
CapabilityMatrix还包含
Wurfl对象。
UAManager和
CapabilityMatrix类都提供易于使用的
Wurfl功能,将在下一节中介绍这些功能。
|
UAManager类具有两个方法:
getDeviceIDFromUA()和
getDeviceIDFromUALoose()。在前面的 Wurfl 类的方法 一节的
Wurfl类中也具有同样两个方法。
UAManager类的方法内部使用
Wurfl类的各个方法,因此提供相同的功能。
在服务器端应用程序中使用
UAManager类的主要优势在于:它会 “记住” 应用程序之前搜索的 user-agent 和设备 ID 字符串。当
UAManager收到设备 ID 请求时,它首先检查它自己的缓存,查明缓存中是否已经存在所需的 ID。如果找到了这个 ID,则直接返回 ID,而不检查
Wurfl类。
UAManager只有在未在其缓存中找到所需设备 ID 时才调用
Wurfl方法。因此,
UAManager类的方法比
Wurfl类的方法运行效率更高。这在服务器端应用程序中是非常有用的,在服务器端应用程序中您可以对相同设备标识符进行重复请求。
CapabilityMatrix类提供一些方法,这些方法可以在内部使用
Wurfl类的方法来提供与检查设备功能有关的能力。
CapabilityMatrix类的重要方法包括
isCapabilityDefinedInDevice()和
getCapabilityForDevice()。这两个方法类似于在前面的 Wurfl 类的方法 一节中看到的
isCapabilityDefinedInDevice()和
getCapabilityValueForDeviceAndCapability()方法。
CapabilityMatrix和
Wurfl类的方法之前的惟一差别是
CapabilityMatrix类缓存以前搜索的功能数据。因此,
CapabilityMatrix类的方法比
Wurfl方法更高效。
下一节介绍如何使用
ObjectsManager、
UAManager和
CapabilityMatrix了解设备的功能。
|
清单 9 显示名为
CapabilityTester的 Java 应用程序,该程序使用 WURFL 的 Java API 的类查找和打印无线设备的几个重要功能的值。
清单 9. CapabilityTester 类
public class CapabilityTester { public static void main (String[] args) { /*** Step 1 ***/ String httpRequestString = readWirelessDeviceHTTRequest(args[0]); /*** Step 2 ***/ CapabilityTester capabilityTester = new CapabilityTester(httpRequestString); }//main public CapabilityTester (String httpRequest) { /*** Step 3 ***/ UAManager uaManager = ObjectsManager.getUAManagerInstance(); /*** Step 4 ***/ String device_id = uaManager.getDeviceIDFromUALoose(httpRequest); /*** Step 5 ***/ CapabilityMatrix capabilityMatrix = ObjectsManager.getCapabilityMatrixInstance(); /*** Step 6 ***/ String markup = capabilityMatrix.getCapabilityForDevice( device_id, "preferred_markup"); String access_key_support = capabilityMatrix.getCapabilityForDevice( device_id, "access_key_support"); String table_support = capabilityMatrix.getCapabilityForDevice( device_id, "xhtml_supports_table_for_layout"); String css_cell_support = capabilityMatrix.getCapabilityForDevice( device_id, "xhtml_supports_css_cell_table_coloring"); String menu_with_select_element_support = capabilityMatrix.getCapabilityForDevice( device_id, "menu_with_select_element_recommended"); System.out.println ("/nDevice ID : "+device_id); System.out.println ("preferred_markup : "+markup); System.out.println ("access_key_support : "+access_key_support); System.out.println ("menu_with_select_element_recommended: "+ menu_with_select_element_support); System.out.println ("xhtml_supports_table_for_layout : "+table_support); System.out.println ("xhtml_supports_css_cell_table_coloring: "+css_cell_support); }//CapabilityTester private static String readWirelessDeviceHTTRequest (String requestFilePath) { try { FileInputStream fileStream = new FileInputStream (requestFilePath); if (fileStream != null) { int length = 0; byte data[] = new byte [fileStream.available()]; fileStream.read(data); return new String (data); } } catch (java.io.IOException ie){ ie.printStackTrace(); } return null; }//readWirelessDeviceHTTRequest }//CapabilityTester |
CapabilityTester类执行以下步骤使用
ObjectsManager、
UAManager和
CapablityMatrix类:
首先,
CapabilityTester的
main()方法从名为 HTTPRequest.txt 的文件中读取 HTTP 请求。 可以对
CapabilityTester使用任何请求。
然后,
main()方法实例化
CapabilityTester类,将 HTTP 请求传递给
CapabilityTester构造函数。
CapabilityTester构造函数调用
ObjectsManager.getUAManager()方法,该方法返回
UAManager实例。
为了实例化
Wurfl对象,
getUAManager()方法在内部查找 wurfl.properties 文件并且从属性文件中读取 wurfl.xml 文件的路径。然后将这个路径传递给
Wurfl构造函数。
最后,
getUAManager()方法实例化
UAManager对象,将
Wurfl对象传递给
UAManager构造函数。
现在,
CapabilityTester构造函数调用
UAManager类的
getDeviceIDFromUALoose()方法。将第一步中的 HTTP 请求传递给
getDeviceIDFromUALoose()方法,该方法内部使用
Wurfl对象执行以下任务:
解析 HTTP 请求以从 HTTP 请求中提取 user-agent 字符串。
使用
Wurfl对象获取发送 HTTP 请求的设备的 ID。
现在,
CapabilityTester构造函数调用
ObjectsManager类的
getCapabilityMatrixInstance()方法,以获取
CapabilityMatrix类的实例。
CapabilityTester构造函数调用
CapabilityMatrix对象的
getCapabilityForDevice()方法以了解在第 4 步中获得其 ID 的设备的重要功能。在此步中探讨的设备功能包括在前面的 定义设备功能 一节中的
preferred_markup功能。清单 9 还包括一些其他功能:
xhtml_supports_table_for_layout:指定设备是否能够使用 XHTML 表来控制用户界面组件的布局。
xhtml_supports_css_cell_table_coloring:确保设备可以使用颜色来显示表。
access_key_support:告诉设备是否允许网页中的用户界面组件(如链接、选择列表等)访问无线设备的数字小键盘。
最后讨论使用 WURFL 类查找设备功能。您已经具备了所有基础知识,接下来将了解 WALL 标记库(已在前面的 如何使用 WURFL 一节中介绍)如何使用这些类进行多服务。
相关文章推荐
- 构建多服务的 Java 应用程序,第 1 部分: 探索 WURFL
- 构建多服务的 Java 应用程序,第 1 部分: 探索 WURFL
- 构建多服务的 Java 应用程序,第 1 部分: 探索 WURFL ( 3)
- 使用开放源代码框架的 Java 应用程序的 Web 服务集成模式,第 1 部分: 实现调用模式
- IBM WebSphere sMash 简介,第 1 部分: 为 Web 应用程序构建 RESTful 服务
- 使用开放源代码框架的 Java 应用程序的 Web 服务集成模式,第 2 部分: 实现接收模式
- Project Zero 简介,第 1 部分: 为 Web 应用程序构建 RESTful 服务
- Java Web 服务,第 2 部分: 深度探索 Axis2:AXIOM
- Java Web 服务,第 2 部分: 深度探索 Axis2:AXIOM
- JavaServer Faces 1.2 入门,第 1 部分: 构建基本应用程序
- 将java 应用程序打包成linux下的服务
- 使用 Java 认证和授权服务(JAAS)来定制应用程序登录
- 用 JAX-RPC 构建 RPC 服务和客户机(使用 Java API 构建基于 RPC 的 Web 服务)
- 构建插件式的应用程序框架(四)----服务容器
- 构建插件式的应用程序框架(七)----基本服务
- 用Jersey构建RESTful服务-JAVA对象转成XML/Json输出
- norbert-构建服务器集群感知的 Java 应用程序
- 在Lotus Domino中使用Java构建应用程序
- James+Javamail构建邮件服务(二)
- Ajax技术:构建动态的Java应用程序二