wsdl2java -uri ../wsdl/currencyConvert.wsdl -o ../gen_src -ss -sd -g -p foo.bat
实验室想把原来做的一些东西打包成web服务的形式供别人调用,因此趁此机会学习了下axis1.4。现在把学习过程中碰到的一些问题记录下来。
1.axis简介:
Axis(Apache eXtensible Interaction System)是一款开源的WebService 运行引擎,它是SOAP 协议的一个实现,其本身来源于Apache 的另一个项目Apache SOAP。Axis 分为1.x系列和2 系列,两个系列体系结构和使用上有较大的区别,相对而言,Axis1.x 更加稳定,文档也比较齐全,因此本文内容以Axis 1.x 系列最新版本1.4 为基础。
2.axis的安装配置:
可以从官方网页http://ws.apache.org/axis/index.html下载到1.x系列的最终版1.4,建议大家把axis-bin-1_4.zip 和axis-src-1_4.zip 都下下来。
2.1安装到本地:
安装到本地主要是为了应用axis自带的一些小工具。很简单把axis-bin-1_4.zip解压到某个目录即可,我电脑里是D:\JavaTools\axis-1_4,这个目录就是所谓的axis安装目录.
为了这些工具的方便使用,需要设置些环境变量:
AXIS_HOME:D:\JavaTools\axis-1_4
AXIS_LIB:%AXIS_HOME%\lib
AXISCLASSPATH:%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;
前两个我用到了,后面那个一直没用到
2.2安装到Tomcat中:
axis要运行必须有web容器,我使用的是Tomcat。很简单,
1)在axis安装目录中找到webapps文件,打开,然后把里面的axis文件夹及其内容复制到Tomcat的webapps目录下,在我电脑里即有这么个目录D:\JavaTools\Tomcat 6.0\webapps\axis
2)检验是否安装成功:首先启动Tomcat,然后在浏览器里输入http://127.0.0.1:8080/axis/,如果看到下面这个图则说明在Tomcat下安装成功了
注意,axis安装包中少几个jar包,需要单独下载:
必需组件:
http://java.sun.com/products/javabeans/glasgow/jaf.html
可选组件:
http://java.sun.com/products/javamail/
http://xml.apache.org/security/
分别下载:jaf-1_1-fr.zip,javamail-1_4.zip,xml-security-bin-1_2_1.zip包,然后把jaf-1_1-fr.zip里的Activation.jar,javamail-1_4.zip里的mail.jar,xml-security-bin-1_2_1.zip里的xmlsec-1.2.1.jar,xalan.jar都放到你的axis应用的WEB-INF/lib下然后在校验Axis,看到页面提示全部安装成功。
2.3安装到Eclipse
如果你在项目中要用到axis,则你的项目应该包含axis的一些包。这里主要是在客户端编程中要用到。
首先创建一个WEB项目,名称随便, 再把axis安装目录中的lib目录下的所有jar包都导入该项目,这样eclipse中的axis就安装好了,开发webservice就只要在这个项目里开发就行了,如果你在其他项目里开发的话,只要把jar都导过去就行了,简单吧!
安装就讲这么多。。基本上就没什么问题了。
3.开发web service
axis中发布服务主要有两种方式
即时发布虽然很方便,但限制过大,一般不会用。最大限制就是不支持带包的类,这是初学者容易犯的一个错。具体就不讲了,下面通过讲解如何把我们项目的一个算法发布成web service来详细讲解定制发布。
3. 定制发布WSDD
web服务的开发主要分两部分,一部分是服务的提供者,主要要做两件事情,一是完成服务的业务逻辑,也就是完成这个服务真正要做的事,二是完成服务的配制,也就是如何描述你的服务,以使别人能够调用,这一步是重点。另一部分就是服务的使用者,也就是客户端如何调用发布好的服务。因此在学习axis的过程中,一定要分清哪些事是服务器端要做的事,哪些事是客户端要做的事,而网上大部分资料为了讲述方便都放一起讲,让初学者迷惑不已。下面我就分别从这两部分来详细讲述。
首先还是讲述下任务吧,我们的项目SN中有很多好而且实用的算法,这些算法还总要调用服务器中的数据库读取数据,这个项目是BS模式的,现在还需要开发一个CS模式的系统,很多要做的事BS模式中已经做完了,因此,很自然的想法就是直接复用这些算法。一开始是导入jar包的形式,后来发现这样很累,不但jar包很大,更重要的是BS一改,CS就得重导jar包。耦合性太紧。因此就有了把这些算法以web service的形式发布出去的 想法,让CS程序以web 服务的形式调用这些算法!这些天做的事情就是这些,下面以一个具体的算法如何发布出去为例讲述axis中服务的定制发布。
具体任务:SemanticQueryOperate这个类中有一个方法getAdvancedSearchList()用于高级搜索,通过语义匹配从数据库中找到相应的服务。
类加上包名为:cn.edu.tju.ikse.sn.advancedSearch.SemanticQueryOperate
方法:public List<Serviceinfo> getAdvancedSearchList(AdvanceSearch advanceSearch),其中AdvanceSearch 是一个javabean,用于封装用户的查询条件,Serviceinfo也是一个javabean,用于封装服务信息。
任务就是把这个方法接口发布出去。
3.1 Web Service服务端开发
对于服务端,第一件事已经做好了,即已经把业务相关的代码写好了。。下面要做的事就是把这个服务发布出去,也就是如何写描述文件wsdd。
具体语法就不讲了,直接看写好的:snAdvancedSearch.wsdd
Java代码
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="SN_AdvanceSearch" provider="java:RPC">
<parameter name="className" value="cn.edu.tju.ikse.sn.advancedSearch.SemanticQueryOperate"/>
<parameter name="allowedMethods" value="getAdvancedSearchList"/>
<beanMapping qname="myNSD:AdvanceSearch" xmlns:myNSD="urn:BeanService"
languageSpecificType="java:cn.edu.tju.ikse.sn.advancedSearch.AdvanceSearch"/>
<beanMapping qname="myNSD:Serviceinfo" xmlns:myNSD="urn:BeanService"
languageSpecificType="java:cn.edu.tju.ikse.sn.hibernate.Serviceinfo"/>
</service>
</deployment>
第三行,就是给这个服务取一个名字,这样别人就能按照名字来获取服务了。这里我们取名为SN_AdvanceSearch
第四行,指定这个服务代表的具体类,要包括包名
第五行,指定这个服务允许别人访问的方法名,这里只让访问getAdvancedSearchList,如果改成*号,则这个类所有 public的方法都能被客户端调用。
第六行,是重点,完成类型的映射,因为用到了用户自己定义的两个javaBean,因此需要映射。格式如第六行和第七行所示,qname="myNSD:AdvanceSearch" ,注意红色部分应该和你的javabean名一致,languageSpecificType也得注意下格式,java:表示这是一个java语言写的类,后面再加上具体的类。其它自定义类完全可以参考这个写法。
写完后我把这文档放在了D:\JavaTools\Tomcat 6.0\webapps\axis\WEB-INF目录下,下一步是如何把这个wsdd文档加到axis自己的配制文档server-config.wsdd里。
编写完配置发布文件之后,cmd打开windows的控制台,进入:%TOMCAT_HOME%\webapps\axis\WEB-INF 目录下键入如下命令:
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient snAdvancedSearch.wsdd
之后控制台返回Processing file deploy.wsdd 和Done processing 这两段话即说明发布成功。(注意tomcat得开着)。
当然了为了操作方便也可以写个批处理文件wsdd.bat:
Java代码
set Axis_Lib=D:\JavaTools\axis-1_4\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Axis_Servlet=http://localhost:8080/axis/servlet/AxisServlet
%Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% snAdvancedSearch.wsdd
pause
最终效果都是一样的,此时在server-config.wsdd会有如下代码段:
Java代码
<service name="SN_AdvanceSearch" provider="java:RPC">
<parameter name="allowedMethods" value="getAdvancedSearchList"/>
<parameter name="className" value="cn.edu.tju.ikse.sn.advancedSearch.SemanticQueryOperate"/>
<beanMapping languageSpecificType="java:cn.edu.tju.ikse.sn.advancedSearch.AdvanceSearch" qname="ns2:AdvanceSearch" xmlns:ns2="urn:BeanService"/>
<beanMapping languageSpecificType="java:cn.edu.tju.ikse.sn.hibernate.Serviceinfo" qname="ns3:Serviceinfo" xmlns:ns3="urn:BeanService"/>
</service>
和原来的wsdd文件差不多。对着看就明白了。。如果熟悉了可以直接在server-config.wsdd中加上上面这段代码就行了。此时访问http://localhost:8080/axis/servlet/AxisServlet就能看到你发布的服务了,可以查看对应的wsdl文档。
服务端任务基本就完成了。。最后别忘记把服务端对应的class文件拷到D:\JavaTools\Tomcat 6.0\webapps\axis\WEB-INF\classes目录下。由于我们这是一个web工程也是发布在Tomcat中,我是直接把发布的工程中的WEB-INF下的classes文件夹全部拷到axis下对应目录。(似乎还要把lib下的jar包也拷到axis对应的lib目录下)