- 环境准备:创建 Maven 项目并添加依赖。
- 编写资源类:创建一个提供 Web Service 方法的 Java 类。
- 配置和发布:配置 Web 服务器并发布我们的服务。
- 测试:使用浏览器和工具来测试我们的 Web Service。
我们将创建一个非常简单的用户管理 Web Service,它提供以下功能:

GET /users/{id}:根据 ID 获取单个用户信息。GET /users:获取所有用户列表。POST /users:创建一个新用户。
第一步:环境准备
我们将使用 Maven 来管理项目依赖,这非常方便。
-
创建 Maven 项目 在你的 IDE(如 IntelliJ IDEA 或 Eclipse)中,创建一个新的 Maven 项目,确保选择
maven-archetype-webapp模板。 -
添加 Jersey 依赖 打开
pom.xml文件,添加 Jersey 的核心依赖,Jersey 3.x 需要 Jakarta EE 9+ 的 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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>java-webservice-example</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>java-webservice-example Maven Webapp</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <jersey.version>3.1.2</jersey.version> </properties> <dependencies> <!-- JAX-RS API (Jakarta EE 9) --> <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> <!-- 用于 JSON 序列化的依赖 --> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-binding</artifactId> <version>${jersey.version}</version> </dependency> </dependencies> <build> <finalName>java-webservice-example</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins> </build> </project>jakarta.jakartaee-api: Jakarta EE API,由 Web 容器(如 Tomcat)提供,scope 设为provided。jersey-container-servlet: Jersey 的 Servlet 集成容器,用于在 Tomcat 等 Servlet 容器中运行。jersey-media-json-binding: Jersey 的 JSON 支持,用于自动将 Java 对象和 JSON 格式进行转换。
第二步:编写资源类
这是 Web Service 的核心,它定义了服务的端点(URL)和操作(HTTP 方法)。

-
创建 User 模型类 首先创建一个简单的
UserPOJO (Plain Old Java Object)。// src/main/java/com/example/model/User.java package com.example.model; public class User { private int id; private String name; private String email; // 构造函数、Getter 和 Setter public User() {} public User(int id, String name, String email) { this.id = id; this.name = name; this.email = email; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}'; } } -
创建 UserService 资源类 这个类将处理所有的 HTTP 请求。
// src/main/java/com/example/service/UserService.java package com.example.service; import com.example.model.User; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @Path("/users") // 定义资源的基路径 @Produces(MediaType.APPLICATION_JSON) // 默认返回 JSON 格式 public class UserService { // 使用一个内存 Map 来模拟数据库 private static final ConcurrentMap<Integer, User> userDB = new ConcurrentHashMap<>(); private static int currentId = 1; static { // 初始化一些数据 userDB.put(currentId, new User(currentId++, "Alice", "alice@example.com")); userDB.put(currentId, new User(currentId++, "Bob", "bob@example.com")); } // GET /users/{id} - 获取单个用户 @GET @Path("/{id}") public User getUserById(@PathParam("id") int id) { User user = userDB.get(id); if (user == null) { // 如果用户不存在,抛出 404 Not Found 异常 throw new NotFoundException("User with ID " + id + " not found."); } return user; } // GET /users - 获取所有用户 @GET public List<User> getAllUsers() { return new ArrayList<>(userDB.values()); } // POST /users - 创建新用户 @POST @Consumes(MediaType.APPLICATION_JSON) // 消费 JSON 格式的请求体 public Response createUser(User user) { // 简单校验 if (user.getName() == null || user.getEmail() == null) { return Response.status(Response.Status.BAD_REQUEST) .entity("Name and Email cannot be null.").build(); } user.setId(currentId++); userDB.put(user.getId(), user); // 返回 201 Created 状态码,并在 Location 头中指向新创建的资源 return Response.status(Response.Status.CREATED) .entity(user) .header("Location", "/users/" + user.getId()) .build(); } }代码解释:
@Path("/users"): 定义了该资源类的基 URL,如果你的应用部署在http://localhost:8080/your-app,那么这个服务的 URLhttp://localhost:8080/your-app/users。@GET,@POST: 表示 HTTP 方法。@GET用于获取数据,@POST用于创建数据。@Path("/{id}"): 定义在基路径下的子路径。{id}是一个路径参数。@PathParam("id"): 将 URL 中的id值注入到方法的id参数中。@Produces(MediaType.APPLICATION_JSON): 声明该方法可以生成 JSON 格式的响应,Jersey 会自动将 Java 对象序列化为 JSON。@Consumes(MediaType.APPLICATION_JSON): 声明该方法可以消费(接收)JSON 格式的请求体,Jersey 会自动将请求体中的 JSON 反序列化为 Java 对象。Response: 用于构建 HTTP 响应,可以设置状态码、响应头和响应体。
第三步:配置和发布 Web Service
我们需要告诉 Jersey 框架哪个类是我们的资源,并配置 Web 服务器来加载它。

