【Web Service学习】-----JAX-WS构建Web Services

本文介绍了Web Services的基本概念,包括XSD、SOAP和WSDL,并详细阐述了JAX-WS作为Web Services的具体实现方式。在JAX-WS中,创建服务端接口、实现类并发布服务,以及客户端的两种测试方法(手动编写和使用wsimport工具)都被详细讲解。通过实例展示了如何发布和访问Web Services。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简介

W3C(World Wide Web Consortium)对于Web Services描述是通过万维网(World Wide Web’s)的超文本传输协议(HTTP)进行通信的客户端和服务端的应用程序。Web Services提供了各种平台和框架上运行软件程序之间相互操作的标准方法。

  远程服务调用中RMI远程服务调用或者HttpInvoker服务都存在一个限制,只能在java程序之间调用,但实际生产上往往存在着各种语言如C++、C#、Visual Vasic等编写的程序,当前实现不同语言的程序间的调用最优解决方案是Web Services,Web Services是一种跨编程语言和跨操作系统平台的远程调用技术,Web Services并不是对远程服务调用具体的实现,而是定义了一套远程服务调用的标准,主要包含:XSD,SOAPWSDL等内容。

1.XSD((XML Schema Datatypes):XSD是一套为了程序间交换而建立的关于标记符的语法规则。Web Services采用了XML格式封装数据(XML中说明了远程服务对象的方法,传递的参数以及服务对象的返回结果),XML容易建立和分析,并且独立于平台和语言。W3C为Web Sevices指定了一套传输数据类型,即XSD。任何编程语言写的Web Services接口在发送数据时都要转换成Web Services标准的XSD发送。
2. SOAP(Simple Object Access Protocol)SOAP是基于XML的简易协议,应用程序在HTTP上进行交换信息,SOAP1.1提交到W3C,SOAP1.2版本被2003年发布为W3C标准。一条SOAP消息就是普通的XML文档,但必须要符合SOAP协议标准,完整的SOAP协议包含了几个元素:

  • 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息。
  • 可选的Header元素,包含头部信息。
  • 必需的 Body元素,包含所有的调用和响应信息。
  • 可选的Fault元素,提供有关在处理此消息所发生错误的信息。

3.WSDL(Web Services Description Language)WSDL是基于XML语言,用于描述Web Services及如何访问Web Services的语言,它规定了服务的位置以及服务提供的方法,参数和返回值等。它是WebService客户端和服务器端都能理解的标准格式。因为是基于XML的,所以WSDL既是机器可解析,又被人类可阅读的,这是一个很大的优点。

  JAX-WS就是Web Services的一种具体实现方式,实现远程服务调用。

2.JAX-WS介绍

JAX-WS的全称是API for XML Web Services,JAX-WS跟JDK1.6及之后版本进行了绑定,使得开发java Web Services服务更加容易,创建一个JAX-WS服务可分为几个步骤:
——服务端

  • 创建WebService服务端接口。
  • 编写一个WebService服务接口的实现类。
  • 发布WebService服务。

——客户端(测试)
测试WebService两种方式:
方法一:编写一个WebService客户端。
方法二:使用wsimport工具解析wsdl文件,生成客户端类来访问Web服务。

2.1 JAX-WS服务端

步骤一:创建WebService服务端的接口AccountService

//Service Endpoint Interface
@WebService(serviceName="AccountService",targetNamespace="http://corp.com/",name="AccountServiceSoap")
public interface AccountService {
  
  @WebMethod
  public void insertAccount(Account account);
  
  @WebMethod
  public List<Account> getAccounts(String name);
}
  • 传输实体类Account,实现序列化接口Serializable
public class Account implements Serializable {

  private static final long serialVersionUID = 1L;
  
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
  
  @Override
  public String toString() {
    return "Account [name=" + name + "]";
  }
}

步骤二: 编写WebService服务接口的实现类AccountServiceImpl

@WebService(endpointInterface="com.corp.service.AccountService",serviceName="AccountService",targetNamespace="http://soa.corp.com/service",name="AccountServiceSoap")
public class AccountServiceImpl implements AccountService{

  @WebMethod
  public List<Account> getAccounts(String name) {
    List<Account> accounts = new ArrayList<>();
    Account account = new Account();
    account.setName("DreamTech1113");
    accounts.add(account);
    return accounts ;
  }

  @WebMethod
  public void insertAccount(Account account) {
    return;
  }
}

步骤三:发布WebService服务。

public class AccountServicePublisher {
  public static void main(String[] args) {
    Endpoint.publish("http://localhost:8887/", new AccountServiceImpl());
  }
}

启动服务端项目,此时可以在访问WSDL文件,访问地址是http://localhost:8887/AccountService?WSDL,显示结果如下:
在这里插入图片描述

3. 客户端(测试)

方式一:不使用工具,编写一个WebService客户端来访问服务。

public class AccountServiceClient {

    public static void main(String[] args) throws MalformedURLException {
      //WSDL契约访问路径
      URL wsdlDocumentLocation  = new URL("http://localhost:8887/AccountService?WSDL");
      //Qname构造方法指定了namespace的url以及local part(设置为serviceName)
      QName serviceName = new QName("http://soa.corp.com/service","AccountService");
      //为目标服务端创建一个代理
      Service service = Service.create(wsdlDocumentLocation,serviceName);
      //getport()方法返回的是代理,方法参数指定的是服务端的接口。
      AccountService accountService = service.getPort(AccountService.class);
      List<Account> accounts = accountService.getAccounts("name");
      System.out.println(accounts);
    }
}

方式二::使用JDK自带wsimport工具来生产客户端代码。
运行服务端发布服务的类,能够在页面访问WSDL文件,访问路径是:http://localhost:8887/AccountService?WSDL
wsimport工具在jdk/bin目录下面,使用如下命令:

wsimport -keep http://localhost:8887/AccountService?WSDL

将会在jdk的bin目录下面生成一个接口及其实现类,将生成代码拷贝至客户端,编写代码进行远程服务访问。
在这里插入图片描述

public class AccountServiceClient {
  public static void main(String[] args) {
    AccountService_Service client = new AccountService_Service();
    AccountService accountService = client.getAccountServiceImplPort();
    List<Account> accounts = accountService.getAccounts("name");
    System.out.println(accounts);
  }
}

运行结果是:

[Account [name=DreamTech1113]]

4. 参考
  1. JDK官方文档
  2. 《Spring IN ACTION》
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值