使用axis发布webservice(一)
?JDK 1.4.2?+?Myeclipse 6.0(实在经不起诱惑,尝尝鲜)?+ Tomcat 5.0.28 + AXIS 1.4。?AXIS 1.4包可以在http://ws.apache.org/axis/ 找到。?假设所有的环境你已经搭好,并且AXIS包也已经下好了。OK, Here we go~
???????? 解压axis-bin-1_4.zip这个包可以看到webapps目录,双击进入把里面的AXIS文件夹拷到 %TOMCAT_HOME%\webapps目录下,之后拷贝activation.jar、mail.jar、tools.jar到%TOMCAT_HOME%\webapps\axis\WEB-INF\lib目录下。启动tomcat,访问http://localhost:8080/axis/happyaxis.jsp ?如果访问成功,恭喜你!基本的配置你已经做完了。
PS:此处的%TOMCAT_HOME%指的是Tomcat的安装目录,至于那另外的三个jar包,J2EE 1.4库里就能找的到。
??????? 现在来说一下最关键的Webservice的发布。AXIS提供了两种发布方式,一种是即时发布(Instant Deployment),另外一种是定制发布(Custom Deployment)。即时发布提供了一种非常简单的webservice的发布方式,但是其中限制太多,因此在实际的开发中定制发布才是首选。这里也将会以定制发布为重点来介绍。
???? 1.即时发布 JWS (Java Web Service) Files - Instant Deployment ????
????即时发布提供了一种非常简单发布方式,发布者只要有Java源代码(也就是.java文件),然后把其后缀名改成jws(也就是 java web service的缩写)拷贝到%TOMCAT_HOME%\webapps\axis目录下即完成了所有的发布工作。AXIS的编译引擎会处理接下来的所有事情。下面是一段示例代码:
public class HelloAXIS { public String Hello(String name){ return "AXIS say hello to " + name; } } package com.chnic.test; import java.net.URL; import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class Test { public static void main(String[] args) throws Exception{ String targetEendPoint = "http://localhost:8080/axis/HelloAXIS.jws" ; Service service = new Service(); Call call = (Call) service.createCall(); call.setOperationName( new QName(targetEendPoint, "Hello" )); call.setTargetEndpointAddress( new URL(targetEendPoint)); String result = (String) call.invoke( new Object[]{ "Robert" }); System.out.println(result); } } ?package com.chnic.webservice; public class HelloWorld { public HelloWorld(){ } public String hello(String str){ return "Hello " + str; } public int add( int a, int b){ return a + b; }?
??????? 一个带包的很简单的类,在eclipse下编译后按照包名拷到 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes 目录下。以这个类为例,拷贝完之后这个HelloWorld.class的路径就是 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes\com\chnic\webservice。PS: 如果嫌这样太麻烦,可以另外建一个Java Web工程用myeclipse的发布工具发布到Tomcat之后,整体一次性拷贝到websericve的工程中。
?????? 接下来就需要编写发布文件deploy.wsdd。到%TOMCAT_HOME%\webapps\axis\WEB-INF 目录下建立这个文件并在其中添加如下内容:
< deployment xmlns = http://xml.apache.org/axis/wsdd/ xmlns:java = "http://xml.apache.org/axis/wsdd/providers/java" > < service name = "HelloWorld" provider = "java:RPC" > < parameter name = "className" value = "com.chnic.webservice.HelloWorld" /> < parameter name = "allowedMethods" value = "*" /> </ service > </ deployment >?
?????? 简单的介绍下各个节点的含义,"HelloWorld"当然是这个webservice的名字,后面紧跟的java:RPC指的是服务类型。这里一共有有4种类型,分别是:RPC, Document, Wrapped 和 Message。有兴趣可以看下?org.apache.axis.providers这个包和子包下面的类的API文档。之后的parameter节点第一个当然是指出具体的类,第二个从字面上也很好理解:允许调用的方法。这里的配置告诉引擎可以调用所有的public方法,当然你也可以自己指定。
???? 编写完配置发布文件之后,cmd打开windows的控制台,进入%TOMCAT_HOME%\webapps\axis\WEB-INF目录下键入如下命令??
备注:------------------------------------------------------在运行java org.apache.axis.client.AdminClient deploy.wsdd时,可能出现错误: java org.apache.axis.client.AdminClient deploy.wsdd Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/Axis/client/AdminClient could not find the main class: org.apache.Axis.client.AdminClient解决办法1:1)在系统环境变量里新添变量AXIS_HOME=D:\Tomcat\webapps\axis\WEB-INF AXISCLASSPATH=.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;2)这个环境变量里的值,对应着AXIS_HOME\WEB-INF\lib下的所有jar文件,注意一定要一一对应,错一不可。3)确保tomcat开启4)在cmd中运行 java -cp %AXISCLASSPATH% ora.apache.axis.client.AdminClient deploy.wsdd 解决办法2:1)在系统环境变量里新添变量AXIS_HOME=D:\Tomcat\webapps\axis\WEB-INF 2)在系统环境变量的classpath后添加.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;3)在cmd中运行 java ora.apache.axis.client.AdminClient deploy.wsdd 最终得到如下输出: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart Processing file deploy.wsdd <Admin>Done processing</Admin>虽然提示有一个警告 Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart,可以无视这个警告。 生成成功
?
?
?
-------------------------------------------------------
发布成功之后你可以通过访问 http://localhost:8080/axis/servlet/AxisServlet 来查看你所有的定制发布的服务。
String targetEendPoint = "http://localhost:8080/axis/services/HelloWorld" ; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new URL(targetEendPoint)); call.setOperationName( new QName(targetEendPoint, "hello" )); String result = (String) call.invoke( new Object[]{ "Robert" }); System.out.println(result); call.setOperationName( new QName(targetEendPoint, "add" )); Integer res = (Integer) call.invoke( new Object[]{ new Integer( 1 ), new Integer( 2 )}); System.out.println( "The result is: " + res);?
?????? 运行测试代码,控制台显示 Hello Robert 和 The result is: 3 这两句话,说明发布成功。仔细观察下发现其实除了那个targetEndpoint 之外,即时发布和定制发布的客户端调用代码基本上都是一样的。定制发布的URL可以在WSDL文件里找到。?