杰瑞科技汇

Java实现Webservice实例的关键步骤是什么?

  1. 环境准备:创建 Maven 项目并添加依赖。
  2. 编写资源类:创建一个提供 Web Service 方法的 Java 类。
  3. 配置和发布:配置 Web 服务器并发布我们的服务。
  4. 测试:使用浏览器和工具来测试我们的 Web Service。

我们将创建一个非常简单的用户管理 Web Service,它提供以下功能:

Java实现Webservice实例的关键步骤是什么?-图1
(图片来源网络,侵删)
  • GET /users/{id}:根据 ID 获取单个用户信息。
  • GET /users:获取所有用户列表。
  • POST /users:创建一个新用户。

第一步:环境准备

我们将使用 Maven 来管理项目依赖,这非常方便。

  1. 创建 Maven 项目 在你的 IDE(如 IntelliJ IDEA 或 Eclipse)中,创建一个新的 Maven 项目,确保选择 maven-archetype-webapp 模板。

  2. 添加 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 方法)。

Java实现Webservice实例的关键步骤是什么?-图2
(图片来源网络,侵删)
  1. 创建 User 模型类 首先创建一个简单的 User POJO (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 + '\'' +
                    '}';
        }
    }
  2. 创建 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,那么这个服务的 URL http://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 服务器来加载它。

Java实现Webservice实例的关键步骤是什么?-图3
(图片来源网络,侵删)
  1. 创建 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);
        }
    }
  2. 配置 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

第四步:部署和测试

  1. 部署到 Tomcat

    • 确保你已安装并配置好 Tomcat 服务器(版本 10.x 或更高,因为它支持 Jakarta EE 9)。
    • 在 Maven 项目根目录下,运行 mvn clean package 命令来打包项目。
    • 将生成的 target/java-webservice-example.war 文件复制到 Tomcat 的 webapps 目录下。
    • 启动 Tomcat 服务器。
  2. 测试 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"
          }
        ]
    • 获取单个用户 (GET /api/users/1)

      • URL: http://localhost:8080/java-webservice-example/api/users/1
      • 预期响应 (JSON):
        {
          "id": 1,
          "name": "Alice",
          "email": "alice@example.com"
        }
    • 创建新用户 (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"
        }

总结与进阶

通过以上步骤,你已经成功创建并运行了一个基础的 Java Web Service,这是一个非常标准和健壮的起点。

进阶方向:

  1. 使用 Spring Boot: Spring Boot 提供了更简化的配置和更强大的生态系统来创建 Web Service,是目前企业级应用的主流选择,它同样支持 JAX-RS,但更常用的是其自带的 @RestController
  2. 数据库集成: 将 ConcurrentHashMap 替换为真实的数据库(如 MySQL, PostgreSQL),使用 JPA (Jakarta Persistence API) 或 MyBatis 进行数据访问。
  3. 安全性: 添加认证和授权,例如使用 JWT (JSON Web Tokens) 或 OAuth2。
  4. API 文档: 集成 Swagger (OpenAPI) 来自动生成和展示 API 文档,这对于前后端分离开发至关重要。
分享:
扫描分享到社交APP
上一篇
下一篇