通过java提供的“wsimport”工具可以很容易完成基于SOAP协议的web服务客户端生成工作。这个工具可以从对应的WSDL文档的服务描述中生成客户端支持代码或其它相关资源。输入并执行如下命令:
1
|
% wsimport |
执行后,将会打印出该命令程序的使用帮助。下面我们将通过命令工具对前面的例子TimeServer服务生成客户端开发相关支持代码。启动ch01.ts.TimeServerPublisher程序后,执行如下命令:
1
|
% wsimport -keep -p client http: //localhost :9876 /ts ?wsdl
|
执行后将会在“client”子目录下面产生两个源代码文件和两个与之对应的已经编译好的Class文件。“-p”选项用来指定生成的java包名称,此处使用“client”作为包名称。包名称可以是符合java包命名规则的任何名称,wsimport工具通过指定的包名称创建包对应子目录。“-keep”选项用来指示是否保留编译后的源文件,这个例子中,我们保留源文件留作验证。“-p”选项是比较重要的,这是由于wsimport命令产生的TimeServer.class文件名称同先前编译的服务端点接口(SEI)拥有同样的名字。如果没有指定包名称,wsimport默认使用服务器实现的包名称作为客户端代码包名称,此处将默认用“ch01.ts”作为包名称。简单来说,使用“-p”选项可以防止编译好的SEI文件不被wsimport工具产生的文件覆盖。如果已经将WSDL文档保存在本地(比如,文件被命名为ts.wsdl),那么,wsimport可以写成:
1
|
% wsimport -keep -p client ts.wsdl |
生成的代码示例如下,由wsimport生成的TimeServer服务接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package client;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Action;
/** * This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.4-b01
* Generated source version: 2.2
*/
@WebService (name = "TimeServer" , targetNamespace = "http://ts.ch01/" )
@SOAPBinding (style = SOAPBinding.Style.RPC)
public interface TimeServer {
/**
* @return
* returns java.lang.String
*/
@WebMethod
@WebResult (partName = "return" )
@Action (input = "http://ts.ch01/TimeServer/getTimeAsStringRequest" ,
output = "http://ts.ch01/TimeServer/getTimeAsStringResponse" )
public String getTimeAsString();
/**
* @return
* returns long
*/
@WebMethod
@WebResult (partName = "return" )
@Action (input = "http://ts.ch01/TimeServer/getTimeAsElasedRequest" ,
output = "http://ts.ch01/TimeServer/getTimeAsElasedResponse" )
public long getTimeAsElased();
} |
由wsimport生成的TimeServerImplService实现类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
package client;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceFeature;
/** * This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.4-b01
* Generated source version: 2.2
*/
@WebServiceClient (name = "TimeServerImplService" , targetNamespace = "http://ts.ch01/" ,
wsdlLocation = "http://localhost:9876/ts?wsdl" )
public class TimeServerImplService extends Service{
private final static URL TIMESERVERIMPLSERVICE_WSDL_LOCATION;
private final static WebServiceException TIMESERVERIMPLSERVICE_EXCEPTION;
private final static QName TIMESERVERIMPLSERVICE_QNAME =
new QName( "http://ts.ch01/" , "TimeServerImplService" );
static {
URL url = null ;
WebServiceException e = null ;
try {
url = new URL( "http://localhost:9876/ts?wsdl" );
} catch (MalformedURLException ex) {
e = new WebServiceException(ex);
}
TIMESERVERIMPLSERVICE_WSDL_LOCATION = url;
TIMESERVERIMPLSERVICE_EXCEPTION = e;
}
public TimeServerImplService() {
super (__getWsdlLocation(), TIMESERVERIMPLSERVICE_QNAME);
}
public TimeServerImplService(WebServiceFeature... features) {
super (__getWsdlLocation(), TIMESERVERIMPLSERVICE_QNAME, features);
}
public TimeServerImplService(URL wsdlLocation) {
super (wsdlLocation, TIMESERVERIMPLSERVICE_QNAME);
}
public TimeServerImplService(URL wsdlLocation, WebServiceFeature... features) {
super (wsdlLocation, TIMESERVERIMPLSERVICE_QNAME, features);
}
public TimeServerImplService(URL wsdlLocation, QName serviceName) {
super (wsdlLocation, serviceName);
}
public TimeServerImplService(URL wsdlLocation, QName serviceName,
WebServiceFeature... features) {
super (wsdlLocation, serviceName, features);
}
/**
* @return
* returns TimeServer
*/
@WebEndpoint (name = "TimeServerImplPort" )
public TimeServer getTimeServerImplPort() {
return super .getPort( new QName( "http://ts.ch01/" , "TimeServerImplPort" ),
TimeServer. class );
}
/**
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.
* Supported features not in the <code>features</code> parameter will have
* their default values.
* @return
* returns TimeServer
*/
@WebEndpoint (name = "TimeServerImplPort" )
public TimeServer getTimeServerImplPort(WebServiceFeature... features) {
return super .getPort( new QName( "http://ts.ch01/" , "TimeServerImplPort" ),
TimeServer. class , features);
}
private static URL __getWsdlLocation() {
if (TIMESERVERIMPLSERVICE_EXCEPTION!= null ) {
throw TIMESERVERIMPLSERVICE_EXCEPTION;
}
return TIMESERVERIMPLSERVICE_WSDL_LOCATION;
}
} |
由wsimport产生的源文件有3点需要注意。第一,客户端接口client.TimeServer定义了同目标SEI接口TimeServer相同的方法。这些方法包括服务请求操作getTimeAsString和getTimeAsElapsed两个方法。第二,实现类client.TimeServerImplService包括一个无参构造函数,同目标Java客户端TimeClient中构造服务对象时非常地类似。第三,TimeServerImplService类封装了getTimeServerImplPort方法,该方法返回一个client.TimeServer对象实例,该对象实例支持对两个预先定义的web服务操作的调用。
下面利用wsimport工具产生的客户端支持代码来调用web服务,如例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package client;
/** * 使用wsimport生成的代码编写的java服务调用客户端
* @author fuhd
*/
public class TimeClientWSDL {
public static void main(String[] args) {
TimeServerImplService service = new TimeServerImplService();
TimeServer server = service.getTimeServerImplPort();
System.out.println(server.getTimeAsElased());
System.out.println(server.getTimeAsString());
}
} |
上面示例中的服务调用客户端和前面的TimeClient客户端在功能上是一样的,但是这个客户端编写起来却非常容易。尤为重要的是,在使用wsimport工具生成client.TimeServerImplService时,像与服务对应的QName和服务端点等这些复杂的细节都被隐藏掉了。
下面是针对采用基于WSDL协议所生成的相关工件(Artifact)编写服务客户端的一些常用做法,比如像这里的TimeServer和TimeServerImplService。
-
首先,通过wsimport产生的类中的几个构造方法构造服务对象,比如在本例的client.TimeServerImplService类中,无参数的构造方法更可取,因为这样更为简单。然而,在本例中,还是生成了几个拥有多个输入参数的构造方法,用来适应web服务的命名空间(URI)或服务端点(RUL)等变化。当然还可以通过wsimport工具包重新生成基于WSDL的java文件,用在其他客户端开发中。
-
通过构建的服务对象调用对应的get系列方法,在本例中是getTimeServerImplPort方法。这个方法返回一个封装了web服务操作方法的对象,本例中分别是定义在目标SEI中的getTimeAsString和getTimeAsElapsed方法。
相关推荐
默认情况下,生成客户端代理 类。 /serverInterface 为 ASP.Net Web 服务的服务器端实现生成 接口。将为 wsdl 文档中的每个绑定生成 一个接口。wsdl 单独实现 wsdl 协定(实现 接口的类在类方法上不应包括下列...
该文档详细描述了利用Zend Studio for Eclipse 生成wsdl文件,用php编写提供web service 的服务程序,然后用php调用,亲测通过
上面的命令根据制定URL提供的WSDL文档生成一个C++语法结构的头文件。 如果需要生成一个纯C的头文件,需要一下命令: $ wsdl2h -c -o quote.h 更多关于WSDL解析器及其选项的细节信息,请参见8.2.10节。 ...
Ⅰ)调用CXF提供的wsdl2java工具,根据WSDL文档生成相应的Java代码(任何语言实现web service都要暴露WSDL文档); Ⅱ)找到wsdl2java所生成的类中一个继承了Service的类(该类的实例可当工厂使用); Ⅲ)调用...
本人自学JAX-WS笔记和简单例子,文档标题结构如下: JAX-WS使用教程 1、JAX-WS概述 2、创建Web Service 2.1 从java开始 2.1.1 运行wsgen 2.1.2 生成的WSDL和XSD 2.1.3 目录结构 2.2 从WSDL开始 2.2.1 ...
2.1.2 生成的WSDL和XSD 2.1.3 目录结构 2.2 从WSDL开始 2.2.1 运行wsimport 2.2.2 生成的java代码 2.3发布Web Service 2.3.1在应用程序中发布 2.3.2在Web应用程序中发布 2.3.2.1 依赖包 ...
1. 将lib包下的所有的jar包,添加到classpath中。 2. 运行命令: java org.apache.axis.wsdl.WSDL2Java -u http://xxxxxx?wsdl -p com.webservice.wsdl -t... -t 生成的java文件中包含junit的测试代码。 详见文档。
gSOAP工具根据WSDL文档,自动生成C/C++语言的客户端/服务端框架代码。这其中有两个工具很重要,wsdl2h和soapcpp2。wsdl2h工具根据WSDL文成C/C++头文件,而soapcpp2工具则是根据该头文件生成C/C++的框架源码。 gSOAP...
gSOAP工具根据WSDL文档,自动生成C/C++语言的客户端/服务端框架代码。这其中有两个工具很重要,wsdl2h和soapcpp2。wsdl2h工具根据WSDL文成C/C++头文件,而soapcpp2工具则是根据该头文件生成C/C++的框架源码。 gSOAP...
WSDL2Java工具可以从WSDL描述文件中产生相应的客户和服务器端SOAP操作框架。 初步提供安全扩展,能够与Servlet2.2安全集成。 通过HTTP Cookie和与传输无关的SOAP头信息提供会话跟踪。 初步支持带附件的SOAP消息。 在...
一个gsoap 实现加法的例子,用VC6.0开发,包含服务器端和客户端。另外还附wsdl文档,gsoap生成代码工具
它提供了世界领先的XML编辑器,在原图形架构设计师,一个代码生成器,文件转换器,调试器,分析器,完整的数据库集成,支持WSDL,SOAP,XSLT,XPath,XQuery,XBRL,Open XML文档,加上视觉Studio和Eclipse插件,...
它提供了世界领先的XML编辑器,在原图形架构设计师,一个代码生成器,文件转换器,调试器,分析器,完整的数据库集成,支持WSDL,SOAP,XSLT,XPath,XQuery,XBRL,Open XML文档,加上视觉Studio和Eclipse插件,...
身份认证服务平台自建接口WSDL文件生成Stub代码的示例源代码版本,是框架和构建工具无依赖的纯eclipse工程。jdk版本兼容1.7及以上。 接口文档见 TomcatClient 身份认证服务平台自建接口master-https_单笔身份认证...
oXygen XML Editor是一个多平台的XML编辑器(里诺下载站提供),XSLT / XQuery的调试器和分析器具有...oXygen支持导入数据库内容,微软Excel表和传统的文本数据文件到XML文档,也为从数据库表生成XML Schema的支持。
本文档从在eclipse下配置axis2开发环境,到编写服务器接口,使用axis2的server wizard发布aar文件的方式,及编写客户端代码访问arr接口的方式;另一种是在要发布的类上使用右键-->webservice-->创建webservice,发布...
它从 WSDL 及其模式中检索文档标签,并定义使用的方法、返回类型、参数类型等。 在这里在线测试这个库: : 在此处在线阅读 PHPDoc: :教程了解如何使用此代码的最佳方法是首先查看位于根目录中的 samples-...
框架开发WebService,WebService服务器端发布成功,通过浏览器也可以顺利生成wsdl文档,但是通过wsdl2java把服务器端java代码引入到客户端以后,写Test类调用服务器端的接口,一直抛java.lang.RuntimeException: ...
14.4.2 使用WSDL生成客户端代码 253 14.4.3 创建Web Service客户端测试代码 255 14.5 本章小结 255 第15章 Java EE中EJB的开发 256 15.1 EJB概述 256 15.2 WebLogic服务器的安装与配置 257 15.2.1 WebLogic服务器的...
2.2 wsdl文档结构 36 2.3 amazon e-commerce web服务 46 2.4 wsgen工具与jax-b工件(artifacts) 59 2.5 wsdl总结 69 2.6 下一章 80 .第3章 soap消息编程 81 3.1 soap是否真地不可见 81 3.2 在soap 1.2下实现...