所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统,商场的POS机转账调用的转账方法的代码其实是跑在银行服务器上。
AXIS提供Webservice的两种发布方式:
1. 即时发布 (InstantDeployment);
详情请见: [Java] Webservice之即时发布JWS教程 (一)
2. 定制发布 (CustomDeployment);
定制发布方式: wsdd方式
1> 即时发布是一项令人激动的技术,它使Web服务的开发变得如此简单;然而即时发布并不总是最好的选择,比如有些应用系统是第三方提供的,我们没有购买源代码,只有.class文件,但我们又希望将这个应用系统的一些功能对外发布成Web服务,使其能够在更大范围内产生作用,这个时候即时发布技术就无能为力了。此外,即时发布技术并不灵活,无法进行更多的服务配置,这使得它并不能满足一些特定系统的需求。
2> 将java源代码编译成.class文件,放置到“%Tomcat_HOME%/webapps/axis/”目录下,即可着手进行发布。定制发布不需要构建.jws文件,但必须在” %Tomcat_HOME%/webapps/axis/WEB-INF/”目录下创建服务发布描述文件deploy.wsdd(Web Service Deployment Descriptor的缩写),这个文件负责描述服务的名称、入口等信息!
axis服务下载:http://apache.fayea.com/axis/axis/java/1.4/
1. axis-src-1_4.zip 下载完成后,解压压缩包;
2. 进入到axis-src-1_4\axis-1_4\webapps目录,复制axis整个文件夹;
3. 粘贴到tomcat\webapps目录下,如tomcat\webapps\axis;
4. 启动Tomcat,地址栏输入http://localhost:8080/axis回车,如果出现Apache-Axis等内容就证明服务部署成功;
5. 开始进入案例编写,在Eclipse\MyEclipstc创建一个Java Project,创建Package(eg: com.webservice.wsdd),然后写一个HelloWSDD.java,最后编译这个类;
5.1 目录结构如下:
5.2 编写的Java类:
/**
* @功能: Web Service 定制发布的类 --> 方法
* @author: 吥 悔
* @Q Q: 379839355
* @2015年6月2日 下午11:54:47
*/
package com.webservice.wsdd;
public class HelloWSDD {
private int count = 0;
public String hello(String name){
count++;
System.out.println("hello 调用次数:" + count);
return "欢迎你:" + name;
}
public Float sum(Float a, Float b){
count++;
System.out.println("sum 调用次数:" + count);
return a + b;
}
}
/**
* @功能: 编译HelloWSDD
* @author: 吥 悔
* @Q Q: 379839355
* @2015年6月3日 上午12:03:09
*/
package com.webservice.wsdd;
public class JavacHelloWSDD {
public static void main(String[] args){
new HelloWSDD();
}
}
6. 编译完成后找到项目的工程路径,并找到编译后的HelloWSDD.class文件,然后后退至com目录,复制com文件夹,最后粘贴到tomcat\webapps\axis\WEB-INF\classes目下,如图所示;
7. 接下来需要定制我们的wsdd xml文件,这里命名为deploy.wsdd,创建在当前web工程的WEB-INF目录下;
8. 写完配置后,就需要用axis提供的AdminClient工具类帮我们发布WebService,直到生成server-config.wsdd,
步骤如下:
8.1 进入tomcat\webapps\axis\WEB-INF\目录
8.2 在当前目录按住shift按键
8.3 然后右键出现在此打开命令窗口
8.4 出现DOS窗口,且路径为D:\tomcat6\webapps\axis\WEB-INF>
8.5 输入编译命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd
8.6 如果报连接失败的错误,启动tomcat重新编译一次即可
Exception: AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.net.ConnectException: Connection refused: connect
faultActor:
faultNode:
faultDetail: {http://xml.apache.org/axis/}stackTrace:java.net.ConnectException: Conne
ction refused: connect
8.7 编译成功,当前目录D:\tomcat6\webapps\axis\WEB-INF>生成server-config.wsdd配置文件!
9. 访问http://localhost:8080/axis/,并进入List目录查看是否出现自定义的服务方法;
10. 编写一个访问Web Service服务并调用其服务的方法类ClientWSDD.java;
/**
* @功能: Web Service WSDD
* @author: 吥 悔
* @Q Q: 379839355
* @2015年6月3日 上午1:23:26
*/
package com.client;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
/**
* @介绍:
* WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
* 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!
* 跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。
* 所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,
* 譬如,银联提供给商场的pos刷卡系统,商场的POS机转账调用的转账方法的代码其实是跑在银行服务器上。
* @步骤:
* 2.定制发布
* 1> 编写Java定制服务代码,HelloWSDD.class带工程结构目录,并放置到tomcat\webapps\axis\WEB-INF\目录;
* 2> 需要定制我们的wsdd xml文件,这里命名为deploy.wsdd,创建在当前web工程的WEB-INF目录下;
* 3> 写完配置后,就需要用axis提供的AdminClient工具类帮我们发布WebService,直到生成server-config.wsdd;
* 4> 编写客户端,并调用Web Service中的远程接口及其方法;
*/
public class ClientWSDD {
public static void main(String[] args) {
try {
//定义字符串,描述要访问的服务器地址 [改为自己需要访问的Web Service服务路径]
String url = "http://192.168.8.111:8080/axis/services/HelloWSDD";
//创建一个 Web Service的服务
Service sv = new Service();
//创建一个调用
Call call = (Call) sv.createCall();
//指定服务的来源
call.setTargetEndpointAddress(url);
//指明调用的具体方法名
call.setOperationName(new QName(url, "Hello"));
//执行远端的调用
String result = (String) call.invoke(new Object[]{"吥_悔"});
System.out.println(result);
//指明调用的具体方法名
call.setOperationName(new QName(url, "sum"));
//执行远端的调用
Float resultSum = (Float) call.invoke(new Object[]{new Float(1.2), new Float(1.3)});
System.out.println("a + b = " + resultSum);
} catch (Exception e) {
e.printStackTrace();
}
}
}
11. 执行测试,控制台打印出方法的输出语句,webservice访问调用成功!