47、Java Web Start与XML - RPC技术详解

Java Web Start与XML - RPC技术详解

1. Java Web Start技术介绍

Java Web Start是一项用于部署Java程序的创新技术,它模糊了应用程序和小程序之间的界限,用户可以通过Web浏览器、桌面图标或菜单命令来运行应用程序,而无需运行安装程序来设置Java应用程序和执行类的解释器。只要用户的浏览器配备了Java 2运行时环境,Web Start就能自动处理这些事情。

1.1 JNLP支持

Java Web Start的支持是通过Java网络启动协议(JNLP)实现的,这是一种用于定义和设置Java Web Start的XML文件格式。即使你不熟悉XML,通过扩展现有的JNLP文件示例,也应该能够将自己的应用程序转换为从万维网启动。

1.2 Q&A示例

  • 问题 :我编写了一个小程序,想使用Java Web Start使其可用。我应该将其转换为应用程序还是直接运行?
  • 答案 :如果只是为了使用Web Start而将程序转换为应用程序,可能没有必要。 <applet - desc> 标签的目的是使小程序可以在Java Web Start中无需修改即可运行。进行转换的唯一原因是你想对程序进行其他更改,例如从 init() 方法切换到构造方法。

1.3 测验

以下是关于Java Web Start的三个问题及答案:
| 问题 | 选项 | 答案 |
| ---- | ---- | ---- |
| 以下哪项不是Java Web Start的功能? | a. 通过点击网页上的链接运行应用程序
b. 通过点击网页上的链接运行小程序
c. 在网页的其他内容中运行小程序 | c. Java Web Start在自己的窗口中运行小程序,不显示网页。 |
| 哪个XML元素用于标识Java Web Start运行的应用程序的名称、作者和其他详细信息? | a. jnlp
b. information
c. resources | b. 应用程序的描述元素包含在 <information> 开始标签和 </information> 结束标签内。 |
| 如果你希望Web Start使用Java 2版本1.4来运行应用程序,应该使用以下哪个元素? | a. <j2se version="1.4">
b. <j2se version="1.3+">
c. <version>1.4</version> | a. 应用程序将始终使用Java 2版本1.4解释器,即使后续版本(如1.5或1.6)已经发布。 |

1.4 认证练习

以下代码:

import java.awt.*;
import javax.swing.*;
public class SliderFrame extends JFrame {
    public SliderFrame() {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container pane = getContentPane();
        JSlider value = new JSlider(0, 255, 100);
        setContentPane(pane);
        setSize(325, 150);
        setVisible(true);
    }
    public static void main(String[] arguments) {
        new SliderFrame();
    }
}

当尝试编译和运行此源代码时会发生什么?选项如下:
a. 编译无错误并正确运行。
b. 编译无错误但框架中不显示任何内容。
c. 由于内容面板为空而无法编译。
d. 由于 new AskFrame() 语句而无法编译。
答案可在相关网站上找到。

1.5 练习

  • 创建一个新的JNLP文件,使用Java解释器版本1.3运行PageData应用程序,并强制用户在运行时连接到Internet。
  • 创建一个新的JNLP文件来运行MidiApplet小程序。

2. XML - RPC技术介绍

多年来,人们一直在尝试创建远程过程调用(RPC)的标准协议,使一个计算机程序能够通过网络(如Internet)调用另一个程序中的过程。目前,Web服务正推动着RPC的发展,Web服务用于在站点之间共享密码认证信息、促进商店之间的电子商务交易、进行企业对企业的信息交换等。

2.1 XML - RPC的发展

1998年,XML - RPC技术被引入,它是一种使用HTTP和XML进行远程过程调用的协议。它由UserLand Software的Dave Winer发布规范,并与微软合作开发。XML - RPC结合了HTTP和XML来交换信息,支持以下数据类型:
- base64:Base 64格式的二进制数据
- boolean:布尔值(1表示真,0表示假)
- dateTime.iso8601:包含ISO8601格式日期和时间的字符串
- double:8字节有符号浮点数
- int(也称为i4):有符号整数,范围从 - 2,147,483,648到2,147,483,647
- string:文本
- struct:关联数据的名称 - 值对,名称为字符串,值可以是其他任何数据类型(类似于Java中的 HashMap 类)
- 数组数据类型:用于保存任何其他类型的数据数组,包括数组

2.2 与现有RPC技术对比

与远程方法调用(RMI)、通用对象请求代理体系结构(CORBA)和Sun的开放网络计算RPC等现有RPC技术相比,XML - RPC设计简单,更适合跨网络编程。现有RPC技术的复杂性是其被采用的障碍之一,而XML - RPC则避免了这些问题。

2.3 XML - RPC的应用

XML - RPC已成为许多Windows、Macintosh、Linux和Unix系统上Web服务的关键元素。例如,Red Hat在Red Hat Linux上大量使用XML - RPC,其Red Hat Network通过Internet维护和更新计算机时会频繁使用该协议。

