关于AXIS2发布Webservices和调用webservice

第一步: 创建web项目

编写接口和实现类

具体包路径结构如下


package com.colde.webservice.server;

public interface IWebServiceServer {
	public String saySomething(String str1,String str2,String str3,String str4,String str5);
}
package com.colde.webservice.server.imp;

import com.colde.webservice.server.IWebServiceServer;

public class WebServiceServer implements IWebServiceServer{

	public String saySomething(String str1, String str2, String str3,
			String str4, String str5) {
		// TODO Auto-generated method stub
		return "str1="+str1+"    str2="+str2+"    str3="+str3+"    str4="+str4+"    str5="+str5;
	}

}

第二步:引入axis2的jar包

由于我也不清楚要用哪个,我索性全部引入了。。。

如果没有jar包,推荐去http://mvnrepository.com/这个网址下载。

或者百度云盘: 链接:https://pan.baidu.com/s/13aSXRXZq6AIOIKiaV0oAVw 密码:t699

在WebRoot\WEB-INF\lib文件夹引入相应jar包

第三步:配置 web.xml

只要是引入axis2的相关配置

在web.xml加入下面的配置

<servlet>
      <servlet-name>AxisServlet</servlet-name>
      <display-name>ApacheAxiservlet</display-name>
      <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>AxisServlet</servlet-name>
      <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

这里的display-name标签会报错,但不影响webservices接口的发布和调用。。。具体原因还没找到

第四步:配置services.xml文件

在WEB-INF下创建services文件夹,再创建一个文件夹(这个随意取名),再创建META-INF文件,再创建services.xml文件

具体结构路径:


<parameter name="ServiceClass"> com.colde.webservice.server.imp.WebServiceServer  </parameter>

这个是项目中实现类的路径

<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup> 
	<service name="helloService">
	    <description>Web Service例子</description>
	    <parameter name="ServiceClass">
	        com.colde.webservice.server.imp.WebServiceServer  
	    </parameter>
	    <messageReceivers>
	        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
	            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
	        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
	            class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
	    </messageReceivers>
	</service>
</serviceGroup> 

想配置多个services可以这样配置:

<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup> 
	<service name="helloService">
	    <description>Web Service例子</description>
	    <parameter name="ServiceClass">
	        com.colde.webservice.server.imp.WebServiceServer  
	    </parameter>
	</service>
	<service name="helloService">
	    <description>Web Service例子</description>
	    <parameter name="ServiceClass">
	        com.colde.webservice.server.imp.WebServiceServer  
	    </parameter>
	</service>
	<messageReceivers>
	        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
	            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
	        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
	            class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
	    </messageReceivers>
</serviceGroup> 

第五步:启动web项目,查看发布的webservices

http://localhost:8080/WebserviceTest/services/helloService?wsdl

出现xml页面则表示发布成功


但是单纯进入http://localhost:8080/WebserviceTest/services/会报一下错误,这个还没有研究,之后发现解决方案会再写另外的博客。

报错界面:


第六步:创建客户端调用发布的webservice接口

我由于不想再次创建项目和引入Axis2的jar了,所以直接在原来的web项目里添加客户端调用代码

包路径结构:


QName qname = new QName("http://imp.server.webservice.colde.com", "saySomething");

这个第一个参数是被调用的实现类的包名的反序写法,第二个是webservice接口内的方法

String str1 = "liulx";
String str2 = "666";

String str3 = "622";

String str4= "644";

String str5= "6652";

Object[] param = new Object[]{str1,str2,str3,str4,str5};

这个是上面方法需要传递的参数

package com.colde.client;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.apache.axis2.transport.http.HTTPConstants;

public class WebServiceClient {
	public static void main(String[] args) throws AxisFault {
		//本机tomcat端口默认为8080
		EndpointReference targetEPR = new EndpointReference("http://localhost:8080/WebserviceTest/services/helloService");
		RPCServiceClient sender = new RPCServiceClient();
		Options options = sender.getOptions();
		options.setTimeOutInMilliSeconds(2*20000L);//超时时间20s
		options.setTo(targetEPR);

		QName qname = new QName("http://imp.server.webservice.colde.com", "saySomething");
		String str1 = "liulx";
		String str2 = "666";
		String str3 = "622";
		String str4= "644";
		String str5= "6652";
		Object[] param = new Object[]{str1,str2,str3,str4,str5};
		Class<?>[] types = new Class[]{String.class};  //这是针对返值类型的
		/**
		 * RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。
		 * invokeBlocking方法有三个参数
		 * 第一个参数的类型是QName对象,表示要调用的方法名;
		 * 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
		 * 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。
		 * 
		 * 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
		 */
		options.setManageSession(true);     
		options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT,true);  
		Object[] response = sender.invokeBlocking(qname, param, types);
		sender.cleanupTransport(); //释放连接资源  
		System.out.println(response[0].toString());
	}
}

第七步:效果view


致此 算成功一段落了... ...

猜你喜欢

转载自blog.csdn.net/baidu_35751704/article/details/80238038