使用axis2发布/调用WebService
的有关信息介绍如下:
因为工作原因学习了一下axis2,有些心得总结一下。
axis2:在网上发布自己提供的服务,相当于提供一个接口,然后使用者 就能根据自己的需要调用它们,所以可以分成两部分,发布 webservice,调用webservice
1、首先打开axis2文件夹里面的axis2-1.6.2-war.zip压缩文件,然后把解压后的war包放到tomcat的webapps里,启动tomcat的时候就会自动生成相应的文件,放进去就不用管它了。(剩下的几个压缩文件为帮助文档和源码)
这时候启腊激动tomcat,访问http://127.0.0.1:8080/axis2/,如果能看到axis2的Welcome!页面,就说明axis2部署成功了。点一下页面选项Services,会跳转到axis2自带的服务页面;另外点击Administration选项,输入用户名:admin,密码:axis2,登陆进去可以配置axis2的一些配置,以及发布更新aar包
新建一个动态web project,起名Test,编写java类,命名HelloWorld,具体代码如下:
packagecom.inspur.service;
publicclassHelloWorld {
publicString sayHello(String name){
return"Hello,"+name+".";
}
publicString saySorry(String name){
return"Sorry,"+name+".";
}
publicString getWorld(){
return"Hello,World";
}
}
此类相当于提供了一个HelloWorld接口,内含三个服务,前两个获取使用者传入的值来返回相应的结果,后一个直接调用就能返回相应的结果。
3、把tomcat安装目录下的webapps/axis2/WEB-INF下的modules、service和conf文件夹拷到 HelloWorld项目webContent下的WEB-INF下,把lib里面的jar包,也拷到项目的lib里面。
然后在项目WEB-INF下的services文件夹里新建HelloWorld/META-INF路径,META-INF下新建 services.xml,内容如下:
MyService
com.inspur.service.HelloWorld
<涛宿胳/service>
此配置文件的作用就是相当于一个映射,把提供服务的实体类的具体路径映射出来,三个operation- name对应三个方法名,而且名字一定要一一对应,不能随意更改。class引用为固定的,无需变动。
在项目的web.xml里添上如下配置:
(这一步可以先跳过去,如果下一步执行页面报500,可以回头看一下这一步)
因为项目自定义的过滤器会和axis2配置起冲突,所以我在过滤器里面把起冲突的services文件夹忽略掉,(各位具体情况具体调整)所以继续修改项目web.xml文件:
找到
在
变成
这时候就能通过http://127.0.0.1:8080/Test/services/HelloWorld/getWorld来访问自己发布的webservice,getWorld为方法名,如果为有参方法,要加上(?name=要传的值)“name”要和实体类里面方法的参数名一致,例如http://127.0.0.1:8080/Test/services/HelloWorld/sayHello?name=xxxx
另外也可以通过访问http://127.0.0.1:8080/Test/services/HelloWorld?wsdl来查看发布的webservice网络服务描述,里面自动生成介绍你的Web service有什么功能,以及每个函数调用时的参数,描述Web service及其函数、参数和返回值。相当于针对你发布的webservice的一个使用文档。
到这里,使用axis2发布webservice就算告一段落。
另附上使用axis2发布webservice的另一种方法,亲测可用,有兴趣可以试一下。
1、(第一步和方法一步骤一样)axis2.war包放到tomcat的webapps目录下,启动tomcat,访问地址http://127.0.0.1:8080/axis2/,即可访问axis2的Welcome!页面。访问地址http://127.0.0.1:8080/axis2/services/listServices可访问服务列表,和前面步骤一样,就不赘述。
2、编译服务端项目HelloWorld后,将HelloWorld.class文件放到
tomcat\webapps\axis2\WEB-INF\pojo目录中【注:若没有pojo目录,则手动新建该目录】。
在浏览器地址栏中输入如下的URL:
http://127.0.0.1:8080/axis2/services/listServices 即可访问刷新后的服务列表。
【注:POJO类不能使用package关键字声明包,若使用axis2管理平台发布,则需要修改 HelloWorld类,去掉package字段。意思是java文件编译成class文件之前,只能放在src下面的 default默认包里面,不能含有package,不能新建包,不然webservice就会访问失败,这也算是一个局限性】
webservice有四种不同的客户端:
——传统式, 非阻塞式, 双工模式, 双工非阻塞
这里说的是传统式客户端。
首先建立类Client,代码如下(未注释的地方无需更改):
packagecom.inspur.client;
importorg.apache.axiom.om.OMAbstractFactory;
importorg.apache.axiom.om.OMElement;
importorg.apache.axiom.om.OMFactory;
importorg.apache.axiom.om.OMNamespace;
importorg.apache.axis2.AxisFault;
importorg.apache.axis2.addressing.EndpointReference;
importorg.apache.axis2.client.Options;
importorg.apache.axis2.client.ServiceClient;
/**
* @authorlvshuo
* @version1.0
* @create2017-6-9 下午17:44:00
*/
publicclassClient{
privatestaticEndpointReference targetEPR= newEndpointReference(
"http://127.0.0.1:8080/Test/services/HelloWorld");//替换为自己的接口地址
publicstaticvoidmain(String[] args)
{
Options options= newOptions();
options.setAction("urn:sayHello");//调用接口方法,替换成自己的
options.setTo(targetEPR);
ServiceClient sender= null;
try
{
sender= newServiceClient();
sender.setOptions(options);
OMFactory fac= OMAbstractFactory.getOMFactory();
OMNamespace omNs= fac.createOMNamespace(
"http://service.inspur.com", ""); //此处地址为namespace,可在wsdl里面查到,如图2.1
OMElement method= fac.createOMElement("sayHello", omNs);//设置方法名
OMElement name= fac.createOMElement("name", omNs);//设置入参名称,如有多个参数可创建多个OMElement对象,如name1、name2。。
name.setText("xiaoming");//设置入参值(要传入方法内的参数)
method.addChild(name);
method.build();
System.out.println("method:"+ method.toString());//
OMElement response= sender.sendReceive(method);
System.out.println("response:"+ response);
OMElement elementReturn= response.getFirstElement();
System.out.println("return:"+elementReturn.getText());//可用此方法elementReturn.getText(),来获取被调方法的返回值
}
catch(AxisFault e)
{
System.out.println("Error");
e.printStackTrace();
}
}
}
注:注释的地方为要更改的部分,修改完后一个简单的webservice客户端就算是编写完成,可根据实际开发需要修改内容。
参照图2.1,命名空间为包名倒序。
输出结果如图2.2