2.4 XML - RPC与SOAP的关系

在XML - RPC发布后,微软、IBM、Lotus等公司对其规范进行了扩展,创建了另一个RPC协议——SOAP(简单对象访问协议)。SOAP与XML - RPC有一些共同的设计目标,但它扩展了对对象、用户定义数据类型和其他高级功能的支持,因此协议更为复杂。由于微软和其他大型软件开发人员的持续支持,SOAP在Web服务和其他分布式网络编程中也广泛流行。

3. XML - RPC通信过程

XML - RPC是通过超文本传输协议(HTTP)传输的协议,它传输的信息不是Web内容,而是以特定方式编码的XML。使用XML - RPC进行两种数据交换:客户端请求和服务器响应。

3.1 发送请求

XML - RPC请求是作为HTTP POST请求的一部分发送到Web服务器的XML数据。请求由两部分组成:POST传输所需的HTTP头和以XML表示的XML - RPC请求。

以下是一个XML - RPC请求的示例:

POST /XMLRPC HTTP/1.0
Host: www.advogato.org
Connection: Close
Content - Type: text/xml
Content - Length: 151
User - Agent: OSE/XML - RPC

<?xml version="1.0"?>
<methodCall>
    <methodName>test.square</methodName>
    <params>
        <param>
            <value>
                <int>13</int>
            </value>
        </param>
    </params>
</methodCall>

从这个示例中可以看出:
- XML - RPC服务器位于 http://www.advogato.org/XMLRPC
- 正在调用的远程方法是 test.square
- 该方法被调用时带有一个参数,即值为13的整数。

3.2 响应请求

XML - RPC响应是从Web服务器返回的XML数据,就像其他HTTP响应一样。响应也由HTTP头和XML格式的XML - RPC响应组成。

以下是一个XML - RPC响应的示例:

HTTP/1.0 200 OK
Date: Wed, 09 Oct 2002 22:08:09 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux mod_virgule/1.40 PHP/4.1.2
ETag: "PbT9cMgXsXnw52OqREFNAA=="
Content - MD5: PbT9cMgXsXnw52OqREFNAA==
Content - Length: 157
Connection: close
Content - Type: text/xml

<?xml version="1.0"?>
<methodResponse>
    <params>
        <param>
            <value>
                <int>169</int>
            </value>
        </param>
    </params>
</methodResponse>

从这个示例中可以得知:
- 响应大小为157字节,格式为XML。
- 远程方法返回的值是一个等于169的整数。

3.3 流程图

graph LR
    A[客户端] -->|发送XML - RPC请求| B[服务器]
    B -->|返回XML - RPC响应| A

4. XML - RPC实现选择

虽然可以通过创建自己的类来读写XML并在Internet上交换数据来使用XML - RPC,但更简单的方法是使用现有的支持XML - RPC的Java类库。其中,Apache XML - RPC是最受欢迎的开源项目之一。

4.1 Apache XML - RPC项目

Apache XML - RPC项目由 org.apache.xmlrpc 包和三个相关包组成,包含可用于实现XML - RPC客户端和服务器的类,只需编写少量代码。该项目的主页为 http://xml.apache.org/xmlrpc ,当前版本为1.1。

4.2 安装步骤

  1. 下载并安装包含两个JAR文件( xmlrpc - 1.1.jar xmlrpc - 1.1 - applet.jar )的存档文件。Windows用户可下载zip格式,Linux、Unix和Mac OS X用户可下载TAR/GZ格式。
  2. 解压文件后,将两个JAR文件的引用添加到系统的 Classpath 环境变量中,以便Java解释器和编译器能够找到Apache XML - RPC的包。例如,在Windows上,如果文件位于 C:\jdk\xmlrpc - 1.1\xmlrpc - 1.1.jar C:\jdk\xmlrpc - 1.1\xmlrpc - 1.1 - applet.jar ,则应将以下文本追加到 Classpath 末尾:
;C:\jdk\xmlrpc - 1.1\xmlrpc - 1.1.jar;C:\jdk\xmlrpc - 1.1\xmlrpc - 1.1 - applet.jar

在Linux或Unix系统上,使用冒号分隔文件:

:C:\jdk\xmlrpc - 1.1\xmlrpc - 1.1.jar:C:\jdk\xmlrpc - 1.1\xmlrpc - 1.1 - applet.jar

注意不要覆盖 Classpath 中已有的内容。

4.3 使用Apache XML - RPC类

配置好 Classpath 后,可以在Java程序中使用Apache XML - RPC类。最简单的方法是使用 import 语句导入包:

import org.apache.xmlrpc.*;

5. 使用XML - RPC Web服务

5.1 创建XML - RPC客户端

