杰瑞科技汇

Java webservice实例如何快速上手实现?

  1. 环境准备:配置 Maven 和 IDE(以 IntelliJ IDEA 为例)。
  2. 创建项目:使用 Maven 快速搭建项目骨架。
  3. 编写代码:创建一个简单的资源类,提供 Web Service 接口。
  4. 配置和运行:配置 Web 服务器(内嵌的 Jetty)并启动服务。
  5. 测试:使用浏览器和工具(如 Postman 或 curl)来调用和测试我们的 Web Service。

环境准备

在开始之前,请确保您已经安装并配置好以下环境:

Java webservice实例如何快速上手实现?-图1
(图片来源网络,侵删)
  • JDK 8 或更高版本
  • Maven 3.6 或更高版本
  • IDE(推荐 IntelliJ IDEA 或 Eclipse,社区版即可)

创建 Maven 项目

我们将使用 Maven 来管理项目依赖和构建过程。

  1. 打开您的 IDE(以 IntelliJ IDEA 为例)。
  2. 选择 File -> New -> Project...
  3. 在左侧选择 Maven,确保勾选 Create from archetype
  4. 在 archetype 列表中,选择 org.apache.maven.archetypes:maven-archetype-webapp,然后点击 Next
  5. 填写项目信息:
    • GroupId: com.example
    • ArtifactId: java-webservice-example
    • Version: 0-SNAPSHOT
    • Packaging: war (Web 应用归档格式)
  6. 点击 Finish,IDE 会自动为您下载 Maven 依赖并创建项目结构。

项目创建后,您会看到一个类似下面的目录结构:

java-webservice-example
├── pom.xml
└── src
    └── main
        ├── java
        │   └── (通常是空的)
        ├── resources
        │   └── (通常是空的)
        └── webapp
            ├── index.jsp
            └── WEB-INF
                └── web.xml

添加 Jersey 依赖

我们需要在 pom.xml 文件中添加 Jersey 的核心依赖,这些依赖会告诉我们的项目如何使用 Jersey 来创建和运行 Web Service。

打开 pom.xml 文件,在 <dependencies> 标签内添加以下内容:

Java webservice实例如何快速上手实现?-图2
(图片来源网络,侵删)
<dependencies>
    <!-- JUnit 5 (如果项目模板自带,可以保留) -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.8.2</version>
        <scope>test</scope>
    </dependency>
    <!-- Jersey 核心依赖 -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>3.1.2</version> <!-- 建议使用较新版本 -->
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>3.1.2</version>
    </dependency>
    <!-- 用于将 Jersey 应用部署到内嵌服务器的依赖 -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-jetty-http</artifactId>
        <version>3.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-webapp</artifactId>
        <version>11.0.15</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>11.0.15</version>
    </dependency>
</dependencies>

说明

  • jersey-container-servlet: 用于将 Jersey 集成到 Servlet 容器中。
  • jersey-hk2: Jersey 的依赖注入框架。
  • jersey-container-jetty-httpjetty-*: 用于启动一个内嵌的 Jetty 服务器,这样我们就不需要单独安装 Tomcat 或其他服务器了。

编写 Web Service 代码

