本文共 4074 字,大约阅读时间需要 13 分钟。
axis 支持三种 web service 的部署和开发,分别为:
1.Dynamic Invocation Interface ( DII)
2.Stubs 方式
使用dii的方式:
1. 编写服务端程序HelloService public class HelloService{ public String getName(String name) { return "Welcome to Axis, "+name; } } 2. 将源码拷贝到AXIS_HOME 下,重命名为 HelloService.jws 3. 访问连接 ,页面显示axis 自动生成的wsdl( 并且在axis\WEB-INF\jwsClasses 生成HelloService.class 类文件) 4. 编写访问服务的客户端 HelloClient.java, 编译, 执行, 在命令提示行下会看到 "return value is Welcome to Axis ,fengshan" public class HelloClient {
public static void main(String[] args) {
try {
String endpoint =
"http://localhost:8080/axis/HelloService.jws"; Service service = new Service(); Call call = null; call = (Call) service.createCall(); call.setOperationName(new QName( "http://localhost:8080/axis/HelloService.jws", "getName")); call.setTargetEndpointAddress(new java.net.URL(endpoint)); String ret = (String) call.invoke(new Object[] { "fengshan" }); System.out.println("return value is " + ret); } catch (Exception ex) { ex.printStackTrace(); } } } 总结 :dii
方式比较简单,
服务器端暴露一个类,
客户端通过固定的方式(套路来访问服务器提供的服务) 服务器:
写一个类,
里面有一个业务方法,
然后将后缀名字从java
改成jws
客户端:1.
构造连接地址:http://localhost:8080/axis/HelloService.jws (ip+
路径+
类名.jws)
2.
构造vservice
对象,
掉用service
对象的createCall()
方法返回call
对象 3.
调用call
对象的etOperationName()
方法设置访问webservice
资源的参数 4.
调用call
对象的invoke()
方法,
并且传递对象数组,
字符串类型,(
通过wsdl
可以观察出request
和response
的参数,
根据这些表述,
来设置请求参数和接受返回数据)
使用Stubs方式:
1.
服务器端仍然使用HelloService.java,
编译后将他放在axis\WEB-INF\classes
下 2.
编写deploy.wsdd
文件,
声明服务器端需要发布的webservice
的名字,
和她的方法(
放在web-inf
目录下)
< deployment xmlns ="http://xml.apache.org/axis/wsdd/" xmlns:java ="http://xml.apache.org/axis/wsdd/providers/java" > < service name ="HelloService" provider ="java:RPC" > < parameter name ="className" value ="HelloService" /> < parameter name ="allowedMethods" value ="*" /> <!---这里也可以填写需要暴露的方法的名字->
</ service > </ deployment > 3.
切换到deploy.wsdd
所在目录,运行java org.apache.axis.client.AdminClient deploy.wsdd
,如果部署成功,会输出<Admin>Done processing</Admin>
信息。可以点击 浏览器中List
来查看所发布的服务。 4. 接下来客户端测试该服务。
首先,在环境变量中设置 CLASSPATH ,加入以下 jar : %AXIS_LIB%\axis.jar;
%AXIS_LIB%\axis-ant.jar;
%AXIS_LIB%\commons-discovery.jar;
%AXIS_LIB%\commons-logging.jar;
%AXIS_LIB%\jaxrpc.jar;
%AXIS_LIB%\saaj.jar;
%AXIS_LIB%\log4j-1.2.8.jar;
%AXIS_LIB%\wsdl4j.jar
可以通过以下命令查看是否设置好了 CLASSPATH : Echo %CLASSPATH% 。
Axis 提供了实现WSDL2Java 的命令行工具org.apache.axis.wsdl.WSDL2Java ,利用这个工具可以从WSDL 地址处生成Java 代码。命令如下:( 在axis 目录下)
java org.apache.axis.wsdl.WSDL2Java -Nhttp://localhost:8080/axis/services/HelloService=com
会在com (由上述命令行中参数设定)包下生成HelloService.java 、HelloServiceService.java 、HelloServiceServiceLocator.java 和HelloServiceSoapBindingStub.java 四个文件。
5. 编写测试类( 在axis 目录下) public class HelloClient
{
public static void main(String[] args)
{
try {
com.HelloServiceServiceLocator locator=
new com.HelloServiceServiceLocator();
com.HelloService service=locator.getHelloService();
System.out.println(service.getName(
"fengshan"));
}
catch(Exception e)
{
System.err.println(
"Execution failed.Exception:"+e);
}
}
}
总结:Stubs
方式主要是服务器端使用deploy.wsdd
文件,
写好需要暴露的webservice
的名字和其中的方法,
使用 java org.apache.axis.client.AdminClient deploy.wsdd
将她部署在服务器上供外界调用,
而外界使用 java org.apache.axis.wsdl.WSDL2Java -Nhttp://localhost:8080/axis/services/HelloService=com
将远端的webservice
映射成本地类,
供自己使用 1.
在获得自动映射的4
个类以后,new
一个 loctor
对象,
这个对象实现了 一个接口(HelloServiceService ),
调用接口种的方法getHelloService()
获得一个service
对象,
然后用这个对象调用webservice
暴露的方法会得到一个返回值(String).
public class HelloWorldClient1 {
public static void main(String[] args) {
try {
Service service = new Service();
String Url = "http://localhost:8080/axis/services/HelloService";
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(Url);
call.setOperationName(new QName(Url, "getName"));
String result = (String) call.invoke(new Object[] { "winwin" });
System.out.println(result);
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
其实上面四个自动生成的 java 文件也就是像以上这个客户端这样来调用的。可以对照看看。 本文转自 yzzh9 51CTO博客,原文链接:http://blog.51cto.com/java999/187468,如需转载请自行联系原作者