开发 web 服务,第 2 部分: 使用 JAX-WS 开发文件下载 web 服务

本教程演示了如何使用 JAX - WS 开发 Hello User web 服务和 File Download(文件下载)web 服务。最后开发了一个 SAAJ 客户端,用于处理 Product Catalog web 服务。

Kuntal Ganguly, 初级开发人员, IBM China

目前在加尔各答 Protech Infosystems Pvt. Ltd 公司担任初级开发人员。Kuntal 曾经接触过广泛的开源和商业工具(WASCE、Eclipse、Mule ESB、EZlegacy、Active MQ、Birt 和 DB2 express C)以及各种技术(GWT 和 Android)



Partha Goswami, 初级开发人员, IBM China

作者照片目前在加尔各答 Protech Infosystems Pvt. Ltd 公司担任初级开发人员。他曾经接触过广泛的开源和商业工具(WAS CE、Eclipse、Mule ESB、EZlegacy、Active MQ、Birt 和 DB2 express C)和技术(GWT 和 RSS)。



2011 年 9 月 19 日

引言

MTOM 使用 XML-binary Optimized Packaging (XOP) 包传递二进制数据。带 SOAP 消息的大型附件解决方案使用 MTOM (SOAP Message Transmission Optimization Mechanism),后者对 base64Binary 格式的二进制数据进行编码,并将数据作为二进制附件发送,而不是将它作为真正的 SOAP 消息。MTOM 提供了一种简洁的机制传递二进制数据,如 PDF、Doc、图像和其他文档类型。Data Handler 和 Data Source API 执行 MTOM 附件的流式处理。

本教程是共三部分的系列文章的第二篇,解释了如何使用 JAX-WS 开发一个 File downloading web 服务,以及如何使用 SAAJ 客户端通过 web 服务发送和接收响应。

为了跟随本教程的学习,您应当对 Simple Object Access Protocol (SOAP) 和相关技术(如 WSDL)有基本的了解。

关于本系列

本系列教程讲述 web 服务的基本概念,以及使用不同的 SOAP 引擎(如 Apache AXIS2、 Apache CXF 和 JAX-WS)开发 web 服务的不同方法。本系列教程还提供了一个通过使用 MTOM (SOAP Message Transmission Optimization Mechanism) 发送带 SOAP 消息的大型附件的解决方案,MTOM 对 base64Binary 格式的二进制数据进行编码,并将数据作为二进制附件发送,而不是将它作为真正的 SOAP 消息。本系列还会演示如何通过使用 SAAJ API 进行简单的方法调用来读取和编写基于 SOAP 的 XML 消息,而且您可以选择通过 Internet 发送和接收此类消息。

第 1 部分 从简单的内容开始,先解释了 web 服务背后的基本概念,并展示了如何使用 Axis2 运用不同的方法(代码优先和契约优先)来开发 web 服务。

第 2 部分 首先使用 JAX-WS 简单地开发了一个 Hello User web 服务,然后进一步展示了一个使用 JAX-WS 和 MOTO 的 File Download web 服务(客户端可以通过 web 服务下载文件并存储在其所在的位置)示例。该部分还展示了如何从 SAAJ 客户端调用 web 服务。

第 3 部分 简单地展示了如何通过 XOP 实现、使用 Apache CXF 对 MTOM 的支持开发 File uploading web 服务(客户端可以上传文件/附件到 web 服务)。

关于本教程

本教程将展示如何使用 JAX - WS 开发一个简单的 Hello User web 服务,随后开发一个 File Download(文件下载)web 服务,客户端可以通过 web 服务下载文件并将其存储在客户端位置。最后,将开发一个 SAAJ 客户端,用于访问第 1 部分中使用 Axis2 和契约优先方法开发的 Product Catalog web 服务。JAX-WS 替代了以前的 JAX-RPC API。与 SAAJ 不同,JAX-WS 不要求您精通 XML 或 WSDL。整个 XML 层对开发人员是隐藏的,开发人员只需要处理 Java SE 6 和 EE 5 附带的 web 服务工具生成的对象。

目标

在本教程中,您将学会如何:

  • 使用 Eclipse IDE 中的 JAX-WS 库开发 Hello User 和 File Download web 服务及其客户端。
  • 使用 Eclipse IDE 开发 SAAJ 客户端,通过 Product Catalog web 服务发送请求和接收响应。

先决条件

本教程假设您对 Eclipse IDE 的基本概念和 web 服务架构有一定了解。


