3.2客户端程序的开发
3.2.1 java2WSDL
这个工具应该是服务器端的人应该用的,放在这里主要是为了讲述方便。调用这个工具可以根据java类生成对应的wsdl文件发布出去。下面是一个批处理文件,大家可以保存下来,稍微改改就能用了。
set Axis_Lib=D:\JavaTools\axis-1_4\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
%Java_Cmd% org.apache.axis.wsdl.Java2WSDL
-osn_advanceSearch.wsdl
-lhttp://localhost:8080/axis/services/SN_AdvanceSearch
-n"urn:BeanService"
-p"cn.edu.tju.ikse.sn.advancedSearch" "urn:BeanService" cn.edu.tju.ikse.sn.advancedSearch.SemanticQueryOperate
pause
-O:指定生成的wsdl文件名
-l:指定生成服务的访问地址
-n:指定名字空间
-p:指定名字空间与包的对应关系
最后指定具体的java类即你要发布的类。
这个工具最适用的环境:服务端根据业务需要写完暴露的接口后就可以用这个工具生成wsdl文件了,而不必要自己动手写wsdl文件,理论上就可以根据这个wsdl文档发布这个服务了。客户端一般是不会调用这个方法的。。因为客户端一般拿不到类文件~~放在这里讲是告诉大家有这么一个好用的工具。
3.2.2 WSDL2java
这个工具是根据wsdl文件生成对应的调用类。这个在客户端是很有用的。当你只能从服务端拿到wsdl文档而不能拿到任何的代码或类文件时就得靠它了!这个工具会根据wsdl文档的定义生成一些对应的类,如复杂类型定义就会生成对应的javaBean..
编辑一个WSDL2Java.bat,Axis_Lib为axis.jar路径。内容如下:
set Axis_Lib=D:\JavaTools\axis-1_4\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:\JavaTools\eclipse3.2\workplace\axisTest\src
set Package=cn.edu.tju.ikse.sn.advancedSearch
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% http://localhost:8080/axis/services/SN_AdvanceSearch?wsdl
pause
应该不用解释吧。。很容易看懂,主要是调用WSDL2Java 根据服务端发布的服务生成对应的接口。
倒数第二行是应用wsdl2java这个工具,最后是指定wsdl文件的位置,这个文件可以是本地的wsdl文件,也可以是网络上的wsdl文件。
再解释下第三行,第三行是我客户端项目的源文件路径,这样通过工具生成的代码直接加到项目里了,省些复制粘贴的麻烦。刷新下项目,在包cn.edu.tju.ikse.sn.advancedSearch 下就能看到六个java文件:
AdvanceSearch.java//自定义类型,wsdl中的复杂类型定义都会生成对应的javaBean
Serviceinfo.java//这也是一个自定义类型。。一开始没生成这们。。后面的注意事项里会讲到原因。
SemanticQueryOperate.java,//这是一个接口,描述服务器端能干什么。对应于wsdl中的wsdl:portType
SemanticQueryOperateService.java,//这是一个接口.相当于wsdl中的wsdl:service结点
SemanticQueryOperateServiceLocator.java,实现了SemanticQueryOperateService接口.
这个类的作用是直接与服务器端通信,建立与服务器端的连接,实例化stub.然后客户端就可以通过stub与服务器通信了.
SN_AdvanceSearchSoapBindingStub.java.这个类实现了SemanticQueryOperate接口,作为服务器在客户端的存根,也就是一个stub.在客户端,对服务器的所有调用,本质上都是对stub的调用
3.2.3 客户端编码
客户端编码主要有两种方式:
- 第一种方法是利用wsdl2java生成的stub类来进行调用,这种方式的好处是调用简单,不需要服务端的支持
- 第二种方法是不通过stub类来进行调用,这种方式完全由用户控制调用的所有参数。
实际使用中应该多用第一种方式,代码写起来简单。下面分别进行讲述。
先讲第二种方式吧,看代码:
public static void testadvancesearch() {
//设置服务连接路径
String url = "http://127.0.0.1:8989/axis/services/SN_AdvanceSearch";
//下面是构建服务的输入参数
AdvanceSearch search = new AdvanceSearch();
search.setDomain("Biology");
search.setServiceName("getENTRYbyScientificName");//getENTRYbyScientificName
try {
Service service = new Service();//构建一个服务
Call call = (Call) service.createCall();
//注册javaBean 注意和server-config.wsdd保持一致
QName qn = new QName("urn:BeanService", "Serviceinfo");
call.registerTypeMapping(Serviceinfo.class, qn,
new org.apache.axis.encoding.ser.BeanSerializerFactory(
Serviceinfo.class, qn),
new org.apache.axis.encoding.ser.BeanDeserializerFactory(
Serviceinfo.class, qn));
//创建调用*/
call.setTargetEndpointAddress(new java.net.URL(url));
//调用服务器的方法
call.setOperationName(new QName("SemanticQueryOperate",
"getAdvancedSearchArrayList"));
//设定返回类型
//call.setReturnClass(ArrayList.class); //call.invoke(new Object[]{"haha"});
//设定传入参数
//call.addParameter("userpara", XMLType.XSD_ANYTYPE, ParameterMode.IN);
//System.out.println(new Object[]{userPar});
//接受结果
Object[] result = (Object[]) call.invoke(new Object[] { search });
if (result != null && result.length > 0) {
for (int i = 0; i < result.length; i++) {
Serviceinfo serviceinfo = (Serviceinfo) result[i];
System.out.println(serviceinfo.getCatagoryName()
+ serviceinfo.getAffiliation());
}
}
} catch (ServiceException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
上面代码已经注释得差不多了。就不具体解释了。
再看第一种方式的调用:
public static void testadvancesearchstub() throws ServiceException {
// 创建你要对话的服务
SemanticQueryOperateService service = new SemanticQueryOperateServiceLocator();
SemanticQueryOperate client = service.getSN_AdvanceSearch();
//构建服务的输入参数
AdvanceSearch search = new AdvanceSearch();
search.setDomain("Biology");
search.setServiceName("dna");//getENTRYbyScientificName
Object[] retValue = null;
try {
//调用服务,获得结果
retValue = client.getAdvancedSearchArrayList(search);
System.out.println("start");
if (retValue != null && retValue.length > 0) {
for (int i = 0; i < retValue.length; i++) {
Serviceinfo serviceinfo = (Serviceinfo) retValue[i];
System.out.println(serviceinfo.getCatagoryName()
+ serviceinfo.getAffiliation());
}
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通过代码可以看出第一种方式比较简单,把配置和调用分开了。也不具体讲了,基本上看着代码就知道是什么意思。下一小节再讲这种方式的好处和需要注意的地方。
分享到:
相关推荐
axis1.4完整包下载Apache Axis是一种SOAP(简单对象访问协议”)实现。 包含 Axis1.4的所有完整包。
axis1.4生成客户端 根据WSDL生成客户端和服务端
axis1.4和axis2相关jar文件,axis1.4和axis2相关jar文件
springboot 集成axis1.4的webservice,该为maven的工程
Axis1.4如何实现头部鉴权(包括实现类模板)
内有axis1.4jar包以及使用eclipse和axis1.4 将WSDL和服务端代码互转方法 亲测可用
axis1.4生成访问客户端代码
Axis1.4从服务端到客户端图文攻略,同时附赠Axis1.4 Jar包。 本攻略经过多次测试可靠耐用,并同时带有详细的文字说明,保证一学就会!从现在起axis不再是问题!让你爱上web service!
axis1.4的帮助文档,WEBService发布必备产品。
用于axis1.4开发webService。 文件包含,axis1.4.ZIP以及其他所需jar包,和生成webservice客户端,生成webService服务端发布 的详细教程说明。
Axis1.4开发指南 介绍Axis1.4的开发方式,并附上不少范例代码
axis1.4 webservice个人学习笔记
Axis1.4开发指南.pdf axis-bin-1_4.zip axis相关文档 axis1.4 开发jar包
使用spring3+ cxf 3.4做服务方,Axis1.4做请求方,在调用的时候,通过转换cxf的wsdl格式为axis1.4的wsdl格式来达到调用的目的。
java org.apache.axis.wsdl.WSDL2Java -u http://xxxxxx?wsdl -p com.webservice.wsdl -t -u 要访问的webservice的地址标准的wsdl文件 -p 生成java文件的包名 -t 生成的java文件中包含junit的测试代码。 详见...
axis1.4学习示例(详细步骤说明)axis1.4
webservice axis1.4服务搭建
axis1.4+mybatis3+spring3集成实现webservice;websphere下Log4j记录日志解决方案;
里面包含axis1.4使用到的jar包以及详细的使用方法和实例