1、用 JAVA 开发 WEB Service一 学习前的准备开发环境 JBOSS4.05+axis1.4+JDK1.5axis1.4 下载地址: http:/www.apache.org/dist/ws/axis/1_4/,选择 axis-bin-1_4.zip 所需要的 JAR 包:二 部署 axis以我们 CreateGWS405 产品为例,在产品 serverdefaultdeploy 目录下新建一个应用,比如叫myService.war。在里面新建文件夹“WEB-INF” ,将 axis1.4 以下目录中的 web.xml 文件拷贝到“WEB-INF”下。 “axis-bin-1_4ax
2、is-1_4webappsaxisWEB-INF“。然后将 jar 包拷贝到产品 serverdefaultlib 下。至此部署完毕。三 开发 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”同级目录,
3、然后更改其名字为 ”SayHello.jws”。启动 CreateGWS405,在浏览器地址输入 http:/localhost:88/myService/SayHello.jws?wsdl 打开页面后你会看到Click to see the WSDL -点击链接 ,如果你上面的步骤都正常, 类也没有带其他包的话,那么就生成了 wsdl 了。至此 webService 服务端发布成功,接下来就是编写客户端了。四 开发 webService 客户端。 (DLL 方式)这里为了方便测试,我们就以 CreateGWS405 产品为客户端,在 create.war 下新建一个 JSP 页面,代码如下:
4、String urlname = “http:/localhost:88/myService/SayHello.jws?wsdl“;Service s = new Service();Call call = (Call) s.createCall();/要调用的方法名称call.setOperationName(“say“);call.setTargetEndpointAddress(urlname);/方法传入一个String 型参数,返回值也是StringString val = (String) call.invoke(new Object “haha“ );System.out.pri
5、ntln(val);需要导入:import org.apache.axis.client.Call;import org.apache.axis.client.Service;至此一个简单的客户端就编写好了。上面服务端的方法参数是 String,返回值也是 String,而实际业务中可能还需要以 int,boolean 等类型做参数,而且参数不止一个。返回值有时是int 有时又是集合 ArrayList 那该怎么做呢,请看下面这个服务端代码import java.util.*;import java.text.*;public class SayHello public String say(
6、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
7、a)System.out.println(“call webservice getStrs.“);String abc = new Stringa;abc0=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“;Servic
8、e s = new Service();try Call call = (Call) s.createCall();/要调用的方法名称call.setOperationName(“say“);call.setTargetEndpointAddress(urlname);/方法传入一个String型参数,返回值也是StringString val = (String) call.invoke(new Object “haha“ );System.out.println(val);Call call4 = (Call) s.createCall();/要调用的方法名称call4.setTarget
9、EndpointAddress(urlname);call4.setOperationName(“getList“);String st1 = “abc“;/传入参数类型为Stringcall4.addParameter(new QName(“st1“), XMLType.XSD_STRING, ParameterMode.IN);/返回一个ArrayListcall4.setReturnType(new QName(“ArrayList“), ArrayList.class);ArrayList list = (ArrayList) call4.invoke(new Object st1 )
10、;System.out.println(“+“ + list.size();Call call2 = (Call) s.createCall();String st2 = “abc“;int count = 303;call2.setOperationName(“getStrs“);call2.setTargetEndpointAddress(urlname);/传入参数类型为String和intcall2.addParameter(new QName(“st2“), XMLType.XSD_STRING, ParameterMode.IN);call2.addParameter(new QN
11、ame(“count“), XMLType.XSD_INT, ParameterMode.IN);/返回一个Stringcall2.setReturnType(new QName(“String“), String.class);String strs = (String) call2.invoke(new Object st2,Integer.valueOf(count) );System.out.println(“-“ + strs.length);Call call3 = (Call) s.createCall();String st3 = “abcdefg“;call3.setOper
12、ationName(“getInt“);call3.setTargetEndpointAddress(urlname);/传入参数类型为Stringcall3.addParameter(new QName(“st3“), XMLType.XSD_STRING, ParameterMode.IN);/返回一个intcall3.setReturnType(new QName(“Integer“), Integer.class);Integer getint = (Integer) call3.invoke(new Object st3);System.out.println(getint); ca
13、tch (Exception e) e.printStackTrace();需要导入: import java.util.ArrayList;import javax.xml.namespace.QName;import javax.xml.rpc.ParameterMode;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.XMLType;学习中需要注意的地方:1、 在客户端调用其他程序的类时需要先把外部类引入到 myService.
14、warWEB-INF下新建classes 文件夹,包路径与原类相同,如果是 jar 文件,则需要复制到myService.warWEB-INFlib 下。这样.jws 格式文件才能正确编译为.class 文件。2、 调用其他服务器上的 webservice 时需要注意一定要将包导入完全,如果包缺少会影响使用。五 开发 webService 客户端。Dynamic Proxy 方式 (代理方式)还是以上面那个服务端为例,用代理的方式来调用 webService 我们只需要对客户端的代码进行修改就可以了,代码如下String wsdlUrl = “http:/localhost:8080/aixs
15、_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 = (Serv
16、ice) serviceFactory.createService(new URL(wsdlUrl), new QName(nameSpaceUri, serviceName);/向上转型为接口MyServiceInterface proxy = (MyServiceInterface) service.getPort(new QName(nameSpaceUri, portName), MyServiceInterface.class);/调用相应方法System.out.println(“proxy.say -“+ proxy.say(“li lei“);System.out.printl
17、n(“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 (MalformedURLException e) e.printStackTrace(); catch (ServiceException e) e.printStackTrace();需要导入:import .Malf
18、ormedURLException;import .URL;import javax.xml.namespace.QName;import javax.xml.rpc.ServiceException;import javax.xml.rpc.ServiceFactory;import org.apache.axis.client.Service;MyServiceInterface 接口类的编写import java.rmi.Remote;import java.util.*;public interface MyServiceInterface extends Remotepublic 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 文件中的方法保持一致。