简介

什么是 JAX-WS?

Java API for XML Web Services (JAX-WS) 是一种 Java 编程语言 API,用于创建 web 服务。Java Web Services Developer Pack 是 Sun 提供的工具包,用于展示如何使用 Java 构建 web 服务解决方案。该工具箱提供了构建和部署基于 Java 的 web 服务解决方案所需的所有内容。它意在成为所有其他基于 Java 的 web 服务的参考实现。

工具箱还封装了许多 Java 扩展库,用于处理 web 服务套件的不同部分。不需要过多地了解这些 API,因为工具箱中提供的工具会抽象出对这些 API 的使用。因而只需要知道有这些 API,以及它们在较高级别的功能即可。这些 API 包括:

  • Java API for XML Processing (JAXP):为不同类型的 XML 解析器提供了标准化的接口。通过写入该 API,对于具有不同性能和内存特征的内容,可以切换底层 XML 解析器,而不必强制对用户代码进行修改。
  • Java API for XML-based RPC (JAX-RPC):为开发人员提供 hook 以构建 Web 应用程序和 web 服务,后者根据 Simple Object Access Protocol (SOAP) 1.2 规范并入了基于 XML 的 RPC 功能。通常,该 API 是构建 web 服务时使用最频繁的 API。
  • Java API for XML Messaging (JAXM):提供大量底层代码以创建 SOAP 消息并执行系统之间的通信。
  • SOAP with Attachments API for Java (SAAJ):使开发人员能够创建和使用遵守 SOAP 1.2 规范的消息和带有附件说明的 SOAP。
  • Java API for XML Registries (JAXR):为访问不同类型的 XML 注册表提供一个标准 Java API。我们将使用该 API 与 UDDI 或 ebXML 注册表通信。
  • Java Architecture for XML Binding (JAXB):通过将 XML 模式编译为一个或多个 Java 类简化 XML 的使用。

JAX-WS 中的各种 web 服务方法

可以通过三种方法使用 JAX-WS 开发应用程序:

WSDL to Java 方法: 指向一个 WSDL 并使用 wsimport 之类的工具生成可移植的 web 服务工件。

Java to WSDL 方法:以 Java 源文件的形式创建一个 Service Endpoint Interface。使用它们作为输入来生成 WSDL 和其他必需的可移植工件。

Start from Java and WSDL 方法:这是一种灵巧的工作方式。编写 Java 类并让 wsgen 为您创建 WSDL 和模式。然后,在本地保存生成的工件,根据需要进行修改,然后通过 @WebService 注释的 wsdlLocation 属性将服务实现指向它们。这意味着您必须保持类与模式和 WSDL 的同步,但是这样做可以最大化便捷性和控制力。

使用任何一种方法,JAX-WS 都将为您生成大量的代码,并减少处理机器可读代码的复杂性。

什么是 SAAJ?

SOAP with Attachments API for Java (SAAJ) 的出现专门用于满足基于 SOAP 的 web 服务开发人员的需求。它允许您以编程的方式处理 SOAP 信封(envelope)。通过使用 SAAJ 的类和方法,您可以创建一个信封,向其添加一个头文件,将数据放到头文件中,然后创建 SOAP 体,将 XML 文档添加到 SOAP 体中,最后将 SOAP 体添加到信封中。

一旦完成消息,就可以通过 HTTP 传递 SOAP 消息,使用一个调度程序(dispatcher)调用 web 服务。使用 SAAJ 创建 SOAP 消息结构后,可以通过一个 SOAPConnection 对象发送请求并接受响应。SAAJ 连接基于 java.net.URL 类,后者进行了扩展,可以支持任何网络协议。

JAX-WS 和 SAAJ 的比较

从实用的角度来看,SAAJ 意味着您不必使用 'wsimport''wsdl2java' 之类的工具。这些工具都与 JAX-WS 结合使用,通过它们,客户端可以生成域对象,并且其运行与未使用 web 服务的情形是一样的。对于 SAAJ,没有关于服务的域视图。您实际上处理的是管道(plumbing)。采用 JAX-WS 的开发要更快、更简便,并且不会造成任何控制损失。但是 JAX-WS 是一个便利(convenience)层,了解是否使用了一些 SAAJ 命令非常有用,您将可以执行 WSDL 接口所需的任何操作。

JAX-WS 架构

Java Web Services 用于协助创建接口代码。Sun 将这些代码称为 tie(服务端模块)和 stub(客户端模块)。参见图 1。

图 1. JAX-WS 架构(系统是如何构建的)
JAX-WS 架构(系统是如何构建的)

tie 和 stub 分别由一组名为 'wsdeploy''wscompile' 的工具生成。'Wsdeploy' 查看服务中找到的方法,并创建一系列类来处理 SOAP 消息中所传递内容的解组(un-marshaling),以及返回数据的编组(marshaling)。WSDL 文件也是由该工具创建的。wscompile 工具查看指定服务的 WSDL 文件。它检查该文件中的 XML 描述符,生成一组代理类,用于处理与服务的通信和所有方法调用的编组。实际上,wsdeploy 和 wscompile 是成对出现的。这两个工具共同完成了构建 web 服务互联所需的大量手工操作。没有它们的话,您不得不编写所有代码来构建 XML SOAP 信封、使用它们,并执行数据与 Java 对象的相互转换。这将需要精通 API 知识,并且为开发过程增加了更多的复杂性。


配置和开发

示例 I – Hello User web 服务

这是一个非常简单的示例 “Hello World” web 服务,它将显示作为参数传递、从 POJO 客户端调用的字符串。要设置并运行这个例子,需要首先了解以下内容:

Eclipse IDE:一个集成开发环境(IDE),集编写、编辑、编译和运行计算机程序的所有工具于一体。并且 Eclipse 提供了一个出色的集成开发环境。您可以在 www.eclipse.org 中找到 eclipse 的最新版本。

JAX-WS:该项目为 XML Web Services (JAX-WS) 规范开发和演变 Java API 的参考实现的代码库。当前代码库支持 JAX-WS 2.0 和 JAXWS 2.1,但是该项目会跟踪 JAX-WS 规范的未来版本。您可以从 http://jax-ws.java.net/2.2.3/ 下载 Tomcat 的最新发行版。

设置环境

  1. 在您的系统中安装 JDK 1.5 或以上版本,我们将其称为 <JAVA_HOME>。
  2. 下载 Jax-ws 后,将其提取到一个目录。提取后,单击 JAXWS2.1.2-20070917.jar 文件,它将创建 jaxws-ri 目录,其中包含成功开发和部署 web 服务所需的所有必要工具和 jar 文件。[我们将 jaxws-ri 目录引用为 <JAXWS_HOME>](确保 <JAVA_HOME>bin| 被设为用户 Path Variable,如图 2 所示)。
图 2. 将 Java bin 设置为 Path
将 Java bin 设置为 Path

在 Eclipse IDE 中使用 JAX-WS 库开发 Hello User web 服务

  1. 在 Eclipse 中选择 File > New > Java Project,创建名为 ‘JaxWSHelloService’ 的 Java 项目。
  2. 在 JaxWSHelloService|src 文件夹内部创建包 com.ibm.hello
  3. 选择 ‘JaxWSHelloService’ 项目并创建 New>Folder lib,如下图 3 所示。
图 3. 创建 Hello Service lib 文件夹
创建 Hello Service lib 文件夹
  1. 现在,从 <JAXWS_HOME>lib| 中复制所有 jar 文件,并粘贴到上面创建的 lib 文件夹。
  2. 选择 JaxWSHelloService 项目,并按图 4 所示配置构建路径。
图 4. Hello Service Configure Build 路径
Hello Service Configure Build 路径

(现在,单击 Add JARs 并选择 lib 文件夹中的所有 jar 文件,然后单击 OK,如下图 5 所示。)

图 5. 将 JARs 添加到 Hello service 构建路径
将 JARs 添加到 Hello service 构建路径
  1. 在 ‘com.ibm.hello’ 包内部创建一个名为 HelloUser.java 的类,如清单 1 所示:
清单 1. HelloUser web 服务
package com.ibm.hello;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.Endpoint;

@WebService
public class HelloUser {
	@SOAPBinding(style = Style.RPC)
	public String sayHello(String name) {
		return "Welcome"+ name;
			}

	public static void main(String[] args) {
		HelloUser server = new HelloUser();
		Endpoint endpoint = Endpoint.publish(
				"http://localhost:8091/wisequotes", server);
	}
}
  1. 现在选择 HelloUser.java 和 Run As > Java Application。

