本文还有配套的精品资源,点击获取
简介:WebService是一种应用程序间交互技术,主要基于WSDL、SOAP和UDDI规范。本教程重点介绍在Java环境下,如何使用WSDL定义Web服务接口,如何利用SOAP协议进行消息传递,并指导如何通过JAX-WS和CXF框架实现Java WebService的开发。同时,本教程还会讲述如何与Spring框架整合,实现服务的生命周期管理。教程内容包含从基础概念到与Spring框架的整合,以及SOA架构风格的应用,帮助开发者掌握Java WebService的全貌。
1. WebService概述及在Java中的应用
在当今的IT行业中,WebService已成为应用程序间通信的关键技术。本章节首先对WebService进行概述,然后重点探讨其在Java环境中的应用。
1.1 WebService基本概念
WebService是一种Web应用程序之间进行通信的模式,它允许不同平台的应用系统通过网络,如Internet,进行数据交换和业务逻辑处理。
1.2 WebService在Java中的应用
在Java中,WebService的实现主要依赖于JAX-WS(Java API for XML Web Services)。JAX-WS简化了Web服务的发布、发现和绑定,使得Java开发人员能够更容易地创建和消费SOAP(Simple Object Access Protocol)消息。
1.3 WebService的Java实现示例
以一个简单的用户信息查询服务为例,我们可以创建一个Java类,使用 @WebService 注解标记该类作为Web服务,并使用 @WebMethod 注解定义操作接口。然后使用JAX-WS提供的工具自动生成服务器端和客户端的代码,完成服务的发布和消费。
以下是Java代码的简单示例:
import javax.jws.WebService;
@WebService
public class UserInfoService {
@WebMethod
public String getUserInfo(String userId) {
// 这里将根据userId查询用户信息,返回字符串格式的结果
return "用户信息";
}
}
通过这个例子,我们可以看到WebService在Java中是如何被定义和实现的。当然,在实际应用中,服务的设计和实现将更加复杂,涉及到消息处理、安全性、事务管理等多个方面。在后续章节中,我们将详细介绍WSDL、SOAP、JAX-WS框架等技术在Java WebService开发中的具体应用和高级特性。
2. WSDL规范的使用和理解
2.1 WSDL的基本概念
2.1.1 WSDL的定义与结构
WSDL(Web Services Description Language)是一个用于描述网络服务的XML格式语言,它允许开发者定义服务的公共接口,包括它能做什么以及如何与之交互。WSDL文件包括服务的细节,比如它支持的操作和消息格式,以及这些操作如何映射到底层通信协议上。
WSDL文档由以下几个主要部分构成: - Type :定义了网络服务使用到的数据类型。由于SOAP是基于XML的,这些类型通常是XML Schema定义的。 - Message :表示网络服务操作的输入和输出消息。它仅仅是对数据类型的引用,实际上定义了数据的结构。 - PortType :定义了一组操作,每个操作对应一种网络服务能执行的功能。 - Binding :将PortType与具体的通信协议绑定。它指明了网络服务如何通过特定的通信协议进行通信。 - Port :绑定的一个具体实例,包括服务的网络地址(Endpoint Address)。 - Service :一组相关服务的集合。它将多个Port打包在一起,构成了完整的网络服务。
2.1.2 WSDL中的关键元素解析
WSDL文档的元素可以分为两种类型:抽象定义和具体绑定。抽象定义是指不依赖于特定实现细节的定义,具体绑定则是指将抽象定义应用到特定协议和编码风格上的细节。
portType 是网络服务能力的抽象表示,它定义了一组操作(operation),每个操作代表一个服务功能。例如,一个网络服务可能有一个 calculate 操作,该操作能够处理加法运算请求并返回结果。 message 是网络服务交互的数据封装结构。它具体定义了操作所用到的请求和响应消息格式。 binding 是将portType绑定到特定传输协议(如SOAP)和消息编码(如XML)的方式。它会详细说明每个操作的具体消息格式和通信协议细节。 port 和 service 元素共同定义了网络服务的地址。service 是一组相关端口(port)的集合,每个端口则提供了服务的一个实例地址。
2.2 WSDL文档的编写与解析
2.2.1 手写WSDL文档的技巧
手动编写WSDL文档需要对WSDL的结构和语法规则有深入的理解。以下是一些基本的技巧:
确保使用有效的XML :WSDL是XML格式的文档,因此必须确保文档格式正确,所有的标签都正确闭合,且符合XML语法。 遵循命名规则 :WSDL定义的名称必须遵循XML命名规则,即名称是NCName,不能包含空格等特殊字符。 了解元素的作用域 :在WSDL中,不同的元素定义了不同的抽象级别。理解哪些元素是抽象的定义(如portType和message),哪些是具体绑定(如binding),这有助于更准确地构建WSDL文档。 使用适当的工具进行验证 :在编写WSDL文档之后,使用XML验证工具(如XML验证器插件或在线服务)检查文档以确保没有语法错误。
2.2.2 使用工具生成和解析WSDL
手动编写WSDL文档是一项繁琐且容易出错的工作,因此,大多数情况下,开发者会使用工具自动生成WSDL文档。这些工具可以是集成开发环境(IDE)插件,也可以是独立的应用程序。例如,许多现代IDE支持通过定义Java类来自动生成WSDL文档,降低了开发者的负担。
解析WSDL文档也常使用工具来完成。解析工具可以帮助开发者理解文档结构,验证WSDL的有效性,并且可以用来反向工程,以得到实现网络服务的代码。Java开发者经常使用的工具之一是Apache CXF。
xmlns:ns1="http://example.com/types" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://example.com/services" name="ExampleService" targetNamespace="http://example.com/services"> targetNamespace="http://example.com/types">
在上面的示例中,我们定义了一个WSDL文档,其中包含了类型定义(
要解析WSDL文档,可以使用如Apache CXF这样的工具,该工具可以帮助开发者理解文档中的各个组件以及它们是如何相互作用的。
// Apache CXF 示例代码片段,用于解析WSDL文档
import org.apache.cxf.wsdl.WSDLManager;
import org.apache.cxf.wsdl11.WSDLManagerImpl;
WSDLManager manager = WSDLManagerImpl.newInstance().getWSDLManager();
manager.setDocumentProvider(new URLResourceResolver());
URL wsdlURL = new URL("http://example.com/services/example?wsdl");
Definition wsdlDef = manager.readLocation(wsdlURL, null, null);
// 使用wsdlDef对象来分析WSDL文档
// ...
通过这些代码,开发者可以加载WSDL文档,分析其结构,包括定义的服务、消息和端口类型等。使用这些工具,开发者可以更专注于服务实现,而不必担心WSDL文档的手动编写和解析过程。
3. SOAP协议在WebService中的应用
SOAP(Simple Object Access Protocol)是一种简单的、基于XML的协议,用于在网络中交换结构化信息。其设计宗旨是使客户端能够通过HTTP协议调用远程对象上的方法。在Web服务领域,SOAP扮演了极其重要的角色,它是Web服务技术体系中的消息传递协议标准。
3.1 SOAP协议的原理和特点
SOAP协议是基于XML的,它通过HTTP传输信息,并且能够携带任何类型的数据。SOAP消息通常由三个主要部分构成:Envelope、Header和Body。SOAP消息通过定义一个封装消息的框架来支持消息传递。
3.1.1 SOAP消息结构分析
SOAP消息的Envelope元素是所有SOAP消息必须包含的,它定义了一个XML文档的开始和结束,并且指明了这个文档是一个SOAP消息。SOAP消息的结构如下:
Envelope : SOAP消息的根元素,必须存在。 Header : 可选的,可以包含一组可选的头部信息。 Body : 必须的,包含了实际的调用和响应信息。
下面是一个简单的SOAP请求消息示例:
3.1.2 SOAP与HTTP的关系
虽然SOAP可以独立于HTTP传输,但是在Web服务中通常通过HTTP协议来发送和接收SOAP消息。当SOAP消息通过HTTP传输时,SOAP消息被封装在HTTP请求中。SOAP协议允许Web服务通过HTTP协议传输消息,这使得Web服务可以轻松地穿过大多数防火墙。
3.2 构建SOAP消息
在SOAP协议中构建消息是一个将应用程序数据转换为SOAP格式的XML结构的过程。这一过程通常涉及到创建SOAP请求消息并处理SOAP响应消息。
3.2.1 创建SOAP请求消息
创建SOAP请求消息的过程实质上是构造一个符合SOAP规范的XML文档。这个过程可以通过多种方式实现,例如使用Java的JAX-WS库来编程生成消息,或者使用SOAP UI等工具手动构建。
以下是一个使用Java代码创建SOAP请求消息的简单示例:
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPMessage;
import java.net.URL;
public class SoapRequestExample {
public static void main(String[] args) throws Exception {
// 创建SOAP连接
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
// 设置Web服务的URL
URL url = new URL("http://example.com/MyService?wsdl");
// 创建SOAP消息工厂
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
// 创建消息的各个部分
SOAPPart soapPart = soapMessage.getSOAPPart();
String serverURI = "http://example.com/MyNamespace/MyService";
String endpointURI = "http://example.com/MyService?wsdl";
// 创建SOAP信封
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("ns0", serverURI);
// 创建SOAP头
SOAPHeader soapHeader = envelope.getHeader();
Name headerName = envelope.createName("MyHeader", "ns0", serverURI);
SOAPHeaderElement soapHeaderElement = soapHeader.addHeaderElement(headerName);
soapHeaderElement.addTextNode("MyHeaderValue");
// 创建SOAP体
SOAPBody soapBody = envelope.getBody();
Name bodyName = envelope.createName("MyOperation", "ns0", serverURI);
SOAPBodyElement soapBodyElement = soapBody.addBodyElement(bodyName);
soapBodyElement.addChildElement(envelope.createName("param1")).addTextNode("value1");
soapBodyElement.addChildElement(envelope.createName("param2")).addTextNode("value2");
// 输出消息到控制台
soapMessage.saveChanges();
soapMessage.writeTo(System.out);
// 发送消息到服务端
SOAPMessage response = soapConnection.call(soapMessage, url);
response.writeTo(System.out);
}
}
3.2.2 处理SOAP响应消息
处理SOAP响应消息通常意味着解析SOAP消息体中的数据,并根据需要执行进一步的操作。处理过程同样可以通过编程方式实现,也可以借助于开发工具完成。
以Java代码为例,我们可以解析从Web服务返回的SOAP响应:
// 省略创建和发送请求的代码部分...
// 解析响应消息
InputStream is = response.getContentDescription();
SOAPMessage回应消息 = MessageFactory.newInstance().createMessage(null, is);
SOAPBody回应体 = 回应消息.getSOAPBody();
Node回应节点 = 回应体.getFirstChild();
System.out.println("返回的消息内容: " + 回应节点.getValue());
// 关闭连接
soapConnection.close();
通过上述代码示例,我们可以看到如何在Java中构建SOAP请求消息以及如何解析SOAP响应消息。在整个过程中,我们遵循了SOAP协议的标准,确保消息的结构和内容符合规范,以便与Web服务进行有效交互。
4. JAX-WS的使用和Java WebService开发
4.1 JAX-WS框架概述
4.1.1 JAX-WS的核心组件
JAX-WS(Java API for XML Web Services)是Java EE平台中用于构建Web服务的一套标准API。它的核心组件包括以下几个关键部分:
Service Endpoint Interface (SEI) :服务端点接口,作为Web服务的编程模型,定义了客户端可以调用的操作。 Service Implementation Bean :服务实现Bean,包含具体的业务逻辑,由JAX-WS运行时负责将SEI映射到这个Bean。 JAX-WS运行时 :负责处理SOAP消息的接收和发送,以及将XML数据映射为Java对象。 WSDL文件 :Web服务描述语言文件,由JAX-WS自动生成或可以手动编辑,用于描述Web服务接口和消息格式。 动态客户端和服务端 :JAX-WS允许动态生成客户端代理和服务端骨架代码,这使得客户端与Web服务的交互更加灵活。
4.1.2 JAX-WS与旧版API的对比
JAX-WS与早期的JAX-RPC相比,提供了更多的优势:
面向对象的API :JAX-WS基于Java语言特性,例如注解,提供了更加直观和简洁的方式来开发Web服务。 基于XML的轻量级协议 :JAX-WS主要使用SOAP协议进行通信,同时支持REST风格的服务,而JAX-RPC则较为依赖RMI-IIOP等复杂协议。 互操作性 :由于主要基于标准的XML协议,JAX-WS更容易与其他语言和平台的Web服务实现互操作。 更好的支持Web服务标准 :JAX-WS内建支持WSDL 1.1、SOAP 1.1/1.2等标准,并且提供了对WS-*标准的扩展支持。
4.2 实现Java WebService
4.2.1 创建和发布Web服务
要使用JAX-WS创建和发布Web服务,需要进行以下步骤:
定义SEI :首先定义一个服务端点接口(SEI),声明Web服务公开的操作。
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style = Style.RPC)
public interface GreetingService {
String sayHello(String name);
}
实现服务端点 :然后实现这个SEI,提供具体的业务逻辑。
import javax.jws.WebService;
@WebService(endpointInterface = "com.example.GreetingService")
public class GreetingServiceImpl implements GreetingService {
public String sayHello(String name) {
return "Hello, " + name + "!";
}
}
发布服务 :最后,通过JAX-WS运行时发布这个服务。
import javax.xml.ws.Endpoint;
public class GreetingServicePublisher {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/GreetingService", new GreetingServiceImpl());
}
}
4.2.2 消费Web服务
消费者客户端代码可以动态生成或静态编写:
动态客户端 :
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
public class GreetingServiceConsumer {
public static void main(String[] args) {
try {
URL wsdlDocumentLocation = new URL("http://localhost:8080/GreetingService?wsdl");
QName serviceName = new QName("http://example.com/", "GreetingService");
Service service = Service.create(wsdlDocumentLocation, serviceName);
GreetingService port = service.getPort(GreetingService.class);
String response = port.sayHello("World");
System.out.println(response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
静态客户端 :通过WSDL文件生成服务接口和客户端代理。
4.3 JAX-WS的高级特性
4.3.1 消息拦截器的使用
消息拦截器(Interceptors)允许在发送和接收SOAP消息之前和之后执行自定义代码。这对于日志记录、验证或消息转换非常有用。
创建拦截器类 :实现 javax.xml.ws.handler.Handler 接口。 注册拦截器 :在客户端和服务端分别注册拦截器。
import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.Handler;
import javax.xml.soap.SOAPMessage;
import java.util.Set;
import java.util.HashSet;
public class CustomInterceptor implements Handler
@Override
public boolean handleMessage(SOAPMessageContext context) {
// 处理消息的逻辑
return true;
}
@Override
public Set
return new HashSet<>();
}
}
// 注册拦截器
Endpoint.publish("http://localhost:8080/GreetingService", new GreetingServiceImpl());
((javax.xml.ws.Endpoint) endpoint).getBinding().setHandlerChain(
Arrays.asList(new CustomInterceptor()));
4.3.2 异常处理和事务管理
在Java WebService开发中,JAX-WS也提供了异常处理和事务管理的机制。
异常处理 :通过在SEI中声明抛出的异常类型,JAX-WS运行时会自动将这些异常转换为SOAP Faults。 事务管理 :对于需要事务保证的操作,可以通过在方法上使用 @TransactionAttribute 注解来控制事务行为。
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.transaction.Transactional;
import javax.transaction.UserTransaction;
import javax.xml.ws.WebServiceException;
@WebService
public class TransactionalService {
@Resource
private UserTransaction userTransaction;
@Transactional
public void doTransactionWork() throws WebServiceException {
try {
userTransaction.begin();
// 业务逻辑操作
userTransaction.commit();
} catch (Exception e) {
userTransaction.rollback();
throw new WebServiceException("Transaction failed", e);
}
}
}
通过这些高级特性的使用,开发者能够更好地控制Web服务的行为,提高Web服务的可靠性和可维护性。在Java WebService开发中,JAX-WS提供了强大的工具集合,使得整个开发过程更加高效和规范。
5. Java 6环境下的WebService开发
Java 6作为Java开发历史上的一个重要里程碑,它对WebService的支持和优化为Java开发者提供了更加强大和方便的开发工具。Java 6不仅预置了对SOAP和XML处理的支持,还通过JAX-WS简化了WebService的开发流程。本章将深入探讨Java 6环境下的WebService开发,包括它所支持的API、环境配置以及部署Web服务的实践案例。
5.1 Java 6对WebService的支持
5.1.1 Java 6中的WebService API
Java 6在Java EE 5规范的基础上提供了更加完善的WebService API。在Java SE 6中引入了JAX-WS 2.0,这是一个基于Java的SOAP服务开发框架,支持注释驱动的开发方式,使得开发者能以更加简洁的代码实现Web服务。JAX-WS允许开发者通过定义服务接口以及相应的实现类来创建Web服务,同时提供了工具来自动生成客户端代码。
JAX-WS核心组件包括了 javax.jws.WebService 注解,它被用来定义Web服务类和方法; javax.xml.ws.Service 类用于动态调用Web服务;而 javax.xml.ws.Endpoint 类则是用来发布Web服务的。通过这些核心组件,Java 6为开发者提供了一个完整的开发环境,用于构建、部署和访问SOAP Web服务。
5.1.2 Java 6环境配置与Web服务部署
在Java 6环境下配置开发环境相对简单,通常只需要下载并安装JDK 6,并在开发IDE(如Eclipse或IntelliJ IDEA)中配置好相关的JDK版本即可。大多数现代IDE都内置了对Java 6的支持,因此,大多数的配置工作可以由IDE自动完成。
对于Web服务的部署,Java 6支持通过内置的容器来运行Web服务,但更常见的是使用像Apache Tomcat这样的Web服务器或Java EE应用服务器,如WildFly或Payara等。在部署时,开发者需要打包Web服务为WAR文件,并通过服务器提供的管理工具或者直接通过部署目录来完成部署。
5.2 Java 6环境下的实践案例
5.2.1 开发环境的搭建
搭建Java 6的开发环境通常涉及以下步骤:
下载并安装JDK 6。 配置环境变量 JAVA_HOME 以及更新 PATH 变量,确保命令行工具如 java 和 javac 能被正确识别。 安装并设置一个IDE,比如Eclipse,使其支持Java 6,并配置JDK 6作为项目的运行环境。 (可选)安装一个轻量级的Web服务器,比如Tomcat,用于运行和测试Web服务。
5.2.2 实现RESTful风格的Web服务
Java 6除了提供SOAP风格的WebService支持之外,也支持RESTful风格的服务。以下是利用Java 6实现RESTful Web服务的基本步骤:
创建一个新的Java项目,并在其中创建一个新的Java类。 使用 @WebService 注解和 @WebMethod 注解来定义Web服务类和方法。 在类中编写业务逻辑,创建Web服务方法。 利用 Endpoint.publish 方法发布Web服务。
接下来是一个简单的RESTful风格Web服务的实现代码:
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style = Style.RPC)
public class SimpleWebService {
@WebMethod
public String sayHello(String name) {
return "Hello, " + name + "!";
}
}
public class Server {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/SimpleWebService", new SimpleWebService());
System.out.println("Web Service is ready!");
}
}
在上述代码中, SimpleWebService 类定义了一个简单的Web服务,它有一个 sayHello 方法用于返回问候语。 Server 类的 main 方法则负责发布这个服务到指定的URL。
开发者可以通过发送HTTP请求到 http://localhost:8080/SimpleWebService 来访问这个Web服务。为了简化Web服务的开发和部署,Java 6的环境配置和RESTful服务的实现提供了高效便捷的方式,使得开发者能够快速构建起稳定可靠的服务端应用。
6. CXF框架及其与Spring的整合
6.1 CXF框架基础
6.1.1 CXF框架的架构与特点
Apache CXF是一个开源的服务框架,它提供了一种简单的方式去构建和开发服务端和客户端的Web服务应用程序。CXF框架的架构设计注重于服务的创建、封装以及发布,使开发者能够从底层传输和数据编码的细节中解脱出来,更专注于业务逻辑的实现。CXF支持多种传输协议如HTTP、JMS等,同时提供与Spring框架的无缝集成,极大的增强了开发效率和应用程序的可维护性。
CXF的核心特点包括但不限于: - 对SOAP和RESTful两种风格的Web服务的支持。 - 支持多种数据绑定,例如JAXB、Aegis和XMLBeans。 - 具备强大的插件架构,方便集成各种中间件和工具。 - 提供完整的日志记录和性能监控功能。 - 对于安全和事务管理提供灵活的配置选项。
6.1.2 CXF在WebService开发中的角色
CXF框架在WebService开发中扮演着至关重要的角色。它为开发者提供了便捷的工具集,能够简化Web服务的创建和部署过程。在实际开发中,CXF承担着以下几个关键任务:
服务接口定义:CXF允许开发者通过简单的注解来定义服务接口,减少了繁琐的WSDL编写工作。 服务实现:通过CXF提供的API,开发者可以方便地将业务逻辑代码转换为Web服务。 服务端和客户端代码生成:CXF支持从Java接口自动生成服务端和客户端的代码,极大地提高了开发效率。 部署和发布:CXF提供了多种部署选项,包括独立的Java应用程序、Servlet容器和EJB容器等。
6.2 CXF与Spring的整合应用
6.2.1 Spring与CXF的集成机制
Spring框架以其轻量级和强大的依赖注入能力而闻名,当与CXF框架结合时,这种集成能够为开发者带来极大的便利。CXF与Spring的集成机制主要包括以下几点:
依赖注入:利用Spring的依赖注入功能,可以轻松地将CXF服务实例集成到Spring容器中,实现服务与业务逻辑的解耦。 配置简化:通过Spring的配置文件,可以集中管理CXF服务相关的配置,包括服务地址、拦截器、安全设置等。 事务管理:Spring提供的声明式事务管理能够与CXF服务无缝集成,简化事务控制的实现。
6.2.2 实现基于Spring的CXF Web服务
要实现一个基于Spring的CXF Web服务,开发者需要遵循一些基本步骤:
添加依赖 :在项目的构建配置文件中,如pom.xml中,添加Spring和CXF相关的依赖库。 xml
定义服务接口和实现 :创建Web服务接口以及该接口的实现类,使用Spring和CXF提供的注解来标识服务。 ```java @WebService public interface MyService { String sayHello(String name); }
@WebService(endpointInterface = "com.example.MyService") @SpringBeanName("myService") public class MyServiceImpl implements MyService { public String sayHello(String name) { return "Hello, " + name; } } ```
配置服务发布 :在Spring的配置文件中定义服务端点,并发布服务。 xml
启动和测试 :启动Spring容器,服务将自动发布,通过客户端调用服务进行测试。 java Endpoint.publish("http://localhost:8080/MyService", new MyServiceImpl());
通过以上步骤,我们可以快速搭建一个基于Spring和CXF的Web服务,并进行初步的测试。当然,这仅是一个基本的示例,实际项目中往往需要更多的配置和优化。
本文还有配套的精品资源,点击获取
简介:WebService是一种应用程序间交互技术,主要基于WSDL、SOAP和UDDI规范。本教程重点介绍在Java环境下,如何使用WSDL定义Web服务接口,如何利用SOAP协议进行消息传递,并指导如何通过JAX-WS和CXF框架实现Java WebService的开发。同时,本教程还会讲述如何与Spring框架整合,实现服务的生命周期管理。教程内容包含从基础概念到与Spring框架的整合,以及SOA架构风格的应用,帮助开发者掌握Java WebService的全貌。
本文还有配套的精品资源,点击获取