接收数据的 Java 客户机获得 XML 内容(并不是 XML 文件) 客户机如何接收 XML 数据?同样,对于 Java 技术来说这只是小事一桩。数据接收通过一个套接字对象完成。清单 5 展示的代码将接收传入的数据并将数据推入到 ArrayList 类的对象中。 客户机现在必须解决两个与所接收数据项的数量有关的问题。由于这是一个松散耦合的场景,您必须假定客户机并不清楚服务配置文件(即 清单 1 中的代码)中包含了多少 XML 数据项。因此,您必须确定一些方法来接收和处理精确的数据项数量。第二个问题比较容易解决,就是如何保存处理过的数据。您将看到,清单 5 同时解决了这两个问题。 清单 5. 提取嵌入的 XML 数据
XMLDecoder d = new XMLDecoder(input);try{while (true)ArrayList<Object[]> rowList = new ArrayList<Object[]>();{String dataItem = (String)d.readObject();System.out.println("XML decoded data: " + dataItem);rowList.add(dataItem);}}}catch (Exception exc){if (exc instanceof ArrayIndexOutOfBoundsException){// No more records to processSystem.out.println("Parsed all XML records - " + "threw exception. Number of rows: " + rowList.size());}}d.close(); |
通过一个有限循环 while (true),您可以确定期望的到来数据项的数量。该代码将一直执行循环,直到接收到最后一个数据项,此时将抛出一个异常 (ArrayIndexOutOfBoundsException)。您必须使用这种异常机制,除非客户机已经了解期望的数据项数量。 从 InputStream 对象接收的 XML 数据被保存在 ArrayList 类的一个对象中。该类对于此类应用程序非常有用。完成类定义之后,ArrayList 具有一个特定的容量,总是匹配底层列表的大小。在添加元素时,ArrayList 对象的容量将自动扩展。因此,您无需担心会超过数组的极限,因为该类将为您处理这一问题。 此时,客户机具有 清单 1 中数据的副本。客户机现在可以将带宽元素修改为所需的值,然后反向执行文件传输过程,从客户机发送到服务器。通过将 XML 文件从服务器移动到客户机,客户机实际上使用了这一服务。更新后的数据被发送回服务器以完成事务。当然,服务提供商必须验证传入的数据并提供所需的带宽更改。 本文描述的这种模式首先将一个 XML 文件通过网络传输到客户机。客户机将文件数据作为流进行接收,然后将其解析为一个内存驻留对象。客户机随后对内存驻留对象进行更改,然后反向执行传输过程,将对象发回到服务器。 还存在一种服务,其中 XML 数据被完整无缺地从服务器传输到客户机。这种场景中,客户机使用某种形式的文件传输协议(例如 FTP)获得完整的文件副本。由于文件传输是一种标准技术,这里不作过多介绍,您只需了解客户机将下载 清单 1 中服务配置数据的一个文件副本。此时,客户机需要解析并修改文件,然后传输回服务器,这种模式的工作原理是什么? 一种基于 XML 文件的 Java 机制 客户机现在将服务配置文件的副本保存在磁盘中。必须对该文件进行解析以提取 XML 数据。让人意外的是,这实现起来有些难度,对于较大的文件尤其如此。解决问题的关键是使用合适的解析工具。本文中使用的工具是 dom4j,该工具允许您将 XML 数据解析为一个 Java 对象。您还可以使用一个基于 Simple API for XML (SAX) 的解析器,但是 SAX 是一种较低级的技术。您将看到,dom4j 工具仅需要很少的工作即可完成解析。清单 6 引用自本文附带的 ProcessEventXml.java 文件,展示了使用 dom4j 解析文件所需的主要元素。 清单 6. dom4j 处理 XML 数据
try{handler.treeWalk(handler.parse(new File(argv[0])));}catch (Throwable t){t.printStackTrace();}}public Document parse(File url)throws DocumentException{SAXReader reader = new SAXReader();Document document = reader.read(url);return document;}public void treeWalk(Document document)throws Exception{treeWalk(document.getRootElement());} |
基本上只需要两种方法:parse() 和 treeWalk()。当我运行经过编译的类时,我获得了如 清单 7 所示的输出。如果您希望亲自运行代码,请确保下载、安装 dom4j 副本,并添加到 CLASSPATH 中(最后一步就是将相应的 JAR 文件添加到您的 CLASSPATH 变量中)。然后,编译 ProcessEventXml.java 文件并使用以下命令运行程序: java ProcessEventXml ServiceDefinition.xml 清单 7. 使用 dom4j 处理 XML 文件 java ProcessEventXml ServiceDefinition.xml Josephine Bloggs Internet 1mbps 1Gbyte 95 正如您看到的,仅需少量工作即可整洁地显示 XML 数据。这些工作都是由 dom4j 处理的。事实上,大部分工作是通过 treeWalk() 方法完成的,这是一种只有到达文件末尾才进行调用的递归式方法。这里向您展示了 dom4j 的一个功能:在内存中进行处理。需要注意的是,该技术不适合用于特别大型的 XML 文件,特别是如果您的 Java 设备非常小的话。然而,在本文的例子中,XML 数据集非常小,因此使用这个功能不会产生问题。 您的基于文件的客户机现在已经成功访问了 XML 数据。客户机可以根据需要修改数据并编写新的 XML 文件。然后将其传输回服务器进行处理。像上文一样,客户机在这一过程中使用了该服务。 结束语 Java 技术为 SOA 设计和实现提供了经过优化的解决方案。通过使用简单的基于 XML 文件的服务配置,您可以轻松地在网络中移动客户机数据。客户机可以查看并修改这些数据,然后使用这些数据更新服务。本文中的服务由 ISP 提供,但是任何提供商都可以使用这种方法。 这种客户机服务的一个关键因素是工作流。商用 SOA 产品趋向于使用 BPEL 提供这种功能。而试验性 SOA 模式可能使用简单的消息传递模式 — 例如,Java Message Service (JMS) 应用程序编程接口(API)。正如我在简介中提到的一样,这种方法的优点是组织可以在为迁移到商用 SOA 解决方案而做出重大投资之前获得一些 SOA 使用体验。 除了工作流支持外,本文没有涉及到的另一个重要问题是安全性。如果客户机用户修改了他们的服务配置,那么需要对底层数据进行保护。同样,Java 技术提供了一些方法可以实现安全性。 您还可以使用一种更粗糙的方法将 XML 服务配置数据表示为文件。客户机随后使用某种模式将这些文件传递到本地存储中,然后您可以使用 dom4j 解析并修改文件数据。Java 技术也提供了一些工具简化了这些操作。通过使用这些方法,任何规模的 Java 客户机可以完全参与到 SOA 实现中。  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |