使用 Web 服务解决现实世界的问题






4.86/5 (6投票s)
在本文中,我们将研究企业中一个真实的、技术性的问题,以及 Web 服务如何帮助我们解决该问题。
Web 服务的真实世界示例
引言
今天在本文中,我们将研究企业中一个真实的、技术性的问题,以及 Web 服务如何帮助我们解决该问题。 这是参加 Web 服务面试时的主要问题之一。 您还可以观看有关 Java 设计模式、J2EE、Struts 2、Hibernate、Spring、Web 服务 的视频,它们都是使用 Java/JaxWS/JAX RS 实现的。
如果您是 Web 服务的新手,请观看以下入门视频:
问题
OAx 组织正在使用名为 Ex 的内容管理系统 (CMS) 来存储与一个应用程序相关的文档。

由于 Ex 提供的性能,决定替换使用其他 CMS 的其他现有应用程序,并将它们迁移到 Ex。

可能的解决方案 1

为了实现上述解决方案,现有应用程序可以使用 Ex API 来对它们的文档进行操作。
直接使用 CMS API 具有以下缺点:
- 如果将来由于某种原因需要用另一个 CMS 工具替换上述 CMS 工具,则意味着需要更改所有使用上述 CMS 工具的应用程序中的代码。
- Ex API 对 Java 具有可扩展的支持,但没有为 Microsoft 技术提供解决方案。 已经有许多使用 .NET 开发的应用程序,并且不可能完全重写它们。
Web 服务在行动
可以使用 Web 服务解决上述问题。
各种应用程序要使用的功能现在将作为 Web 服务公开。
由于 Web 服务基于接口和实现分离的原则,因此 Web 服务的实现部分将使用核心 Ex API 来实现所需的功能。
由于 Web 服务提供了编程语言方面的透明性,因此以各种编程语言编写的应用程序可以毫无阻碍地访问 Web 服务。
因此,在此场景中使用 Web 服务是最佳解决方案。
JAX WS---Web 服务世界中的英雄
JAX WS 有助于在 Java 端开发 Web 服务。
以下是一些表明 JAX WS 是最佳解决方案的因素:
- 注解驱动:使用注解易于开发
- MTOM:消息传输优化机制,与以前的 Base 64 编码附件相比,提供了优势
Web 服务场景:将功能公开为服务

实现细节
让我们考虑 Web 服务要提供的功能之一:
- 在 CMS 中插入 PDF 数据(在我们的例子中,为了简单起见,我们将它存储在某个位置而不是 CMS 中)。 我们将使用 Eclipse Helios 实现相同的功能。 在此示例中,我们不会将 PDF 文件存储在 CMS 中,而是将其存储在硬盘驱动器中的某个位置。
步骤 1:创建一个 Java 项目,并将该项目命名为 DocumentProject

步骤 2:在包 com.questpond.service
中创建一个 DocumentInt
类,并使用以下方法签名:
package com.questpond.service;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style = Style.RPC)
public interface DocumentInt {
@WebMethod public String upload(byte data[]) ;
}
步骤 3:创建一个实现 DocumentInt
的 DocumentImpl
类,并编写上传的主体。 该函数接收字节数组,并将相同的字节数组转换为位于 "D:/eclipse/Example.pdf" 位置的文件。 MTOM 用于在传输二进制数据时支持优化。
package com.questpond.service;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.jws.WebService;
import javax.xml.ws.soap.MTOM;
@MTOM
@WebService(endpointInterface = "com.questpond.service.DocumentInt")
public class DocumentImpl implements DocumentInt {
@Override
public String upload(byte data[]) {
OutputStream fos;
try {
fos = new FileOutputStream(new File("D://eclipse//Example.pdf"));
fos.write(data);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
}
步骤 4:创建将发布已创建的 Web 服务的 DocumentPublisher
类。 将以下代码放入其中:
package com.questpond.service;
import javax.xml.ws.Endpoint;
public class DocumentPublisher {
public static void main(String[] args) {
Endpoint.publish("https://:7656/questpond/image", new DocumentImpl());
System.out.println("Server is published!");
}
}
步骤 5:执行发布者类,以便公开 Web 服务。 通过在 Web 浏览器中输入以下 URL 来获取公开的 WSDL 文件,以确认是否已公开。 下面显示了其中的一个代码片段:

步骤 6:为 Web 服务创建客户端。 我们将此类命名为 Main
。
Main
类将负责调用 Web 服务,并且由于上传函数的参数是包含文件数据的字节数组,因此客户端会将文件转换为字节数组,并将相同的字节数组传递给上传函数,后者会将字节数组转换为文件。 将以下代码放入 Main
类的 main
函数中:
public static void main(String[] args) {
URL url;
byte[] bytes = new byte[5000];
try {
url = new URL("https://:7655/questpond/image?wsdl");
QName qname = new QName("http://service.questpond.com/",
"DocumentImplService");
Service service = Service.create(url, qname);
DocumentInt server = service.getPort(DocumentInt.class);
File file = new File("E:/Documents/view_pdf.pdf");
bytes = new byte[(int) file.length()];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(bytes);
} catch (FileNotFoundException e) {
System.out.println("File Not Found.");
e.printStackTrace();
} catch (IOException e1) {
System.out.println("Error Reading The File.");
e1.printStackTrace();
}
server.upload(bytes);
} catch (Exception e) {
e.printStackTrace();
}
}
上面的函数从 E:/Documents/view_pdf.pdf 读取文件,并将文件转换为字节数组。 然后使用此字节数组来调用上传函数。
执行客户端后,我们将在上传函数中指定的位置创建一个文件。
结论
因此,我们已经看到了一个使用 Web 服务的真实世界场景,以及它的一个部分实现。 您可以通过观看我在 Web 服务及其使用 JAXWS 和 JAXRS 在 Java 中的实现方面的视频来进一步增强您在 Web 服务方面的知识。
下载上述文章的源代码。