构建多服务的 Java 应用程序,第 1 部分: 探索 WURFL(4)

4 篇文章 0 订阅

WURFL 的 Java API

Java API 中的类

WURFL 的 Java API 包含几个类,这些类可以帮助您轻松使用 WURFL 功能。图 5 显示了 WURFL 应用程序中的 WURFL 类。


图 5. WURFL 的 Java API 中的类与一个 WURFL 应用程序
图 5. WURFL 的 Java API 中的类与一个 WURFL 应用程序

注意,WURFL 的 Java API 由以下四个类组成:WurflObjectsManagerUAManagerCapabilityMatrix。WURFL 应用程序使用 ObjectsManagerUAManagerCapabilityMatrix 了解设备的功能。这三个 WURFL 类反过来使用 Wurfl 类的功能,它包含 wurfl.xml 文件,并公开其他三个 WURFL 类将使用的方法。

本节首先介绍 Wurfl 类的功能,然后介绍其他 WURFL 类(也就是 ObjectsManagerUAManagerCapabilityMatrix)如何使用 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 对象。UAManagerCapabilityMatrix 类都提供易于使用的 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() 方法。 CapabilityMatrixWurfl 类的方法之前的惟一差别是 CapabilityMatrix 类缓存以前搜索的功能数据。因此,CapabilityMatrix 类的方法比 Wurfl 方法更高效。

下一节介绍如何使用 ObjectsManagerUAManagerCapabilityMatrix 了解设备的功能。

 




回页首

 

使用 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 类执行以下步骤使用 ObjectsManagerUAManagerCapablityMatrix 类:

  1. 首先,CapabilityTestermain() 方法从名为 HTTPRequest.txt 的文件中读取 HTTP 请求。 可以对 CapabilityTester 使用任何请求。
  2. 然后,main() 方法实例化 CapabilityTester 类,将 HTTP 请求传递给 CapabilityTester 构造函数。
  3. CapabilityTester 构造函数调用 ObjectsManager.getUAManager() 方法,该方法返回 UAManager 实例。
  4. 为了实例化 Wurfl 对象,getUAManager() 方法在内部查找 wurfl.properties 文件并且从属性文件中读取 wurfl.xml 文件的路径。然后将这个路径传递给 Wurfl 构造函数。
  5. 最后,getUAManager() 方法实例化 UAManager 对象,将 Wurfl 对象传递给 UAManager 构造函数。
  6. 现在,CapabilityTester 构造函数调用 UAManager 类的 getDeviceIDFromUALoose() 方法。将第一步中的 HTTP 请求传递给 getDeviceIDFromUALoose() 方法,该方法内部使用 Wurfl 对象执行以下任务:
    1. 解析 HTTP 请求以从 HTTP 请求中提取 user-agent 字符串。
    2. 使用 Wurfl 对象获取发送 HTTP 请求的设备的 ID。
  7. 现在,CapabilityTester 构造函数调用 ObjectsManager 类的 getCapabilityMatrixInstance() 方法,以获取 CapabilityMatrix 类的实例。
  8. CapabilityTester 构造函数调用 CapabilityMatrix 对象的 getCapabilityForDevice() 方法以了解在第 4 步中获得其 ID 的设备的重要功能。在此步中探讨的设备功能包括在前面的 定义设备功能 一节中的 preferred_markup 功能。清单 9 还包括一些其他功能:
    1. xhtml_supports_table_for_layout:指定设备是否能够使用 XHTML 表来控制用户界面组件的布局。
    2. xhtml_supports_css_cell_table_coloring:确保设备可以使用颜色来显示表。
    3. access_key_support:告诉设备是否允许网页中的用户界面组件(如链接、选择列表等)访问无线设备的数字小键盘。

最后讨论使用 WURFL 类查找设备功能。您已经具备了所有基础知识,接下来将了解 WALL 标记库(已在前面的 如何使用 WURFL 一节中介绍)如何使用这些类进行多服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值