一 学习前的准备

开发环境 JBOSS4.05+axis1.4+JDK1.5

axis1.4下载地址: http://www.apache.org/dist/ws/axis/1_4/,选择axis-bin-1_4.zip   

所需要的JAR包:

 

二 部署axis

以我们CreateGWS405产品为例,在产品server\default\deploy目录下新建一个应用,比如叫myService.war。在里面新建文件夹“WEB-INF”,将axis1.4以下目录中的web.xml文件拷贝到“WEB-INF”下。“axis-bin-1_4\axis-1_4\webapps\axis\WEB-INF“。然后将jar包拷贝到产品server\default\lib下。至此部署完毕。

 

三 开发webService服务端

 

  用编辑器编写一个简单的服务类,代码如下:

import java.util.*;
import java.text.*;
 
public class SayHello {
public String say(String name){
System.out.println("call webservice say.....");
return " Hello " + name;
}
}

将该类复制到myService.war中与“WEB-INF”同级目录,然后更改其名字为”SayHello.jws”。

启动CreateGWS405,在浏览器地址输入http://localhost:88/myService/SayHello.jws?wsdl打开页面后你会看到

点击链接,如果你上面的步骤都正常,类也没有带

其他包的话,那么就生成了wsdl了。

至此webService服务端发布成功,接下来就是编写客户端了。

 

 

 

四  开发webService客户端。(DLL方式)

JSP页面,代码如下:

String urlname = "http://localhost:88/myService/SayHello.jws?wsdl";
Service s = new
Call call = (Call) s.createCall();
//要调用的方法名称
call.setOperationName("say");
call.setTargetEndpointAddress(urlname);
//方法传入一个String型参数,返回值也是String
String val = (String) call.invoke(new Object[] { "haha"
System.out.println(val);

需要导入:import

import

 

至此一个简单的客户端就编写好了。上面服务端的方法参数是String,返回值也是String,而实际业务中可能还需要以int,boolean等类型做参数,而且参数不止一个。返回值有时是int有时又是集合ArrayList那该怎么做呢,请看下面这个服务端代码

import java.util.*;
import java.text.*;
 
 
public class SayHello {
public String say(String name){
System.out.println("call webservice say.....");
return " Hello " + name;
}
public ArrayList getList(String str){
    ArrayList strs = new ArrayList();
    System.out.println("call webservice getList.....");
    strs.add("A");
    strs.add("B");
    strs.add("C");
    strs.add(str);
    return strs;
}
 
public String [] getStrs(String str,int a){
    System.out.println("call webservice getStrs.....");
    String[] abc = new String[a];
    abc[0]=str;
    return abc;
}
 
public int getInt(String arg){
    System.out.println("call webservice getInt.....");
    return arg.length();
}
 
}
 
这个服务端有4个方法,分别返回不同类型的值。客户端就要改成
String urlname = "http://localhost:8080/aixs_proxy_demo/SayHello.jws?wsdl";
Service s = new
try
Call call = (Call) s.createCall();
//要调用的方法名称
call.setOperationName("say");
call.setTargetEndpointAddress(urlname);
//方法传入一个String型参数,返回值也是String
String val = (String) call.invoke(new Object[] { "haha"
System.out.println(val);
Call call4 = (Call) s.createCall();
//要调用的方法名称
call4.setTargetEndpointAddress(urlname);
call4.setOperationName("getList");
String st1 = "abc";
//传入参数类型为String
call4.addParameter(new QName("st1"), XMLType.XSD_STRING, ParameterMode.IN);
//返回一个ArrayList
call4.setReturnType(new QName("ArrayList"), ArrayList.class);
ArrayList list = (ArrayList) call4.invoke(new
System.out.println("+++++"
Call call2 = (Call) s.createCall();
String st2 = "abc";
int
call2.setOperationName("getStrs");
call2.setTargetEndpointAddress(urlname);
//传入参数类型为String和int
call2.addParameter(new QName("st2"), XMLType.XSD_STRING, ParameterMode.IN);
call2.addParameter(new QName("count"), XMLType.XSD_INT, ParameterMode.IN);
//返回一个String[]
call2.setReturnType(new QName("String[]"), String[].class);
String[] strs = (String[]) call2.invoke(new
Integer.valueOf(count) });
System.out.println("-----" + strs.length);
Call call3 = (Call) s.createCall();
String st3 = "abcdefg";
call3.setOperationName("getInt");
call3.setTargetEndpointAddress(urlname);
//传入参数类型为String
call3.addParameter(new QName("st3"), XMLType.XSD_STRING, ParameterMode.IN);
//返回一个int
call3.setReturnType(new QName("Integer"), Integer.class);
Integer getint = (Integer) call3.invoke(new
System.out.println(getint);
 
} catch
e.printStackTrace();
}

需要导入: 

import
import
import
import
import
import

 

 

学习中需要注意的地方:

1、 在客户端调用其他程序的类时需要先把外部类引入到myService.war\WEB-INF\下新建classes文件夹,包路径与原类相同,如果是jar文件,则需要复制到myService.war\WEB-INF\lib下。这样.jws格式文件才能正确编译为.class文件。

2、 调用其他服务器上的webservice时需要注意一定要将包导入完全,如果包缺少会影响使用。

 

 

 

 

 

 

 

五 开发webService客户端。Dynamic Proxy方式 (代理方式)

 

webService我们只需要对客户端的代码进行修改就可以了,代码如下

String wsdlUrl = "http://localhost:8080/aixs_proxy_demo/SayHello.jws?wsdl";
String nameSpaceUri = "http://localhost:8080/aixs_proxy_demo/SayHello.jws";
// 服务名
String serviceName = "SayHelloService";
// 服务
String portName = "SayHello";
// 创建代理对像
ServiceFactory serviceFactory;
try
 
serviceFactory = ServiceFactory.newInstance();
//创建远程服务
Service service = (Service) serviceFactory.createService(new URL(wsdlUrl), new
nameSpaceUri, serviceName));
//向上转型为接口
MyServiceInterface proxy = (MyServiceInterface) service.getPort(
new QName(nameSpaceUri, portName), MyServiceInterface.class);
//调用相应方法
System.out.println("proxy.say ----"
+ proxy.say("li lei"));
System.out.println("proxy.getList ----"
+ proxy.getList("AAAA").size());
System.out.println("proxy.getStrs ----"
+ proxy.getStrs("BBBB",10).length);
System.out.println("proxy.getInt ----"
+ proxy.getInt("ABCDEFG"));
} catch
e.printStackTrace();
} catch
e.printStackTrace();
}
需要导入:
import
import
 
import
import
import
 
import

 

 

MyServiceInterface接口类的编写

 

import
import
 
 
public interface MyServiceInterface extends Remote{
public String say(String name);
public ArrayList getList(String str);
public String [] getStrs(String str,int a);
public int getInt(String arg);
 
}

 

需要注意的是:

1、 接口必须继承Remote类,才能做代理

2、 接口里面的方法必须和jws文件中的方法保持一致。