webservice学习之AXIS初学笔记--创建自己的webservice

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学习之AXIS初学笔记--创建自己的webservice_第1张图片

说明发布成功。点击进去就可以看到这个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进行编译,如下图所示:

webservice学习之AXIS初学笔记--创建自己的webservice_第2张图片

在%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>

编写完配置发布文件之后,cmd打开windows的控制台,进入:%TOMCAT_HOME%\webapps\axis\WEB-INF 目录下键入如下命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd之后控制台返回Processing file deploy.wsdd 和Done processing 这两段话即说明发布成功。成功之后的目录中会多一个server-config.wsdd的文件。如下:


在这里要尤其需要注意的:在发布时,必须保证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的孩纸伤不起啊!

你可能感兴趣的:(webservice学习之AXIS初学笔记--创建自己的webservice)