杰瑞科技汇

Java如何实现WebService?30字疑问标题

  1. JAX-WS (Java API for XML Web Services):这是目前最主流、最成熟的 Java WebService 技术,它用于构建基于 SOAP (Simple Object Access Protocol) 协议的 WebService,从 Java 6 开始,JAX-WS 已经被内置在 JDK 中,无需额外安装复杂的框架,非常方便。
  2. JAX-RS (Java API for RESTful Web Services):这是用于构建 RESTful 风格 WebService 的 API,它更轻量级,通常与 JSON 数据格式配合使用,是目前移动端和前后端分离项目中最流行的架构。

下面我将分别详细介绍如何使用这两种技术实现 WebService,并提供完整的代码示例。

Java如何实现WebService?30字疑问标题-图1
(图片来源网络,侵删)

使用 JAX-WS 实现 SOAP WebService

JAX-WS 的核心思想是,你只需要编写一个普通的 Java 接口和它的实现类,然后通过一些注解来将其发布成 WebService,客户端也可以通过工具根据 WSDL (Web Services Description Language) 文件生成客户端代码。

服务端实现

我们将创建一个简单的 HelloService,它提供一个 sayHello 方法。

步骤 1:创建 Maven 项目并添加依赖

虽然 JAX-WS 在 JDK 中,但为了方便开发和打包,我们使用 Maven,创建一个 maven-archetype-webapp 项目,并在 pom.xml 中添加依赖,对于现代项目,建议使用 jakarta 命名空间。

Java如何实现WebService?30字疑问标题-图2
(图片来源网络,侵删)
<dependencies>
    <!-- JAX-WS API (for Jakarta EE 9+) -->
    <dependency>
        <groupId>jakarta.xml.ws</groupId>
        <artifactId>jakarta.xml.ws-api</artifactId>
        <version>3.0.1</version>
    </dependency>
    <!-- JAX-WS RI (Implementation) -->
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>3.0.2</version>
    </dependency>
</dependencies>

注意:如果你使用的是 Java 8 或更早的版本,或者 Jakarta EE 8,你需要使用 javax.xml.ws 命名空间。

步骤 2:创建服务接口并添加注解

这个接口将定义 WebService 的契约。

// src/main/java/com/example/HelloService.java
package com.example;
import jakarta.jws.WebMethod;
import jakarta.jws.WebParam;
import jakarta.jws.WebService;
// @WebService 注解将这个类标记为一个 WebService
@WebService
public interface HelloService {
    // @WebMethod 注解将这个方法暴露为 WebService 的一个操作
    // @WebParam 注解用于指定参数的名称,这在 WSDL 中会体现
    @WebMethod
    String sayHello(@WebParam(name = "name") String name);
}

步骤 3:创建服务实现类

Java如何实现WebService?30字疑问标题-图3
(图片来源网络,侵删)
// src/main/java/com/example/HelloServiceImpl.java
package com.example;
import jakarta.jws.WebService;
// 使用 @WebService 注解实现接口,endpointInterface 指向接口的全限定名
@WebService(endpointInterface = "com.example.HelloService")
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name + "!";
    }
}

步骤 4:发布 WebService

你可以通过一个简单的 Java 类来启动并发布这个服务,最简单的方式是使用 Endpoint 类。

// src/main/java/com/example/WebServicePublisher.java
package com.example;
import jakarta.xml.ws.Endpoint;
public class WebServicePublisher {
    public static void main(String[] args) {
        // 定义服务的访问地址
        String address = "http://localhost:8888/ws/hello";
        // 创建服务实现类的实例
        HelloService helloService = new HelloServiceImpl();
        // 发布服务
        Endpoint.publish(address, helloService);
        System.out.println("WebService is published at: " + address);
    }
}

步骤 5:运行和测试

  1. 运行 WebServicePublishermain 方法。
  2. 打开浏览器,访问 http://localhost:8888/ws/hello?wsdl
  3. 如果看到一串 XML(WSDL 文件),说明你的 WebService 已经成功发布!

如何测试?

你可以使用 wsimport 命令(JDK 自带)来生成客户端代码并进行调用。

  1. 打开一个新的命令行窗口,执行以下命令生成客户端代码:

    wsimport -p com.example.client -keep http://localhost:8888/ws/hello?wsdl
    • -p: 指定生成的客户端代码包名。
    • -keep: 保留生成的源文件。
  2. 创建一个测试客户端类:

    // src/main/java/com/example/client/HelloServiceClient.java
    package com.example.client;
    public class HelloServiceClient {
        public static void main(String[] args) {
            // 创建服务实例
            HelloService_Service service = new HelloService_Service();
            // 获取服务端口 (SEI - Service Endpoint Interface)
            HelloService port = service.getHelloServicePort();
            // 调用远程方法
            String response = port.sayHello("WebService Client");
            System.out.println("Response from server: " + response);
        }
    }
  3. 运行 HelloServiceClient,你将在控制台看到输出:Response from server: Hello, WebService Client!


使用 JAX-RS 实现 RESTful WebService

JAX-RS 是一套规范,其最流行的实现是 JerseyRESTEasy,这里我们以 Jersey 为例。

服务端实现

我们将创建一个 RESTful 资源,提供 GET /hello/{name} 接口。

步骤 1:创建 Maven 项目并添加依赖

<dependencies>
    <!-- Jersey Core -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-grizzly2-http</artifactId>
        <version>3.1.1</version>
    </dependency>
    <!-- Jersey Jackson (for JSON support) -->
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>3.1.1</version>
    </dependency>
</dependencies>

步骤 2:创建资源类

使用 @Path 注解来定义资源的 URI 路径,@GET@POST 等注解定义 HTTP 方法。

// src/main/java/com/example/HelloResource.java
package com.example;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
// @Path 定义了这个资源的基 URI
@Path("/hello")
public class HelloResource {
    // @GET 表示这个方法处理 HTTP GET 请求
    // @Path("...") 定义了相对于类@Path的子路径
    // @PathParam("...") 从路径中提取参数
    // @Produces 定义了该方法可以生成的媒体类型,这里是 JSON
    @GET
    @Path("/{name}")
    @Produces(MediaType.APPLICATION_JSON)
    public Greeting sayHello(@PathParam("name") String name) {
        return new Greeting("Hello, " + name + "!");
    }
}
// 一个简单的 POJO (Plain Old Java Object),用于 JSON 序列化
class Greeting {
    private String message;
    public Greeting() {}
    public Greeting(String message) {
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

步骤 3:创建应用启动类

// src/main/java/com/example/GrizzlyServer.java
package com.example;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import java.net.URI;
public class GrizzlyServer {
    // 定义服务器基 URI
    public static final String BASE_URI = "http://localhost:8080/api/";
    public static void main(String[] args) {
        // 创建一个 ResourceConfig 实例,并注册我们的资源类
        final ResourceConfig rc = new ResourceConfig().packages("com.example");
        // 创建并启动 Grizzly HTTP 服务器
        HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
        System.out.println("Jersey app started with WADL available at " + BASE_URI + "application.wadl\nHit enter to stop it...");
        try {
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            server.shutdownNow();
        }
    }
}

步骤 4:运行和测试

  1. 运行 GrizzlyServermain 方法。
  2. 打开浏览器或使用 API 测试工具(如 Postman、curl)访问 http://localhost:8080/api/hello/World
  3. 你将得到 JSON 响应:{"message":"Hello, World!"}

总结与对比

特性 JAX-WS (SOAP) JAX-RS (REST)
协议 SOAP (基于 XML) HTTP (通常与 JSON 配合)
风格 面向服务,强调接口契约 面向资源,强调资源本身
数据格式 主要是 XML 主要是 JSON, XML, Text
标准性 协议非常严格和标准化 更灵活,轻量级
性能 SOAP 协议开销较大,性能相对较低 轻量级,性能高
适用场景 企业级应用、金融、电信等对安全性、事务性要求高的场景 移动应用、前后端分离项目、公开 API
学习曲线 较复杂,需要理解 SOAP, WSDL, UDDI 等 相对简单,易于理解和使用
Java 集成 内置于 JDK (Java 6+) 需要引入第三方实现库 (如 Jersey, RESTEasy)

如何选择?

  • 如果你的项目需要与传统的、基于 SOAP 的企业系统(如 .NET 服务)集成,或者对消息的可靠性、安全性有非常高的、标准化的要求,那么选择 JAX-WS。
  • 如果你正在开发一个新的、现代化的 Web 应用,特别是前后端分离架构,或者需要为移动 App 提供 API,JAX-RS (REST) 是不二之选。 它的简单、灵活和高性能使其成为当前的主流。
分享:
扫描分享到社交APP
上一篇
下一篇