- JAX-WS (Java API for XML Web Services):这是 Java 官方、比较传统的技术,通常与 Servlet 容器(如 Tomcat)配合使用,它基于 SOAP (Simple Object Access Protocol) 协议。
- JAX-RS (Java API for RESTful Web Services):这是创建 RESTful Web 服务的标准,它基于 HTTP 协议,使用 JSON 或 XML 等格式传输数据,是目前更流行、更轻量级的选择。
下面我将分别详细介绍如何使用这两种技术创建一个简单的 WebService。

准备工作:构建环境
你需要一个 Java 开发环境(JDK)和一个构建工具(如 Maven),Maven 可以极大地简化依赖管理和项目打包。
- JDK: 8 或更高版本
- Maven: 3.6 或更高版本
- IDE: IntelliJ IDEA 或 Eclipse (都内置了对 Maven 和 WebService 的支持)
- Servlet 容器: Apache Tomcat (用于部署 JAX-WS 或 JAX-RS 应用)
使用 JAX-WS (SOAP WebService)
JAX-WS 是 Java EE 的一部分,你可以通过注解来快速定义一个 WebService。
步骤 1: 创建 Maven 项目
在你的 IDE 中创建一个 Maven 项目,并选择 maven-archetype-webapp 模板,这会为你生成一个标准的 Web 项目结构。
pom.xml 文件:
JDK 8+ 内置了 JAX-WS API,所以通常不需要额外添加依赖,但为了确保兼容性和使用一些工具(如 wsimport),我们可以添加 jaxws-api。

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>jax-ws-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- JAX-WS API (可选,JDK 8+ 已包含) -->
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>
步骤 2: 创建 WebService 端点类
这是一个普通的 Java 类,通过 JAX-WS 注解来暴露其方法为 WebService 操作。
src/main/java/com/example/HelloWorld.java
package com.example;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/**
* @WebService: 将一个类标记为 WebService 端点。
* name: WebService 的名称
* targetNamespace: 命名空间,通常是服务的包名的反转
*/
@WebService(name = "HelloWorld", targetNamespace = "http://example.com/")
@SOAPBinding(style = SOAPBinding.Style.RPC) // 使用 RPC 风格
public class HelloWorld {
/**
* @WebMethod: 将一个方法标记为 WebService 的操作。
* exclude: 可以排除某个 public 方法
*/
@WebMethod
public String sayHello(@WebParam(name = "name") String name) {
return "Hello, " + name + "!";
}
@WebMethod
public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b) {
return a + b;
}
}
步骤 3: 创建发布 WebService 的 Endpoint
你需要一个类来启动并发布你的 WebService,这可以在 Servlet 的 contextInitialized 方法中完成。
src/main/java/com/example/EndpointPublisher.java

