Java WebService 完整教程
目录
-
第一部分:基础概念
(图片来源网络,侵删)- 什么是 WebService?
- 为什么使用 WebService?
- WebService 的核心标准
- Java 实现WebService的两种主流方式
-
第二部分:使用 JAX-WS 开发 WebService (SOAP)
- JAX-WS 简介
- 示例1:无注解的 POJO 方式 (适合理解底层)
- 示例2:使用注解的快速开发方式
- 如何发布和调用 WebService
-
第三部分:使用 JAX-RS 开发 WebService (RESTful)
- REST 与 RESTful 简介
- JAX-RS 简介 (Jakarta RESTful Web Services)
- 示例:使用 Jersey 实现一个简单的 RESTful 服务
- 如何发布和调用 RESTful 服务
-
第四部分:高级主题与工具
- WebService 框架对比
- 测试工具介绍 (Postman, SoapUI)
- WSDL 和 Schema (XSD) 简介
-
第五部分:总结与学习路径
(图片来源网络,侵删)
第一部分:基础概念
什么是 WebService?
WebService 是一种跨编程语言、跨操作系统的远程调用技术,它允许不同的应用程序通过网络进行交互,就像调用本地方法一样简单,其核心思想是“服务”,即一个应用程序向其他应用程序提供特定的功能。
为什么使用 WebService?
- 跨平台/跨语言:WebService 基于 XML、HTTP 等标准,任何语言(Java, Python, C# 等)和平台(Windows, Linux, macOS)都可以开发和调用。
- 松耦合:客户端和服务端不需要了解彼此的内部实现细节,只需通过约定的接口(WSDL 或 API 文档)进行通信。
- 基于标准:遵循 W3C 等国际标准,具有良好的互操作性和可扩展性。
- 穿越防火墙:通常使用 HTTP/HTTPS 协议通信,可以轻松穿过大多数防火墙。
WebService 的核心标准
- SOAP (Simple Object Access Protocol):一种基于 XML 的协议,用于在 Web 上交换结构化信息,它定义了一套严格的信封格式、编码规则和 RPC (Remote Procedure Call) 规范,消息格式较重,但功能强大、安全可靠。
- WSDL (Web Services Description Language):一个 XML 文件,用于描述 WebService 的接口,它告诉客户端:服务在哪里(URL)、叫什么名字、提供了哪些方法、每个方法的参数和返回值是什么类型等,客户端通过 WSDL 文件来生成调用代码。
- UDDI (Universal Description, Discovery, and Integration):一个基于 XML 的注册中心,用于发布和发现 WebService,可以把它理解为“WebService 的黄页”,目前使用较少。
Java 实现WebService的两种主流方式
Java EE (Jakarta EE) 提供了两种主要的 API 来创建 WebService:
- JAX-WS (Java API for XML Web Services):用于开发 SOAP 风格的 WebService,这是 Java 中最传统、最成熟的 WebService 标准。
- JAX-RS (Java API for RESTful Web Services):用于开发 RESTful 风格的 WebService,随着移动互联网的兴起,RESTful API 已成为当前的主流。
第二部分:使用 JAX-WS 开发 WebService (SOAP)
JAX-WS 是 Java 官方推荐的 SOAP WebService 开发标准,它简化了 SOAP 消息的创建和解析。
JAX-WS 简介
JAX-WS 允许你通过简单的 Java 注解将一个普通的 Java 类(POJO)变成一个 WebService 端点,客户端也可以通过 WSDL 文件生成客户端存根代码,像调用本地方法一样调用远程服务。

示例2:使用注解的快速开发方式 (推荐)
这是目前最主流、最简单的方式。
步骤 1:创建一个动态 Web 项目
在 Eclipse 或 IntelliJ IDEA 中创建一个名为 JaxWsDemo 的 Dynamic Web 项目。
步骤 2:编写服务端代码
创建一个普通的 Java 类,并使用 JAX-WS 的注解来标记它。
src/com/example/HelloServiceImpl.java
package com.example;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
// @WebService 注解将这个类标记为一个 WebService
@WebService
// @SOAPBinding 定义了 SOAP 的风格,默认是 DOCUMENT
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
public class HelloServiceImpl {
// @WebMethod 注解将一个公共方法暴露为 WebService 的操作
// 默认所有 public 方法都会被暴露,显式声明可以更好地控制
@WebMethod
public String sayHello(@WebParam(name = "name") String name) {
System.out.println("WebService sayHello 方法被调用,参数: " + name);
return "你好, " + name + " ! 欢迎使用 JAX-WS WebService.";
}
@WebMethod
public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b) {
return a + b;
}
}
步骤 3:发布 WebService
我们需要一个“发布器”将这个服务类发布到网络上的某个地址,最简单的发布器是 Endpoint。
创建一个发布类:
src/com/example/Publisher.java
package com.example;
import javax.xml.ws.Endpoint;
public class Publisher {
public static void main(String[] args) {
// 1. 定义服务的访问地址
String address = "http://localhost:8888/ws/hello";
// 2. 创建服务实例
HelloServiceImpl helloService = new HelloServiceImpl();
// 3. 发布服务
System.out.println("WebService 正在启动...");
System.out.println("服务访问地址: " + address);
Endpoint.publish(address, helloService);
System.out.println("WebService 启动成功!");
}
}
运行 Publisher 的 main 方法。
你的 WebService 已经发布成功了!你可以通过浏览器访问 http://localhost:8888/ws/hello?wsdl 来查看服务的 WSDL 文件,如果看到一个 XML 文件,说明发布成功。
步骤 4:生成并调用客户端
在实际开发中,客户端和服务端通常是分离的,客户端如何调用这个服务?
方法 A:使用命令行工具 wsimport (推荐)
-
打开命令行,进入你的项目根目录(或者任意一个你喜欢的地方)。
-
执行以下命令,根据 WSDL 文件生成客户端代码:
wsimport -keep -p com.example.client http://localhost:8888/ws/hello?wsdl
-keep: 生成源代码。-p com.example.client: 指定生成的代码包名。- 后面是 WSDL 文件的 URL。
-
执行后,会在
com.example.client包下生成一堆 Java 文件(包括HelloServiceImpl、HelloServiceImplService、HelloServiceImplType等)。 -
编写客户端代码来调用服务:
创建一个新的 Java 类
Client.java:package com.example.client; public class Client { public static void main(String[] args) { // 1. 创建服务视图 (Service) // HelloServiceImplService 是 wsimport 生成的类 HelloServiceImplService service = new HelloServiceImplService(); // 2. 获取服务端点 (Port) // Hello 是 wsimport 生成的接口,代表服务的远程接口 Hello helloPort = service.getHelloServiceImplPort(); // 3. 像调用本地方法一样调用远程方法 String result = helloPort.sayHello("张三"); System.out.println("调用WebService返回的结果: " + result); int sum = helloPort.add(10, 20); System.out.println("调用WebService返回的结果: " + sum); } }运行
Client的main方法,你将看到服务端的打印信息和客户端的调用结果。
第三部分:使用 JAX-RS 开发 WebService (RESTful)
REST (Representational State Transfer) 是一种软件架构风格,而不是一个标准,RESTful WebService 是基于 REST 风格设计的 WebService,它更轻量、更简单,通常使用 JSON 或 XML 作为数据交换格式,非常适合移动端和前后端分离的 Web 应用。
REST 与 RESTful 简介
- 资源:REST 的核心是“资源”,一切皆资源,例如
