AXIS框架共有两种发布方式:即时发布(JWS-Java Web Service)和定制发布(WSDD)。
我对这两种方式分别做了测试,由于时间关系,我只在此说明一些关键性的步骤。
一:即时发布(JWS)
服务器端:创建一个java项目jwstest_server,创建一个jws_server类,代码如下
public class jws_server { public String test(String a,Integer b){ String resultString="a="+a+",b="+b; System.out.println("Received:"+resultString); return "Server Response OK,you send:"+resultString; } }将jws_server.java改成jws_server.jws,然后拷贝到%TOMCAT_HOME%webapps\axis目录中,然后在地址栏输入 http://localhost:8080/axis/jws_server.jws测试,运行结果如下:
说明发布成功。点击进去就可以看到这个WebService的WSDL描述文件,如下图所示:
客户端:新建一个project,起名jwstest_client,然后建一个class文件jws_client.java。代码如下:
import java.rmi.RemoteException; import javax.xml.namespace.QName; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class jws_client { public static void main(String args[]) throws ServiceException, RemoteException{ String urlString="http://localhost:8080/axis/jws_server.jws"; Service service=new Service(); Call call=(Call)service.createCall(); call.setTargetEndpointAddress(urlString); call.setOperationName(new QName(urlString, "test")); String result=(String)call.invoke(new Object[]{"NKLiming",100}); System.out.println("result="+result); } }然后Run as Application,结果如下:
log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
result=Server Response OK,you send:a=NKLiming,b=100
上述情况没有问题,测试成功。不过在成功之前需要注意几个事项:
1.需要导包,从axis的lib库中导入以下几个包:axis.jar,commons-discovery-0.2.jar,commons-logging-1.0.4.jar,jaxrpc.jar,log4j-1.2.8.jar。如果用到其他的类,可能还需要导入其他的包,现在我的客户端代码中需要用到的axis.jar和jaxrpc.jar,其他的包都是与logging有关的,所有的客户端代码都有有这些包的支持。
2.需要尤其注意这行:
call.setOperationName(new QName(urlString, "test"));后面的参数必须是“test”,我之前用的是“testjws”,运行结果如下:
后来查了一些相关文档,发现QName的构造函数是这样的,
public QName(final String namespaceURI, final String localPart) { this(namespaceURI, localPart, XMLConstants.DEFAULT_NS_PREFIX); }于是,我在地址栏里输入这个网址: http://127.0.0.1:8080/axis/jws_server.jws?wsdl,发现有这几行
<wsdl:portType name="jws_server"> <wsdl:operation name="test" parameterOrder="a b"> <wsdl:input message="impl:testRequest" name="testRequest"/> <wsdl:output message="impl:testResponse" name="testResponse"/> </wsdl:operation> </wsdl:portType>不难看出,此处的test对应的是要调用的服务器端的类的相应的方法名。
3.假如你现在手里只有class或者一个jar包,jws就不再满足你的需求了,最要命的就是及时发布不支持带包的类,这点AXIS的用户手册上写的也很明白。
二、定制发布(WSDD)
由于篇幅问题,我这部分就从简了。
相比及时发布,定制发布更加繁琐更复杂,但是换来的是更大的灵活性,因此实际项目中定制发布还是不二选择。定制发布需要自己编写一个WSDD(Web Service Deployment Descriptor)文件,其实就是一个xml描述文件。
服务器端:
package com.service.wsdd; public class wsdd_server { private int requestCount=0; public String hello(String name){ requestCount++; System.out.println("requestCount="+requestCount); System.out.println("Received:"+name); return "Hello "+name; } public float add(float a,float b){ requestCount++; String result="a="+a+",b="+b; System.out.println("requestCount="+requestCount); System.out.println("Received:"+result); return a+b; } }之后,我是这样操作的,在%TOMCAT_HOME%/webapps/axis/WEB-INF/class目录下建了com目录,进去后建立service,点进后在建立wsdd目录,最后进入wsdd目录将拷贝的wsdd_server.java放进去。形成的目录结构如下图所示
然后运行->cmd,打开命令行,对wsdd_server.java进行编译,如下图所示:
在%TOMCAT_HOME%\webapps\axis\WEB-INF目录下建立配置发布文件deploy.wsdd,内容如下:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="wsdd_server" provider="java:RPC"> <parameter name="className" value="com.service.wsdd.wsdd_server"/> <parameter name="allowedMethods" value="*"/> <parameter name="scope" value="request"/> </service> </deployment>
在这里要尤其需要注意的:在发布时,必须保证tomcat是开启的(这个问题困扰了我一下午,务必要注意),否则就会出现java.net.ConnectException: Connection refused: connect这类的错误,如下图所示:
客户端代码如下:
import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class wsdd_client { public static void main(String[] args){ try { String urlString="http://localhost:8080/axis/services/wsdd_server"; Service service=new Service(); Call call=(Call) service.createCall(); call.setTargetEndpointAddress(urlString); call.setOperationName(new QName(urlString,"hello")); String result=(String)call.invoke(new Object[]{"NKLiming"}); System.out.println("result = "+result); call.setOperationName(new QName(urlString,"add")); Float returnvalue=(Float)call.invoke(new Object[]{new Float(3.2),new Float(2.8)}); System.out.println("returnvalue = "+returnvalue); } catch (Exception e) { e.printStackTrace(); } } }
到此为止,所有的jws和wsdd的测试均完毕了。
PS:忙活了一个下午,刚开始接触webservice的孩纸伤不起啊!