webservice快速入门-使用wsimport生成ws服务端(二)

上个例子演示的是在当前项目下发布的Webservice Server,而实际应用中和Client是分离的,本文介绍两种客户端开发方式:

1.导出WebService服务端服务接口到jar包,客户端引入jar包即可,Client开发步骤详见上一篇博客。

2.通过wsimport工具导出webservice服务,同时简化Client开发。

本文主要介绍通过wsimport导出webservice:

wsimport有几个很重要的参数,

-d 表示输出的目录,目录必须事先存在,否则导出失败。

-keep表示导出webservice的class文件时是否也导出源代码java文件。

-verbose表示详细信息。

看我们的导出命令。我们直接导在d盘中。

我们直接把生成的目录放在第2个建好的项目中去。这样我们客户端的项目就可以直接使用服务端的接口IMyservice了。顺便我们把前一章的client访问类也拷过来测试一下。目录结构如下【注意这是一个新的项目】:

直接运行MyClient测试一下。

 package org.WebService.ws.annotation; import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; public class Client {     public static void main(String[] args) throws MalformedURLException {         // TODO Auto-generated method stub         URL url=new URL("http://localhost:9998/hw?wsdl");         QName qname = new QName("http://annotation.ws.WebService.org/", "CalculatorImplService");         Service service = Service.create(url, qname);         ICalculator cal = service.getPort(ICalculator.class);         cal.add(1, 2);         cal.minus(2, 1);     } }

和之前我们在服务端测试的效果是一样的,不同的是文件不一样。wsimport生成的文件将服务端的webservice折成若干文件了。每一个方法和请求分别对应2个文件。你会发现其中有个类CalculatorImpl:

@WebServiceClient(name=”CalculatorImplService”, targetNamespace=”http://annotation.ws.WebService.org/”, wsdlLocation=”http://localhost:9998/hw?wsdl”)
public class CalculatorImplService extends Service
{

这个类是注解好的客户端程序,它里面有个方法:

@WebEndpoint(name=”CalculatorImplPort”)
public ICalculator getCalculatorImplPort()
{
return ((ICalculator)super.getPort(new QName(“http://annotation.ws.WebService.org/”, “CalculatorImplPort”), ICalculator.class));
}

直接帮我们生成了一个qname访问程序。既然如何,我们就不用自己写qname了,直接拿来用测试岂不更好?

简化后的客户端测试方法如下

  1. public class MyClient2 {
  2. public static void main(String[] args) {
  3. CalculatorImplService myServiceImplService=new CalculatorImplService();
  4. ICalculator msis= myServiceImplService.getCalculatorImplPort();
  5. msis.add(1, 4);
  6. msis.minus(1, 4);
  7. }
  8. }

结果是一样的。