现在我们来创建核心的 Web Service 代码。

  1. 创建资源类 (Resource Class)

    src/main/java 目录下,创建一个包,com.example.service,在该包中创建一个名为 UserResource.java 的 Java 类。

    Java webservice实例如何快速上手实现?-图3
    (图片来源网络,侵删)

    这个类将使用 JAX-RS 的注解来定义一个 Web Service 端点。

    package com.example.service;
    import javax.ws.rs.*;
    import javax.ws.rs.core.MediaType;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.ConcurrentMap;
    import java.util.concurrent.atomic.AtomicInteger;
    /**
     * 用户资源类,提供用户相关的 RESTful API
     * Path 定义了该资源的基 URL 路径
     * Produces 定义了该资源能产生的媒体类型,这里是 JSON
     */
    @Path("/users")
    @Produces(MediaType.APPLICATION_JSON)
    public class UserResource {
        // 使用内存数据库来模拟数据存储
        private final ConcurrentMap<Integer, User> userStore = new ConcurrentHashMap<>();
        private final AtomicInteger idCounter = new AtomicInteger();
        public UserResource() {
            // 初始化一些数据
            User user1 = new User(1, "张三", "zhangsan@example.com");
            User user2 = new User(2, "李四", "lisi@example.com");
            userStore.put(user1.getId(), user1);
            userStore.put(user2.getId(), user2);
            idCounter.set(3); // 下一个用户的ID将是3
        }
        /**
         * 获取所有用户
         * GET /users
         * @return 用户列表
         */
        @GET
        public List<User> getAllUsers() {
            return new ArrayList<>(userStore.values());
        }
        /**
         * 根据ID获取单个用户
         * GET /users/{id}
         * @param id 用户ID
         * @return 用户对象
         */
        @GET
        @Path("/{id}")
        public User getUserById(@PathParam("id") int id) {
            User user = userStore.get(id);
            if (user == null) {
                // 如果用户不存在,抛出 404 Not Found 异常
                throw new NotFoundException("User with id " + id + " not found.");
            }
            return user;
        }
        /**
         * 创建一个新用户
         * POST /users
         * @param user 从请求体中解析出的用户对象
         * @return 创建成功的用户对象(会包含生成的ID)
         */
        @POST
        @Consumes(MediaType.APPLICATION_JSON) // 指定消费的媒体类型是 JSON
        public User createUser(User user) {
            int newId = idCounter.getAndIncrement();
            user.setId(newId);
            userStore.put(newId, user);
            return user; // 返回创建的对象,HTTP 状态码为 201 Created
        }
    }
    /**
     * 用户实体类
     * 这是一个简单的 POJO (Plain Old Java Object)
     */
    class User {
        private int id;
        private String name;
        private String email;
        // 无参构造函数 (反序列化时可能需要)
        public User() {}
        public User(int id, String name, String email) {
            this.id = id;
            this.name = name;
            this.email = email;
        }
        // Getter 和 Setter 方法
        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 + '\'' +
                    '}';
        }
    }

    代码解释

    • @Path("/users"): 定义了该资源的 URI 路径,所有这个类的方法的 URL 都将以 /users 开头。
    • @Produces(MediaType.APPLICATION_JSON): 声明这个资源默认返回 JSON 格式的数据。
    • @GET: 标记 HTTP GET 方法,用于获取数据。
    • @POST: 标记 HTTP POST 方法,用于创建新数据。
    • @Path("/{id}"): 在类路径基础上添加一个路径参数 id
    • @PathParam("id"): 将 URL 中的 id 参数值注入到方法的 id 变量中。
    • @Consumes(MediaType.APPLICATION_JSON): 声明这个方法可以接收 JSON 格式的请求体。
  2. 创建 Jersey 应用程序引导类

    为了让 Jersey 能够扫描并注册我们的 UserResource,我们需要一个配置类。

    com.example.service 包下创建 MyApplication.java

    package com.example.service;
    import org.glassfish.jersey.server.ResourceConfig;
    import javax.ws.rs.ApplicationPath;
    /**
     * Jersey 应用程序配置类
     * @ApplicationPath 定义了所有 JAX-RS 资源的基础路径
     */
    @ApplicationPath("/api") // 所有 API 请求将以 /api 开头
    public class MyApplication extends ResourceConfig {
        public MyApplication() {
            // 注册资源类
            register(UserResource.class);
        }
    }
  3. 配置 Web 容器

    我们需要让 Jetty 服务器知道如何启动我们的 Jersey 应用,这通过一个 main 方法来完成。

    src/main/java 下创建一个根级别的 Main.java 文件(不在任何包下):

    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.servlet.ServletContextHandler;
    import org.eclipse.jetty.servlet.ServletHolder;
    import org.glassfish.jersey.servlet.ServletContainer;
    public class Main {
        public static void main(String[] args) throws Exception {
            // 1. 创建 Jetty 服务器实例,监听 8080 端口
            Server server = new Server(8080);
            // 2. 创建 ServletContextHandler,用于管理 Servlet 上下文
            ServletContextHandler handler = new ServletContextHandler();
            handler.setContextPath("/"); // 设置应用的根上下文
            // 3. 创建 Jersey Servlet 容器
            // 初始化参数指定 Jersey 应用程序的配置类
            ServletHolder jerseyServlet = new ServletHolder(new ServletContainer());
            jerseyServlet.setInitParameter("javax.ws.rs.Application", "com.example.service.MyApplication");
            // 将 Jersey Servlet 映射到 /api 路径
            handler.addServlet(jerseyServlet, "/api/*");
            // 4. 将 handler 设置给 server
            server.setHandler(handler);
            // 5. 启动服务器
            System.out.println("Jersey Application started at http://localhost:8080/api");
            System.out.println("Hit Enter to stop it...");
            server.start();
            server.join();
        }
    }

