您的位置:首页 > 编程语言 > Java开发

构建多服务的 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
ObjectsManager
UAManager
CapabilityMatrix
。WURFL 应用程序使用
ObjectsManager
UAManager
CapabilityMatrix
了解设备的功能。这三个 WURFL 类反过来使用
Wurfl
类的功能,它包含 wurfl.xml 文件,并公开其他三个 WURFL 类将使用的方法。

本节首先介绍
Wurfl
类的功能,然后介绍其他 WURFL 类(也就是
ObjectsManager
UAManager
CapabilityMatrix
)如何使用
Wurfl
类进行多服务。最后介绍 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 类的方法

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 类

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 和 CapabilityMatrix 类

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
了解设备的功能。








回页首
使用 WURFL 的 Java API 了解设备的功能

清单 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 一节中介绍)如何使用这些类进行多服务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: