通过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方法。
相关推荐
4. **生成客户端代码**: 对于客户端,同样使用`soapcpp2`,但需要指定不同的选项来生成客户端代理代码: - 例如:`soapcpp2 -I . -c -S myservice.wsdl` - 这会生成客户端的`.h`和`.cpp`文件,其中包含了调用...
在Eclipse集成开发环境中,我们可以使用"Web Service Explorer"或"New Web Service Client"向导来根据WSDL文件生成客户端代码。以下是步骤: 1. **导入WSDL文件**:在Eclipse中,选择“File” > “Import” > “Web...
2. **JAX-WS**:Java API for XML Web Services,Java平台的标准,提供了wsimport工具,能够从WSDL生成客户端代码。 3. .NET Framework的`svcutil.exe`:对于.NET开发者,这个工具可以生成C#或VB.NET的客户端代码。 ...
2. **连接与认证**:在代码中设置服务器地址、端口、可能的认证信息等。 3. **调用服务**:使用生成的类调用Web服务操作,注意传递正确参数。 4. **处理响应**:解析返回的SOAP消息,提取所需数据。 五、问题与解决...
Eclipse或Apache CXF在生成客户端代码时会使用它。 4. **activation.jar**:JavaBeans Activation Framework,用于处理MIME类型和数据对象的激活。 5. **javax.mail.jar**:如果Web服务涉及邮件操作,这个库是必需...
提供的"AXIS2生成客户端代码教程.docx"文档应该包含了更详细的操作指南,包括每个步骤的截图和解释,对于初学者来说是非常有价值的参考资料。 8. **总结** AXIS2与MyEclipse的结合使得Web服务客户端的开发变得...
在IT行业中,Web服务是不同系统之间进行通信和数据交换的一种常见方式。WSDL(Web Service Description Language)是...同时,理解WSDL的结构和如何生成客户端代码对于任何涉及Web服务的开发者来说都是非常重要的技能。
总结来说,"axis2生成客户端代码 (带jar包)"涉及到的是利用Axis2框架及其提供的工具,从服务的WSDL文件生成Java客户端代码,并使用包含的jar包来支持服务的调用和交互。了解这些知识有助于开发人员更有效地集成和...
5. **生成客户端代码**: 点击"OK"后,Eclipse会解析WSDL文件,并自动生成对应的Java客户端代码,包括服务代理类和服务接口等。这些代码位于新创建的包中,通常是根据WSDL命名空间自动创建的。 6. **安装客户端**...
在.NET框架中,`wsdl.exe`工具是一个实用程序,可以帮助开发者从现有代码生成WSDL文档,这个过程被称为“代码到WSDL”的转换。本文将深入探讨`wsdl.exe`的工作原理和使用方法。 1. **什么是WSDL?** WSDL是基于XML...
例如,如果WSDL中有一个名为“sayHello”的操作,那么在生成的客户端代码中会有对应的方法可以调用。 以本例中的`testlmeashion_buildclientform.xml`文件为例,这可能是一个配置文件,用于指导工具生成客户端代码...
### Axis自动生成客户端代码 #### 知识点一:Axis简介与版本差异 - **Axis简介**:Apache Axis是一款开源的、基于Java的Web服务框架,支持SOAP协议,用于实现和部署Web服务。它提供了创建、发布以及调用Web服务的...
总结,Java解析WSDL文档获取具体的方法与参数涉及的主要知识点包括:XML解析(DOM)、JAX-WS框架、`javax.xml.ws.Service`类的使用,以及如何基于WSDL生成服务客户端代码。理解这些概念,将有助于开发和消费Web服务...
2. **使用工具生成Java客户端代码**:在Java中,我们可以使用Apache CXF、 Axis2 或 JAX-WS等库来从WSDL文件自动生成客户端代码。这些库提供命令行工具或IDE插件,例如使用Apache CXF的`wsdl2java`命令,可以将WSDL...
前者专注于代码生成,即从WSDL生成服务端和客户端代码;后者可能包含了服务的部署和管理功能。这些JAR文件是Eclipse插件的核心组成部分,它们提供了相应的API和功能实现,使得开发者在Eclipse环境下可以轻松处理Axis...
7. 使用生成的客户端代码:在客户端,可以直接使用生成的Java客户端代码来调用Web服务,无需手动构造SOAP消息。 通过本项目"TestWsdl",你可以实践以上步骤,创建并运行一个基于WSDL的Web服务。项目中的代码示例将...
WSDL文档不仅可以帮助我们理解Web服务的功能和使用方式,还可以通过工具自动生成客户端代码。例如,使用Apache Axis、SOAPUI等工具,可以方便地生成客户端代码,并集成到现有的应用程序中。这大大简化了开发过程,...
2. **生成客户端代码**: 使用`WSDL2JAVA`工具,你可以从WSDL文件自动生成Java客户端 stubs。这些stubs包含了用于调用Web服务的方法和数据类型。在命令行中,你可能会输入类似于以下的命令: ``` axis2-wsdl2java....
`axis.cmd`可能是用于执行Axis命令的批处理文件,使得用户能够在命令行环境中运行生成客户端代码的指令。 2. **wsdl**:这是一个WSDL文件的简写,通常扩展名为`.wsdl`,包含了Web服务的完整描述。该文件包含服务的...