杰瑞科技汇

Java Webservice创建步骤是什么?

  1. JAX-WS (Java API for XML Web Services):这是 Java 官方、比较传统的技术,通常与 Servlet 容器(如 Tomcat)配合使用,它基于 SOAP (Simple Object Access Protocol) 协议。
  2. JAX-RS (Java API for RESTful Web Services):这是创建 RESTful Web 服务的标准,它基于 HTTP 协议,使用 JSON 或 XML 等格式传输数据,是目前更流行、更轻量级的选择。

下面我将分别详细介绍如何使用这两种技术创建一个简单的 WebService。

Java Webservice创建步骤是什么?-图1
(图片来源网络,侵删)

准备工作:构建环境

你需要一个 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

Java Webservice创建步骤是什么?-图2
(图片来源网络,侵删)
<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

Java Webservice创建步骤是什么?-图3
(图片来源网络,侵删)
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 并测试

  1. 打包项目: 在项目根目录运行 mvn clean package,这会在 target 目录下生成一个 .war 文件。
  2. 部署到 Tomcat: 将生成的 jax-ws-demo-1.0-SNAPSHOT.war 复制到 Tomcat 的 webapps 目录下。
  3. 启动 Tomcat: 运行 Tomcat 的 startup.bat (Windows) 或 startup.sh (Linux/Mac)。
  4. 访问 WSDL: 打开浏览器,访问 http://localhost:8080/jax-ws-demo/HelloWorld?wsdl,如果看到一个 XML 文件,说明你的 WebService 已经成功发布。
  5. 测试: 你可以使用 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 中配置一个 ServletServletContainer

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 并测试

  1. 打包项目: 运行 mvn clean package
  2. 部署到 Tomcat: 将生成的 jax-rs-demo-1.0-SNAPSHOT.war 复制到 Tomcat 的 webapps 目录。
  3. 启动 Tomcat
  4. 测试:
    • 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}


总结与对比

特性 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 的原生风格更契合。
分享:
扫描分享到社交APP
上一篇
下一篇