[启动主程序(HelloUser)后,服务应当启动并运行。您可以通过浏览器在 http://localhost:8091/wisequotes?wsdl 中访问它。您应当看到服务器的 WSDL,如图 6 所示]。

图 6. Hello Service WSDL
Hello Service WSDL

为 Hello Service 开发 JAX-WS 客户端 - 生成 Stub

  1. 打开命令提示符,切换到 empty 目录,并调用 wsimport 命令行工具(该工具是 JDK 的一部分)。
    或者
    打开命令提示符并移动到 <JAXWS_HOME>bin|,然后调用 wsimport 命令行工具。
  2. 现在,输入以下命令,如图 7 所示。
    wsimport -keep http://localhost:8091/wisequotes?wsdl
图 7. 生成 Hello Client Stub
生成 Hello Client Stub

[这将为客户端生成 stub,用于与 HelloUser web 服务的方法和工厂交互]。

使用 Eclipse 开发 HelloClient

  1. 在 Eclipse 中选择 File > New > Java Project,创建一个名为 JAXWSClient 的 Java 项目。
  2. 在 JAXWSClient|src 文件夹的内部创建一个包 com.ibm.hello,如图 8 所示。
图 8. 创建 Hello Client 包
创建 Hello Client 包
  1. 现在,在 com.ibm.hello 包中复制并粘贴前面生成的 stubs
  2. 选择 JAXWSClient 项目,选择 New > Folder,创建一个名为 'lib' 的文件夹。
  3. <JAXWS_HOME>lib| 中复制所有 jar 文件并粘贴到前面创建的 lib 文件夹。
  4. 现在,选择 JAXWSClient Project 并配置构建路径。(单击 Add JARs 并选择 lib 文件夹中的所有 jar 文件,然后单击 OK)。
  5. 在 ‘com.ibm.hello’ 包内部创建一个名为 HelloClient.java 的类。
清单 2. HelloUser web 服务的 HelloClient
package com.ibm.hello;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.io.*;
import javax.xml.namespace.QName;

public class HelloClient {
public static void main(String[] args) {
		
// Setting up the server connection
		
HelloUserService service = new HelloUserService();
HelloUser servicePort = service.getHelloUserPort();
		
// Calling the Web service
		
System.out.println(servicePort.sayHello(" " +"" +"Kuntal"));
		

// Alternatively if you want to specific the URL directly
		
try {
URL url = new URL("http://localhost:8091/wisequotes?wsdl");
HelloUserService serviceWithUrl = new 
        HelloUserService(url,new QName("http://hello.ibm.com/","HelloUserService"));
HelloUser servicePortWithUrl = serviceWithUrl.getHelloUserPort();
			
// To Enter user name from Console

System.out.println("Enter your Name: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
System.out.println(servicePortWithUrl.sayHello(s));
			
} catch (MalformedURLException e) {
		e.printStackTrace();
} catch (IOException e) {
			e.printStackTrace();
	}

    }
}
  1. 选择 HelloClient.java 和 Run As > Java Application。(现在在控制台中输入您的姓名,并按下 Enter 键,如图 9 所示)。
图 9. Hello Service 的控制台输出
Hello Service 的控制台输出

示例 II - File Download web 服务

这是一个简单的 “File Download” web 服务示例,客户端可以通过 web 服务下载任何文件并将其存储到客户端位置。我们将用一个完整的基于 SOAP 的 JAX-WS 示例展示如何使用 Message Transmission Optimization Mechanism (MTOM) 和 XML-Binary Optimized Packaging (XOP) 技术从服务器向客户端发送附件(.pdf 或 .text 或 .doc)文件。设置类似于示例 1 中开发的 Hello User web 服务。

在 Eclipse IDE 中使用 JAX-WS 库开发 File Download web 服务

  1. 在 Eclipse 中选择 File > New > Java Project,创建名为 ‘JAXWSDownload’ 的项目。
  2. 在 ‘JAXWSDownload|src’ 文件夹内部创建一个包 ‘com.ibm.download.ws’,我们将在其中创建 Download Service Interface、Download Service Implementation Class 和 Download Service Publisher Class,如下所示:
图 10. JAXWS Download 项目目录结构
JAXWSDownload 项目目录结构
  1. 选择 JAXWSDownload 项目,并创建 New>Folder lib。
  2. 现在,从 <JAXWS_HOME>lib| 复制所有 jar 文件,并粘贴到前面创建的 lib 文件夹。
  3. 现在选择 JAXWSDownload 项目,并配置构建路径。(单击 Add JARs 并选择 lib 文件夹中的所有 jar,然后单击 OK)。
  4. 在 ‘com.ibm.download.ws package’ 内部创建 SEI(Service Endpoint Interface),名为 FileServer.java(参见清单 3)。
清单 3. Download Service 的 FileServer.java 接口
package com.ibm.download.ws;
import java.io.File;
import javax.activation.DataHandler;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
 
//Service Endpoint Interface

@WebService
@SOAPBinding(style = Style.RPC)
public interface FileServer{
 
	//download a File from server

	@WebMethod 
	public DataHandler downloadFile(String fileName);
 
	
}
  1. 在 ‘com.ibm.download.ws’ 包内创建一个名为 FileServerImpl.java 的实现类(参见清单 4)。
清单 4. FileServerImpl.java Download 实现类
package com.ibm.download.ws;
import java.io.File;
import java.io.File;
import java.io.IOException;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.jws.WebService;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.soap.MTOM;
 
//Service Implementation Bean

@MTOM
@WebService(endpointInterface = "com.ibm.download.ws.FileServer")
public class FileServerImpl implements FileServer{
 
@Override
public DataHandler downloadFile(String fileName) {
 
//Location of File in Web service
		
FileDataSource dataSource = new FileDataSource("c:/test/"+fileName);
 DataHandler fileDataHandler = new DataHandler(dataSource);
 return fileDataHandler;
	}
  }
  1. com.ibm.download.ws 包内部创建一个名为 FilePublisher.java 的端点发布器(参见清单 5)。
清单 5. FilePublisher.java 端点发布器类
package com.ibm.download.ws;
import javax.xml.ws.Endpoint;
import com.ibm.download.ws.FileServerImpl;
 
//Endpoint publisher

public class FilePublisher{
public static void main(String[] args) {
Endpoint.publish("http://localhost:9899/ws/file", new FileServerImpl());
System.out.println("Server is published!");
 
    }
 
}
  1. 选择 FilePublisher.java 和 Run As>Java Application。(您将在控制台看到 “Server is Published!”。现在,打开浏览器并粘贴 wsdl http://localhost:9899/ws/file?wsdl,查看 FileDownload Webservice WSDL,如下面的图 11 和 12 所示)。
图 11. 在控制台发布 File Download 服务
在控制台发布 File Download 服务
图 12. File Download Service wsdl
File Download Service wsdl

为 FileDownload web 服务开发 JAXWSClient - 生成 Stub

  1. 打开命令提示符,切换到 empty 目录,并调用 wsimport 命令行工具(该工具是 JDK 的一部分)。
    或者
    打开命令提示符并移动到 <JAXWS_HOME>bin|,然后调用 wsimport 命令行工具。
  2. 现在,输入以下命令,如图 13 所示。

wsimport -keep –verbose http://localhost:9899/ws/file?wsdl –p com.ibm.download.client

图 13. 生成文件客户端 Stub
生成文件客户端 Stub

[这将为客户端生成 stub,用于与 FileDownload web 服务的方法和工厂交互。

使用 Eclipse 开发文件客户端

  1. 在前面创建的 JAXWSClient 项目的内部创建一个名为 ‘com.ibm.download.client’ 的包,如图 14 所示。
图 14. 为文件客户端创建包
为文件客户端创建包
  1. 现在,在 ‘com.ibm.download.client’ 包中复制并粘贴刚刚生成的 stub。
  2. 在 com.ibm.download.client 包内部创建一个名为 FileClient.java 的类。
清单 6. File Download Service 的 FileClient.java 类
package com.ibm.download.client;
import java.io.*;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
import javax.xml.ws.soap.MTOMFeature;
import javax.xml.ws.soap.SOAPBinding;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import com.ibm.ws.download.FileServer;
 
public class FileClient{
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:9899/ws/file?wsdl");
QName qname = new QName("http://ws.download.ibm.com/", "FileServerImplService");
Service service = Service.create(url, qname);
FileServer fileServer = service.getPort(FileServer.class);
 
DataHandler dh = fileServer.downloadPdf("test.pdf");

/*Location for downloading and storing in client’s machine*/

FileOutputStream outputStream = new FileOutputStream("E:/test.pdf");
dh.writeTo(outputStream);
outputStream.flush();
 System.out.println(" Download Successful!");
     }
 }

可能会出现一个类型不匹配错误,这可能是因为生成的 ‘FileServer.java’ 有一个 ‘byte[]’ 变量,而不是 ‘DataHandler’ 变量。将 byte[] 更改为 DataHander 即可解决这个问题。您还应当在其中导入 ‘javax.activation.DataHandler’。参见图 15。

图 15. File Server Stub 修改
File Server Stub 修改
  1. 选择 FileClient Run As > Java Application

(您将在控制台中看到 Download Successful!,通过 web 服务下载了一个名为 test.pdf 的文件并将其存储到客户端位置。)。

图 16. 文件客户端输出
文件客户端输出

示例 III – SAAJ 客户端调用 Product Catalog web 服务

这是一个非常简单的 SAAJ(SOAP API FOR JAVA) 客户端示例,它用于访问本系列第 1 部分中采用 Axis2 和契约优先方法开发的 Product Catalog web 服务。

为 Product Catalog 服务开发 SAAJ 客户端

  1. 在前面创建的 JAXWSClient 项目中创建一个名为 ‘com.ibm.saaj.client’ 的包,如图 17 所示。
图 17. 为 Saaj 客户端创建包
为 Saaj 客户端创建包
  1. 在 ‘com.ibm.saaj.client’ 包的内部创建一个 SaajClient.java 类。下面的清单 7 展示了如何调用 Product Catalog 服务。
清单 7. 用于调用 Product Catalog web 服务的 SaajClient.java 类
package com.ibm.saaj.client;
import java.io.IOException;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;

public class SaajClient {

// Method for creating the SOAP Request
         
private static SOAPMessage createSOAPRequest() throws Exception
{
 MessageFactory messageFactory = MessageFactory.newInstance();
 SOAPMessage soapMessage = messageFactory.createMessage();
 SOAPPart soapPart = soapMessage.getSOAPPart();
         
 //Construct SOAP Request Message:
                
 // SOAP Envelope

SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("rt", "http://contract.axis2.ibm.com");

// SOAP Body
               
 SOAPBody soapBody = envelope.getBody();
 SOAPElement soapBodyElem = soapBody.addChildElement("getProductName", "rt");
 SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("productNumber", "rt");
 soapBodyElem1.addTextNode("1");
 soapMessage.saveChanges();

  // Check the input

 System.out.println("Request SOAP Message for Product Web service");
 soapMessage.writeTo(System.out);
 System.out.println();
 return soapMessage;
        }

// Method for receiving the SOAP Response
         
private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception
    {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
Source sourceContent = soapResponse.getSOAPPart().getContent();
System.out.println("\nResponse SOAP Message from Product Web service : ");
StreamResult result = new StreamResult(System.out);
transformer.transform(sourceContent, result);
        }

 //Starting point for SaajClient
       
 public static void main(String args[])
       {
 try
       {

// Create SOAP Connection

SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();

//Sending SOAP Message to SOAP Server i.e, Product Catalog service

String url = "http://localhost:8080/axis2/services/Product?wsdl";
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);
                        
 // Processing the SOAP Response
 
 printSOAPResponse(soapResponse);
 soapConnection.close();
       }
catch (Exception e)
        {
System.err.println("Error occurred while sending SOAP Request to Server");
       e.printStackTrace();
        }
 }
}
  1. 现在选择 SaajClient.java,Run As > Java Application。[确保您的 Product Catalog web 服务正在 Tomcat 中运行]。

(您将在控制台中看到以下针对 Product catalog web 服务的 Soap Request 和 Soap Response)。

为 Product web 服务请求 SOAP 消息:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:rt="http://contract.axis2.ibm.com">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<rt:getProductName><rt:productNumber>1</rt:productNumber>
</rt:getProductName></SOAP-ENV:Body></SOAP-ENV:Envelope>

通过 Product web 服务响应 SOAP 消息:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body><ns1:getProductNameResponse
xmlns:ns1="http://contract.axis2.ibm.com">
<ns1:return>Colgate</ns1:return>
</ns1:getProductNameResponse></soapenv:Body>
</soapenv:Envelope>

结束语和参考资料

在本教程中,您了解到使用 JAX-WS 开发 web 服务是多么轻而易举,通过 web 服务下载文件或附件也很简单。您还学习了如何使用 SAAJ 通过 web 服务发送请求和接收响应。在本系列第 3 部分中,您将学习如何使用 Apache CXF 开发 File uploading web 服务。


下载

描述名字大小
本教程的样例代码code.zip10KB

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=758086
ArticleTitle=开发 web 服务,第 2 部分: 使用 JAX-WS 开发文件下载 web 服务
publish-date=09192011