package com.example;
import javax.xml.ws.Endpoint;
public class EndpointPublisher {
public static void main(String[] args) {
// 发布地址
String address = "http://localhost:8080/jax-ws-demo/HelloWorld";
// 发布服务
Endpoint.publish(address, new HelloWorld());
System.out.println("WebService published successfully at: " + address);
}
}
步骤 4: 部署到 Tomcat 并测试
- 打包项目: 在项目根目录运行
mvn clean package,这会在target目录下生成一个.war文件。 - 部署到 Tomcat: 将生成的
jax-ws-demo-1.0-SNAPSHOT.war复制到 Tomcat 的webapps目录下。 - 启动 Tomcat: 运行 Tomcat 的
startup.bat(Windows) 或startup.sh(Linux/Mac)。 - 访问 WSDL: 打开浏览器,访问
http://localhost:8080/jax-ws-demo/HelloWorld?wsdl,如果看到一个 XML 文件,说明你的 WebService 已经成功发布。 - 测试: 你可以使用 IDE 的 WebService 客户端工具(如 IntelliJ IDEA 的 "Generate WSDL Client")或者专业的 SOAP 客户端(如 SoapUI)来调用
sayHello方法。
使用 JAX-RS (RESTful WebService)
JAX-RS 是创建 REST 服务的标准,更现代、更灵活,我们使用 Jersey 作为 JAX-RS 的实现框架,这是最流行的选择之一。
步骤 1: 创建 Maven 项目
同样,创建一个 Maven Web 项目 (maven-archetype-webapp)。
pom.xml 文件:
我们需要添加 Jersey 的核心依赖。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>jax-rs-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jersey.version>3.1.2</jersey.version>
</properties>
<dependencies>
<!-- JAX-RS API -->
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>9.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Jersey 3.x 核心依赖 -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>
注意: Jersey 3.x 使用
jakarta.*包名,而 Jersey 2.x 使用javax.*,请根据你选择的 Jersey 版本调整依赖。
步骤 2: 创建 REST 资源类
这是 JAX-RS 的核心,它代表一个或多个相关的资源。
src/main/java/com/example/Resource.java
package com.example;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
/**
* @Path: 定义资源的基础 URI 路径。
* 所有 @Path 注解的值都会被连接起来。
*/
@Path("hello")
public class Resource {
/**
* @GET: 表示这个方法处理 HTTP GET 请求。
* @Produces: 定义方法可以产生的 MIME 类型,这里我们返回 JSON。
* @Path: 定义相对于类级别 @Path 的子路径。
* @QueryParam: 将 HTTP 查询参数(?name=...)绑定到方法参数。
*/
@GET
@Path("greeting")
@Produces(MediaType.APPLICATION_JSON)
public Response getGreeting(@QueryParam("name") String name) {
if (name == null || name.trim().isEmpty()) {
name = "Guest";
}
String message = "Hello, " + name + "!";
// 使用 JSON-P 或 JSON-B 来构建 JSON 对象
return Response.ok("{\"message\": \"" + message + "\"}").build();
}
/**
* @POST: 处理 HTTP POST 请求。
* @Consumes: 定义方法可以消费的 MIME 类型,这里我们接收 JSON。
* @PathParam: 将 URL 路径中的变量(/add/2/3)绑定到方法参数。
*/
@POST
@Path("add/{a}/{b}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response addNumbers(@PathParam("a") int a, @PathParam("b") int b) {
int sum = a + b;
return Response.ok("{\"result\": " + sum + "}").build();
}
}
步骤 3: 配置 Jersey Servlet
为了让 Jersey 能够处理 HTTP 请求,我们需要在 web.xml 中配置一个 Servlet 和 ServletContainer。
src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.example</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
</web-app>
jersey.config.server.provider.packages: 告诉 Jersey 在哪个包下查找 JAX-RS 资源类。url-pattern: 所有以/api/开头的请求都将由 Jersey 处理。
步骤 4: 部署到 Tomcat 并测试
- 打包项目: 运行
mvn clean package。 - 部署到 Tomcat: 将生成的
jax-rs-demo-1.0-SNAPSHOT.war复制到 Tomcat 的webapps目录。 - 启动 Tomcat。
- 测试:
- GET 请求: 打开浏览器或使用
curl访问http://localhost:8080/jax-rs-demo/api/hello/greeting?name=World,你应该会看到{"message": "Hello, World!"}。 - POST 请求: 使用
curl或 Postman 等工具发送 POST 请求。curl -X POST "http://localhost:8080/jax-rs-demo/api/hello/add/10/20"
你应该会看到
{"result": 30}。
- GET 请求: 打开浏览器或使用
总结与对比
| 特性 | JAX-WS (SOAP) | JAX-RS (REST) |
|---|---|---|
| 协议 | SOAP (基于 XML) | HTTP (GET, POST, PUT, DELETE 等) |
| 数据格式 | 主要是 XML | 主要是 JSON, 也可以是 XML, HTML 等 |
| 风格 | 面向操作 | 面向资源 |
| 标准化 | Java EE 标准的一部分 | Java EE 标准的一部分 |
| 复杂度 | 较高,有标准规范(WSDL, WS-*) | 较低,更灵活,更贴近 Web |
| 安全性 | 内置大量安全标准和扩展 | 通常依赖于 HTTP 标准(如 OAuth, JWT) |
| 适用场景 | 企业级应用、金融、电信等需要高安全性和严格契约的场景 | 移动应用后端、前后端分离的 Web 应用、公开 API |
如何选择?
- 如果你需要与传统的、基于 SOAP 的企业系统(如 .NET, SAP)集成,或者你的项目对安全性和事务性有极高的要求,JAX-WS 是一个不错的选择。
- 如果你正在构建一个现代化的、前后端分离的应用,或者需要为移动端提供 API,JAX-RS 几乎是必然的选择,因为它更轻量、更易于使用,并且与 Web 的原生风格更契合。