org.apache.xmlrpc 包中, XmlRpcClient 类表示客户端。可以通过以下三种方式创建 XmlRpcClient 对象,每种方式都需要服务器的URL:
- XmlRpcClient(String) :创建一个连接到由字符串指定地址的客户端,该字符串必须是有效的Web地址(如 http://www.example.com )或Web地址和端口号(如 http://www.example.com:2274 )。
- XmlRpcClient(URL) :创建一个连接到指定URL对象的客户端。
- XmlRpcClient(String, int) :创建一个连接到指定主机名(字符串)和端口号(整数)的客户端。

需要注意的是,需要字符串参数的两个构造函数如果参数不是有效的Web URL,将抛出 java.net.MalformedURLException 异常。

以下代码创建了一个连接到 cadenhead.org 主机端口4413的XML - RPC服务器的客户端:

XmlRpcClient client = new XmlRpcClient("http://cadenhead.org:4413");

5.2 准备远程方法参数

如果调用远程方法时带有参数,应将它们存储在 Vector 对象中。 Vector java.util 包中的数据结构,用于保存不同类的对象。

以下是一个示例,展示如何创建一个包含两个参数(字符串和双精度浮点数)的 Vector

String code = "conical";
Double xValue = new Double(175);
Vector parameters = new Vector();
parameters.addElement(code);
parameters.addElement(xValue);

5.3 调用远程方法

调用XML - RPC服务器上的远程方法,需要调用 XmlRpcClient 对象的 execute(String, Vector) 方法,该方法接受两个参数:
- 方法的名称
- 包含方法参数的 Vector

方法名称应指定时不带括号或参数。例如, cadenhead.org 的XML - RPC服务器提供了 dmoz.getRandomSite() 方法,该方法返回一个包含随机网站信息的对象,且该方法没有参数。以下代码创建了一个XML - RPC客户端并调用该方法:

XmlRpcClient client = new XmlRpcClient("http://cadenhead.org:4413");
Vector params = new Vector();
Object result = client.execute("dmoz.getRandomSite", params);

execute 方法返回一个包含响应的 Object 对象,应将其转换为作为参数发送到方法的数据类型之一: Boolean byte[] Date Double Integer String Hashtable Vector 。该方法可能会抛出 java.net.IOException 异常(如果在客户端和服务器连接期间发生输入/输出错误)和 XmlRpcException 异常(如果服务器报告XML - RPC错误)。

5.4 完整示例代码

以下是一个完整的Java程序 SiteClient.java 示例:

import java.io.*;
import java.util.*;
import java.net.*;
import org.apache.xmlrpc.*;

public class SiteClient {
    String url;
    String title;
    String description;

    public static void main(String arguments[]) {
        SiteClient client = new SiteClient();
        try {
            Vector response = client.getRandomSite();
            // 报告结果
            if (response.size() > 0) {
                client.url = response.get(1).toString();
                client.title = response.get(2).toString();
                client.description = response.get(3).toString();
                System.out.println("URL: " + client.url +
                        "\nTitle: " + client.title +
                        "\nDescription: " + client.description);
            }
        } catch (IOException ioe) {
            System.out.println("IO Exception: " + ioe.getMessage());
            ioe.printStackTrace();
        } catch (XmlRpcException xre) {
            System.out.println("XML - RPC Exception: " + xre.getMessage());
        }
    }

    public Vector getRandomSite() throws IOException, XmlRpcException {
        // 此处可添加具体实现代码
        return null;
    }
}

综上所述,Java Web Start和XML - RPC都是非常有用的技术,Java Web Start简化了Java程序的部署,而XML - RPC则为远程过程调用提供了简单有效的解决方案。通过合理使用这些技术,可以提高开发效率,实现更强大的网络应用程序。

6. XML - RPC数据类型及处理

6.1 支持的数据类型总结

XML - RPC支持多种数据类型,具体如下表所示:
| 数据类型 | 描述 |
| ---- | ---- |
| base64 | Base 64格式的二进制数据 |
| boolean | 布尔值(1表示真,0表示假) |
| dateTime.iso8601 | 包含ISO8601格式日期和时间的字符串 |
| double | 8字节有符号浮点数 |
| int(i4) | 有符号整数,范围从 - 2,147,483,648到2,147,483,647 |
| string | 文本 |
| struct | 关联数据的名称 - 值对,名称为字符串,值可以是其他任何数据类型,类似Java中的 HashMap 类 |
| 数组 | 用于保存任何其他类型的数据数组,包括数组 |

6.2 数据类型在代码中的处理

在使用XML - RPC调用远程方法时,需要将参数和返回值在Java数据类型和XML - RPC支持的数据类型之间进行转换。例如,当调用远程方法时,将Java数据类型封装到 Vector 中作为参数传递:

import java.util.Vector;
import java.util.Date;
import java.util.Hashtable;

// 准备参数
Vector<Object> params = new Vector<>();
params.addElement(new Integer(10)); // int类型
params.addElement(new Double(3.14)); // double类型
params.addElement(new Boolean(true)); // boolean类型
params.addElement(new Date()); // dateTime.iso8601类型
Hashtable<String, Object> struct = new Hashtable<>();
struct.put("key", "value");
params.addElement(struct); // struct类型

在接收返回值时,需要将返回的 Object 对象转换为合适的Java数据类型:

Object result = client.execute("methodName", params);
if (result instanceof Integer) {
    Integer intResult = (Integer) result;
    // 处理整数结果
} else if (result instanceof Double) {
    Double doubleResult = (Double) result;
    // 处理双精度浮点数结果
}

6.3 流程图:数据类型处理流程

graph LR
    A[Java数据类型] -->|封装到Vector| B[XML - RPC参数]
    B -->|发送请求| C[服务器]
    C -->|返回响应| D[XML - RPC结果]
    D -->|转换为Java类型| E[Java数据类型]

7. XML - RPC错误处理

7.1 可能出现的异常

在使用XML - RPC时,可能会遇到以下异常:
- java.net.MalformedURLException :当创建 XmlRpcClient 对象时,如果传入的URL格式不正确,会抛出此异常。
- java.net.IOException :在客户端与服务器连接期间,如果发生输入/输出错误, execute() 方法会抛出此异常。
- XmlRpcException :如果服务器报告XML - RPC错误,会抛出此异常。

7.2 异常处理示例

以下是一个包含异常处理的完整示例:

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;
import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;

public class ErrorHandlingExample {
    public static void main(String[] args) {
        try {
            // 创建客户端
            XmlRpcClient client = new XmlRpcClient("http://example.org:8080");
            // 准备参数
            Vector<Object> params = new Vector<>();
            // 调用远程方法
            Object result = client.execute("methodName", params);
            System.out.println("结果: " + result);
        } catch (MalformedURLException e) {
            System.out.println("URL格式错误: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("输入/输出错误: " + e.getMessage());
        } catch (XmlRpcException e) {
            System.out.println("XML - RPC错误: " + e.getMessage());
        }
    }
}

7.3 异常处理流程图

graph TD
    A[创建客户端] --> B{URL格式是否正确}
    B -- 是 --> C[准备参数]
    B -- 否 --> D[抛出MalformedURLException]
    C --> E[调用远程方法]
    E --> F{连接是否正常}
    F -- 是 --> G{服务器是否返回错误}
    F -- 否 --> H[抛出IOException]
    G -- 是 --> I[抛出XmlRpcException]
    G -- 否 --> J[处理结果]

8. XML - RPC的优势与局限性

8.1 优势

  • 简单性 :XML - RPC设计简单,易于理解和实现,对于只需要进行简单远程过程调用的场景非常适用。
  • 跨平台和跨语言 :由于使用HTTP和XML进行数据交换,XML - RPC可以在不同的操作系统和编程语言之间进行通信。
  • 广泛应用 :已经成为许多Web服务的关键元素,有大量的实现可供选择。

8.2 局限性

  • 缺乏对象支持 :XML - RPC没有专门的方式来表示对象,虽然可以用数组和结构体来模拟,但对于复杂的面向对象编程场景不够方便。
  • 功能相对有限 :与SOAP等更复杂的协议相比,XML - RPC的功能相对较少,不支持一些高级特性。

8.3 选择建议

在选择使用XML - RPC还是其他RPC协议时,可以参考以下建议:
| 场景 | 建议协议 |
| ---- | ---- |
| 简单的跨网络过程调用,对性能和功能要求不高 | XML - RPC |
| 需要支持复杂对象、用户定义数据类型和高级特性 | SOAP |

9. 总结

9.1 技术回顾

本文详细介绍了Java Web Start和XML - RPC两种技术。Java Web Start简化了Java程序的部署,用户无需安装即可通过多种方式运行Java应用程序。XML - RPC则是一种使用HTTP和XML进行远程过程调用的协议,具有简单、跨平台等优点。

9.2 操作步骤总结

  • Java Web Start
    1. 了解其通过JNLP实现部署的原理。
    2. 掌握将现有应用程序转换为支持Java Web Start的方法。
    3. 完成相关的测验和练习,巩固知识。
  • XML - RPC
    1. 理解其发展背景、支持的数据类型和与其他RPC协议的关系。
    2. 掌握XML - RPC请求和响应的结构和格式。
    3. 选择合适的实现库,如Apache XML - RPC,并完成安装和配置。
    4. 学会创建XML - RPC客户端,准备参数,调用远程方法,并处理返回值和异常。

通过对这些技术的学习和实践,可以在Java开发中更好地实现程序部署和远程过程调用,提高开发效率和应用程序的性能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值