运行和测试

  1. 运行程序

    • 在 IDE 中,找到 Main.java 文件。
    • 右键点击 main 方法,选择 Run 'Main.main()'
    • 您应该能在控制台看到以下输出:
      Jersey Application started at http://localhost:8080/api
      Hit Enter to stop it...
    • 这表示 Web Service 已经成功启动,并正在监听 8080 端口。
  2. 测试 API 您可以使用以下几种方式来测试您的 Web Service:

    • 使用浏览器 (简单 GET 请求)

      • 获取所有用户: 在浏览器地址栏输入:http://localhost:8080/api/users 您应该能看到类似以下的 JSON 响应:
        [
          {"id":1,"name":"张三","email":"zhangsan@example.com"},
          {"id":2,"name":"李四","email":"lisi@example.com"}
        ]
      • 获取单个用户 (ID=1): 在浏览器地址栏输入:http://localhost:8080/api/users/1 您应该能看到:
        {"id":1,"name":"张三","email":"zhangsan@example.com"}
    • 使用 curl 命令行工具

      • 获取所有用户:
        curl http://localhost:8080/api/users
      • 获取单个用户 (ID=1):
        curl http://localhost:8080/api/users/1
      • 创建一个新用户 (POST 请求):
        curl -X POST \
             -H "Content-Type: application/json" \
             -d '{"name":"王五","email":"wangwu@example.com"}' \
             http://localhost:8080/api/users

        成功后,您会得到返回的新用户信息,其中包含了自动生成的 ID:

        {"id":3,"name":"王五","email":"wangwu@example.com"}
    • 使用 Postman 或其他 API 测试工具

      • 创建一个新的请求,方法设为 GET,URL 填 http://localhost:8080/api/users,然后点击 "Send"。
      • 创建一个 POST 请求,URL 填 http://localhost:8080/api/users
      • 在 "Body" 标签页下,选择 "raw" 和 "JSON"。
      • 输入 JSON 数据:{"name":"王五","email":"wangwu@example.com"}
      • 点击 "Send",您将收到响应。

您已经成功创建并运行了一个基于 Jersey 的 Java Web Service 实例,这个例子涵盖了:

  • 使用 Maven 管理项目。
  • 定义 JAX-RS 资源类 (@Path, @GET, @POST, @Produces, @Consumes)。
  • 创建 Jersey 应用配置类。
  • 使用内嵌 Jetty 服务器启动服务。
  • 通过多种方式测试 RESTful API。

这是一个非常好的起点,您可以根据这个基础进行扩展,

  • 添加 PUTDELETE 方法来更新和删除资源。
  • 连接真实的数据库(如 MySQL, PostgreSQL)。
  • 添加安全认证(如 JWT)。
  • 使用更高级的框架(如 Spring Boot)来简化配置。
分享:
扫描分享到社交APP
上一篇
下一篇