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 安装步骤
-
下载并安装包含两个JAR文件(
xmlrpc - 1.1.jar和xmlrpc - 1.1 - applet.jar)的存档文件。Windows用户可下载zip格式,Linux、Unix和Mac OS X用户可下载TAR/GZ格式。 -
解压文件后,将两个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
:
- 了解其通过JNLP实现部署的原理。
- 掌握将现有应用程序转换为支持Java Web Start的方法。
- 完成相关的测验和练习,巩固知识。
-
XML - RPC
:
- 理解其发展背景、支持的数据类型和与其他RPC协议的关系。
- 掌握XML - RPC请求和响应的结构和格式。
- 选择合适的实现库,如Apache XML - RPC,并完成安装和配置。
- 学会创建XML - RPC客户端,准备参数,调用远程方法,并处理返回值和异常。
通过对这些技术的学习和实践,可以在Java开发中更好地实现程序部署和远程过程调用,提高开发效率和应用程序的性能。
超级会员免费看
760

被折叠的 条评论
为什么被折叠?



