欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Axis 2

程序员文章站 2022-05-16 18:24:39
...

在编写、发布和测试0配置的WebService时应注意如下几点: 1. POJO类不能使用package关键字声明包。 2. Axis2在默认情况下可以热发布WebService,也就是说,将WebService的.class文件复制到pojo目录中时,Tomcat不需要重新启动就可以自动发布WebService。如果

在编写、发布和测试0配置的WebService时应注意如下几点:
1. POJO类不能使用package关键字声明包。
2. Axis2在默认情况下可以热发布WebService,也就是说,将WebService的.class文件复制到pojo目录中时,Tomcat不需要重新启动就可以自动发布WebService。如果想取消Axis2的热发布功能,可以打开\webapps\axis2\WEB-INF\conf\axis2.xml,找到如下的配置代码: true
将true改为false即可。要注意的是,Axis2在默认情况下虽然是热发布,但并不是热更新,也就是说,一旦成功发布了WebService,再想更新该WebService,就必须重启Tomcat。这对于开发人员调试WebService非常不方便,因此,在开发WebService时,可以将Axis2设为热更新。在axis2.xml文件中找到false,将false改为true即可。
3. 在浏览器中测试WebService时,如果WebService方法有参数,需要使用URL的请求参数来指定该WebService方法参数的值,请求参数名与方法参数名要一致,例如,要测试getGreeting方法,请求参数名应为name,如上面的URL所示。
4. 发布WebService的pojo目录只是默认的,如果读者想在其他的目录发布WebService,可以打开axis2.xml文件,并在元素中添加如下的子元素:
上面的配置允许在\webapps\axis2\WEB-INF\my目录中发布WebService。例如,将本例中的SimpleService.class复制到my目录中也可以成功发布(但要删除pojo目录中的SimpleService.class,否则WebService会重名)。

用Java实现调用WebService的客户端程序

package client;

import javax.xml.namespace.QName;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.rpc.client.RPCServiceClient;

public class RPCClient {

public static void main(String[] args) throws Exception {

// 使用RPC方式调用WebService

RPCServiceClient serviceClient = new RPCServiceClient();

Options options = serviceClient.getOptions();

// 指定调用WebService的URL

EndpointReference targetEPR = new EndpointReference( "http://localhost:8080/axis2/services/SimpleService");

options.setTo(targetEPR);

// 指定getGreeting方法的参数值

Object[] opAddEntryArgs = new Object[] {"超人"};

// 指定getGreeting方法返回值的数据类型的Class对象

Class[] classes = new Class[] {String.class};

// 指定要调用的getGreeting方法及WSDL文件的命名空间

QName opAddEntry = new QName("http://ws.apache.org/axis2", "getGreeting");

// 调用getGreeting方法并输出该方法的返回值

System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);

// 下面是调用getPrice方法的代码,这些代码与调用getGreeting方法的代码类似

classes = new Class[] {int.class}; opAddEntry = new QName("http://ws.apache.org/axis2", "getPrice");

System.out.println(serviceClient.invokeBlocking(opAddEntry, new Object[]{}, classes)[0]);

}

}

用wsdl2java简化客户端的编写

Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。wsdl2java.bat命令可以在"bin目录中找到。在使用wsdl2java.bat命令之前需要设置AXIS2_HOME环境变量,该变量值是
在Windows控制台输出如下的命令行来生成调用WebService的代码:
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/SimpleService?wsdl -p client -s -o stub
其中-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。在执行完上面的命令后,读者就会发现在当前目录下多了个stub目录,在."stub"src"client目录可以找到一个SimpleServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类

在cmd命令窗口中执行

实际实现:


C:\Documents and Settings\Administrator>D:


D:\>cd axis2-1.5.4


D:\axis2-1.5.4>cd bin


D:\axis2-1.5.4\bin>

D:\axis2-1.5.4\bin>

D:\axis2-1.5.4\bin>wsdl2java -uri http://192.168.1.140:8099/services/SSO?ws

dl -p com.bcinfo.sso

Using AXIS2_HOME: D:\axis2-1.5.4

Using JAVA_HOME: D:\Program Files\Java\jdk1.6.0_10

Retrieving document at 'http://192.168.1.140:8099/services/SSO?wsdl'.

D:\axis2-1.5.4\bin>wsdl2java -uri http://192.168.1.140:8099/services/SSO?ws

dl -p com.bcinfo.SSoClient

Using AXIS2_HOME: D:\axis2-1.5.4

Using JAVA_HOME: D:\Program Files\Java\jdk1.6.0_10

Retrieving document at 'http://192.168.1.140:8099/services/SSO?wsdl'.

D:\axis2-1.5.4\bin>

class

package client;

import javax.xml.namespace.QName;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.rpc.client.RPCServiceClient;

public class StubClient {

public static void main(String[] args) throws Exception {

SimpleServiceStub stub = new SimpleServiceStub();
SimpleServiceStub.GetGreeting gg = new SimpleServiceStub.GetGreeting();

gg.setName("比尔");

System.out.println( stub.getGreeting(gg).get_return());

System.out.println(stub.getPrice().get_return());

}

}
上面的代码大大简化了调用WebService的步骤,并使代码更加简洁。但要注意的是,wsdl2java.bat命令生成的Stub类将WebService方法的参数都封装在了相应的类中,类名为方法名,例如,getGreeting方法的参数都封装在了GetGreeting类中,要想调用getGreeting方法,必须先创建GetGreeting类的对象实例。