转自 http://hi.baidu.com/getpost/blog/item/eb9187817b4cb1d2bc3e1ee4.html

       http://panpan.blog.51cto.com/489034/119204

1.建立要发布的Web Service

    (1)在 Eclispse 中添加一个用户库命名为 axis2 ,将 axis2\lib 下的包均添加进来。这一步操作的目的是为了以后工程添加 axis2 所需的 jar 文件方便。
    (2) 建立一个 JavaProject 命名为 ws ,将 axis2 用户库加入到 build path 中。
    (3) 现在开始编写要发布的 WebSevice ,在 src 中建包 briup ,建立 Hello 类如下:

package briup;

public class Hello {
public String sayHello(String user) {
return "Hello, " + user;
}
}

 

2.发布Web Service

    打包要发布的 Service , Eclipse 中 New --> File --> Other --> Axis2 wizards --> Axis2 Services Archiver ,按照向导选择刚建立的类编译后的 class 文件。
    (1)选择 class 文件目录,注意,不是 java 源文件,而是 classes 目录,这里需要注意由于你的类是带包briup的,因此不要选到包这个目录。

        (Class file Location:\工作目录\工程名\ws\bin)
    (2)连按两次 “Next>” ,选中 “Generate the service xml automatically”
    (3)按下一步,输入 service 名称和类名,我这里输入的服务名是:ws;类名是我们刚刚写的类名:briup.Hello,这里需要注意加入完整的包名。
    (4) 按下一步,输入 service 文件的保存路径和文件名,完成。
    选择生成目录为:Tomcat 6.0目录\webapps\axis2\WEB-INF\services,也可以选择其他目录,然后copy到这一目录下。

 

 3.测试Web Service

    打开http://localhost:8080/axis2/services/listServices页面,可以看到ws服务,点击进到ws的wsdl页面:http://localhost:8080/axis2/services/ws?wsdl,表明服务部署正确。

   (前提,tomcat已经启动)

 

三、编写客户端代码调用服务

    我的这个例子与其他例子最大的不同就在这里,其他例子一般需要根据刚才的服务wsdl生成客户端stub,然后通过stub来调用服务,这种方式显得比较单一,客户端必须需要stub存根才能够访问服务,很不方面。

    本例子的客户端不采用stub方式,而是一种实现通用的调用方式,不需要任何客户端存根即可访问服务。只需要指定对于的web servce地址、操作名、参数和函数返回类型即可。代码如下:

 

代码
package briup;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class WsClient {

private RPCServiceClient serviceClient;
private Options options;
private EndpointReference targetEPR;

public WsClient(String endpoint) throws AxisFault {
serviceClient
= new RPCServiceClient();
options
= serviceClient.getOptions();
targetEPR
= new EndpointReference(endpoint);
options.setTo(targetEPR);
}

public Object[] invokeOp(String targetNamespace, String opName,
Object[] opArgs, Class
<?>[] opReturnType) throws AxisFault,
ClassNotFoundException {
// 设定操作的名称
QName opQName = new QName(targetNamespace, opName);
// 设定返回值

// Class<?>[] opReturn = new Class[] { opReturnType };

// 操作需要传入的参数已经在参数中给定,这里直接传入方法中调用
return serviceClient.invokeBlocking(opQName, opArgs, opReturnType);
}

/**
*
@param args
*
@throws AxisFault
*
@throws ClassNotFoundException
*/
public static void main(String[] args) throws AxisFault,
ClassNotFoundException {
// TODO Auto-generated method stub
final String endPointReference = "http://localhost:8080/axis2/services/ws";
final String targetNamespace = "http://briup";
WsClient client
= new WsClient(endPointReference);

String opName
= "sayHello";
Object[] opArgs
= new Object[] { "Repace中心" };
Class
<?>[] opReturnType = new Class[] { String[].class };

Object[] response
= client.invokeOp(targetNamespace, opName, opArgs,
opReturnType);
System.out.println(((String[]) response[
0])[0]);
}

}

运行该程序,点击Run As->Java application,可以看到控制台端口的输出是:Hello, Repace中心 表明客户端调用成功。该例子最大的不同和优势表现在客户端的调用方式,或者说是发起服务调用的方式,虽然比起客户端stub存根的方式,代码稍多,但是这种方式统一,不需要生产stub存根代码,解决了客户端有很多类的问题。如果读者对这些代码进一步封装,我想调用方式很简单,只需要传递相关参数,这更好地说明了服务调用的优势。而且这种方式更加简单明了,一看便知具体含义。而不需要弄得stub类的一些机制。

 

四、测试:通过 WSDL 文件生成 CallbackHandler.java 和 AccountServiceStub.java

1) New --> File --> Other --> Axis2 wizards --> Axis2 Code Generator

2) 选择 Generate Java source code from a WSDL file ,按下一步

3) 按 Browse 选择或输入 wsdl 文件位置,按下一步
到现在为止,我们并未自行编写以及生成 WSDL 文件。当 web service 发布后即可通过访问 http://localhost:8080/axis2/services/ws?wsdl 就可以得到 wsdl 文件。既然如此,我们可以在地址栏中直接输入 URL :

4) 使用默认的配置,按下一步。在弹出的新窗口中,然后选择生成文件的存放路径,完成两个 Java 文件的生成。

5) 在工程目录按 F5 刷新,就可以看到刚生成的文件。

6) 编写服务测试程序 WsTest.java 如下:

 

代码
package briup;

public class WsTest {

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

WsStub stub
= new WsStub("http://localhost:8080/axis2/services/ws");

WsStub.SayHello sayHello
= new WsStub.SayHello();

sayHello.setUser(
"briup");

WsStub.SayHelloResponse res
= stub.sayHello(sayHello);

System.out.println(res.get_return());
}

}