Java WebService 完整教程
目录
-
第一部分:基础概念
(图片来源网络,侵删)- 什么是 WebService?
- 为什么使用 WebService?
- WebService 的核心标准 (SOAP, WSDL, REST)
- Java 实现WebService 的两种主流技术:JAX-WS 和 JAX-RS
-
第二部分:使用 JAX-WS 创建和调用 SOAP WebService
- 什么是 JAX-WS 和 SOAP?
- 环境准备
- 实战 1:创建一个简单的 JAX-WS WebService (Provider端)
- 实战 2:调用 JAX-WS WebService (Consumer端)
- WSDL 文件详解
-
第三部分:使用 JAX-RS (RESTful) 创建和调用 WebService
- 什么是 REST 和 JAX-RS?
- 主流 JAX-RS 实现框架:Jersey, RESTEasy
- 实战 3:创建一个 RESTful WebService (Provider端)
- 实战 4:调用 RESTful WebService (Consumer端)
- 常用 HTTP 方法 和状态码
-
第四部分:进阶主题与最佳实践
- WebService 测试工具 (Postman, SoapUI)
- 数据格式 (XML vs. JSON)
- 异常处理
- 安全性考虑
第一部分:基础概念
什么是 WebService?
WebService 是一种跨编程语言、跨操作系统的远程调用技术,它允许不同平台上的应用程序通过标准的 HTTP 协议进行通信和数据交换,你可以把它想象成一个“网络上的函数”,一个应用程序可以调用另一个应用程序提供的服务。

为什么使用 WebService?
- 系统集成:将不同技术栈(如 Java, .NET, Python)构建的应用系统连接起来。
- 跨平台通信:由于基于 XML 和 HTTP,WebService 具有良好的通用性。
- 可重用性:将通用的业务逻辑封装成 WebService,供多个客户端复用。
- 松耦合:服务提供方和消费方只需要约定好接口(WSDL 或 API 文档),而不需要关心对方的具体实现技术。
WebService 的核心标准
-
SOAP (Simple Object Access Protocol)
- 一种基于 XML 的协议,用于在 Web 上交换结构化信息。
- 它非常重量级,有严格的规范(信封、头体、错误处理等)。
- 消息格式是 XML,通常通过 HTTP 或 SMTP 传输。
- 优点:安全、可靠、标准化程度高。
- 缺点:数据冗余大,解析复杂,性能相对较低。
-
WSDL (Web Services Description Language)
- 一个基于 XML 的语言,用于描述 WebService 的接口。
- 它就像WebService的“说明书”,定义了服务的地址、可用的方法、方法的参数、参数类型以及返回值类型等。
- 客户端可以通过 WSDL 文件自动生成调用服务的代码(客户端存根)。
-
REST (Representational State Transfer)
- 不是一个标准,而是一种软件架构风格。
- 它更轻量级,通常使用 HTTP 协议本身的方法(GET, POST, PUT, DELETE)来对资源进行操作。
- 数据格式通常为 JSON 或 XML,JSON 更为流行。
- 优点:简单、高效、易于理解和扩展,非常适合移动端和 Web 前后端分离。
- 缺点:无状态,缺少像 SOAP 那样的标准安全机制(但可以通过 HTTPS 等手段弥补)。
Java 实现WebService 的两种主流技术
-
JAX-WS (Java API for XML Web Services)
(图片来源网络,侵删)- Java 官方定义的一套用于创建 SOAP WebService 的 API。
- 它是 Java EE 的一部分,现在也包含在 Java SE 中。
- 主要用于构建传统的、企业级的、需要强契约和可靠性的 SOAP 服务。
-
JAX-RS (Java API for RESTful Web Services)
- Java 官方定义的一套用于创建 RESTful WebService 的 API。
- 它只提供一套规范,具体的实现由第三方提供,如 Jersey (Oracle 官方参考实现), RESTEasy (JBoss), Apache CXF。
- 目前是构建现代 WebService(尤其是微服务、API)的主流选择。
第二部分:使用 JAX-WS 创建和调用 SOAP WebService
什么是 JAX-WS 和 SOAP?
JAX-WS 是用于开发 SOAP 服务的 Java 标准,开发者只需要用 Java 注解来标注一个类是一个服务端点,JAX-WS 运行时就会自动帮你处理底层的 SOAP 消息生成、解析和 HTTP 传输。
环境准备
你需要安装 JDK 8 或更高版本,JDK 自带了 wsimport 命令,用于根据 WSDL 文件生成客户端代码。
实战 1:创建一个简单的 JAX-WS WebService (Provider端)
我们将创建一个提供用户信息查询的 WebService。
步骤 1:创建 Maven 项目
在 pom.xml 中添加依赖(虽然 JAX-WS 是 JDK 自带的,但使用 javax.xml.ws 注解需要这个 API):
<dependencies>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
步骤 2:创建服务端点接口
这是一个普通的 Java 接口,用 @WebService 注解标记。
// src/main/java/com/example/service/UserService.java
package com.example.service;
import javax.jws.WebService;
import javax.jws.WebMethod;
// @WebService 声明这是一个 WebService 接口
@WebService
public interface UserService {
// @WebMethod 声明这是一个对外暴露的方法
@WebMethod
public String getUserInfo(String userId);
}
步骤 3:创建服务端点实现类
实现上面的接口,并处理具体的业务逻辑。
// src/main/java/com/example/service/UserServiceImpl.java
package com.example.service;
import javax.jws.WebService;
// @WebService(endpointInterface = "com.example.service.UserService")
// 指定这个实现类是哪个接口的实现。
// 如果不写,JAX-WS 会默认将类名去掉 "Impl" 后的接口作为服务端点接口。
@WebService(endpointInterface = "com.example.service.UserService")
public class UserServiceImpl implements UserService {
@Override
public String getUserInfo(String userId) {
System.out.println("Server received request for user: " + userId);
if ("001".equals(userId)) {
return "ID: 001, Name: Zhang San, Email: zhangsan@example.com";
} else {
return "User not found";
}
}
}
步骤 4:发布 WebService
创建一个主类来启动一个内嵌的 HTTP 服务器并发布我们的服务。
// src/main/java/com/example/publisher/UserServicePublisher.java
package com.example.publisher;
import com.example.service.UserServiceImpl;
import javax.xml.ws.Endpoint;
public class UserServicePublisher {
public static void main(String[] args) {
// 定义服务的访问地址
String address = "http://localhost:8080/ws/user";
// 创建服务实现对象
UserServiceImpl userServiceImpl = new UserServiceImpl();
// 发布服务
Endpoint.publish(address, userServiceImpl);
System.out.println("WebService is published at: " + address);
}
}
步骤 5:运行和测试
- 运行
UserServicePublisher的main方法。 - 打开浏览器,访问
http://localhost:8080/ws/user?wsdl。 - 如果看到一个 XML 文件(WSDL),说明服务发布成功!
实战 2:调用 JAX-WS WebService (Consumer端)
现在我们创建一个客户端来调用刚刚发布的服务。
步骤 1:使用 wsimport 生成客户端代码
打开命令行(CMD 或 PowerShell),进入你的项目目录(src/main/java 的上一级),执行以下命令:
wsimport -p com.example.client -keep http://localhost:8080/ws/user?wsdl
-p com.example.client: 指定生成的客户端代码所在的包名。-keep: 保留生成的源文件,方便查看。...wsdl: WSDL 文件的地址。
执行后,会在 com/example/client 目录下生成一堆