-
创建 Jersey 应用程序配置类 这个类用于注册我们的资源。
// src/main/java/com/example/config/JerseyConfig.java package com.example.config; import com.example.service.UserService; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.servlet.ServletContainer; import org.glassfish.jersey.servlet.ServletProperties; import jakarta.servlet.Servlet; // 这是 Jersey 3.x 推荐的配置方式 public class JerseyConfig extends ResourceConfig { public JerseyConfig() { // 注册资源类 register(UserService.class); } } -
配置
web.xml文件 在src/main/webapp/WEB-INF/web.xml中,配置ServletContainer来加载我们的JerseyConfig。<!-- src/main/webapp/WEB-INF/web.xml --> <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> <!-- 指定 Jersey 配置类 --> <init-param> <param-name>jakarta.ws.rs.Application</param-name> <param-value>com.example.config.JerseyConfig</param-value> </init-param> <!-- 设置 Servlet 映射的路径 --> <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>org.glassfish.jersey.servlet.ServletContainer: 这是 Jersey 的核心 Servlet。jakarta.ws.rs.Application: 指向我们的配置类JerseyConfig。url-pattern>/api/*</url-pattern: 所有以/api/开头的请求都会由 Jersey 处理,这意味着我们之前定义的@Path("/users")最终会映射到/api/users。
第四步:部署和测试
-
部署到 Tomcat
- 确保你已安装并配置好 Tomcat 服务器(版本 10.x 或更高,因为它支持 Jakarta EE 9)。
- 在 Maven 项目根目录下,运行
mvn clean package命令来打包项目。 - 将生成的
target/java-webservice-example.war文件复制到 Tomcat 的webapps目录下。 - 启动 Tomcat 服务器。
-
测试 Web Service 打开浏览器或使用 API 测试工具(如 Postman、curl)来访问你的服务。
-
获取所有用户 (
GET /api/users)- URL:
http://localhost:8080/java-webservice-example/api/users - 浏览器访问: 直接在浏览器地址栏输入上述 URL。
- 预期响应 (JSON):
[ { "id": 1, "name": "Alice", "email": "alice@example.com" }, { "id": 2, "name": "Bob", "email": "bob@example.com" } ]
- URL:
-
获取单个用户 (
GET /api/users/1)- URL:
http://localhost:8080/java-webservice-example/api/users/1 - 预期响应 (JSON):
{ "id": 1, "name": "Alice", "email": "alice@example.com" }
- URL:
-
创建新用户 (
POST /api/users)- 工具: 使用 Postman 或
curl。 - URL:
http://localhost:8080/java-webservice-example/api/users - Method:
POST - Headers:
Content-Type: application/json - Body (raw JSON):
{ "name": "Charlie", "email": "charlie@example.com" } - 预期响应 (状态码 201 Created, Body):
{ "id": 3, "name": "Charlie", "email": "charlie@example.com" }
- 工具: 使用 Postman 或
-
总结与进阶
通过以上步骤,你已经成功创建并运行了一个基础的 Java Web Service,这是一个非常标准和健壮的起点。
进阶方向:
- 使用 Spring Boot: Spring Boot 提供了更简化的配置和更强大的生态系统来创建 Web Service,是目前企业级应用的主流选择,它同样支持 JAX-RS,但更常用的是其自带的
@RestController。 - 数据库集成: 将
ConcurrentHashMap替换为真实的数据库(如 MySQL, PostgreSQL),使用 JPA (Jakarta Persistence API) 或 MyBatis 进行数据访问。 - 安全性: 添加认证和授权,例如使用 JWT (JSON Web Tokens) 或 OAuth2。
- API 文档: 集成 Swagger (OpenAPI) 来自动生成和展示 API 文档,这对于前后端分离开发至关重要。
