您的位置首页百科知识

使用axis2发布/调用WebService

使用axis2发布/调用WebService

的有关信息介绍如下:

使用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里添上如下配置:

AxisServlet

org.apache.axis2.transport.http.AxisServlet侵喝

1

AxisServlet

/services/*

index.jsp

(这一步可以先跳过去,如果下一步执行页面报500,可以回头看一下这一步)

因为项目自定义的过滤器会和axis2配置起冲突,所以我在过滤器里面把起冲突的services文件夹忽略掉,(各位具体情况具体调整)所以继续修改项目web.xml文件:

找到webDispatcher

org.loushang.internet.servlet.WebDispatcherFilter

excludes

/*/aaa/*.jsp,/aaa/*

/*/aaa/*.jsp,/aaa/*中添加上,/*/services/*

变成/*/aaa/*.jsp,/aaa/*,/*/services/*即可。

这时候就能通过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