第一步: 创建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
致此 算成功一段落了... ...