这两天由于工作需要,需要使用Axis2组件,上网搜了好多资料,发现看起来都很吃力,还是同事小虞同学总结的比较好,让我对Axis2有了一些入门级别的了解。现在我将小虞同学总结的内容二次加工分享给大家。
1.首先什么是Web Service?
当你编写程序时遇到一个情况:你的应用程序需要调用一个远程程序的方法,或一个远程的应用程序需要调用你的应用程序的方法时,就需要使用Web Service。我们一般把Web Service看成这个提供服务的方法,于是我们说“我调他的Web Service”或“他调我的Web Service”。其实Web Service是一套标准,它定义了应用程序如何在互联网上实现互操作。所以“我调他的Web Service”的意思是我是客户端,他是服务器端,反之亦然。你可以用任何语言写Web Service,只要双方遵守共同的标准就行。
2.axis2是干啥的?
Axis2是实现Web Service的一种技术框架(架构)。肿么说呢,他就是一些Java类和配置文件,其他的我也不知道了。总之你去网上下载一个axis2.war文件,然后把它部署到Tomcat下,启动Tomcat,就可以在浏览器里访问它了。你可能会说:“这样的话axis2不就是一个很普通的Web应用吗”。对,它是一个Web应用,这个应用默认提供了一个Service(Web Service的服务器端)叫Version。
我们可以看到这个默认的服务端名是Version,而getVersion是服务提供的方法。点击服务名可以看到有关该服务的描述。
一个服务器端其实就是WEB-INF/services/目录下的一个aar文件而已。所以以后咱们写服务器端只需要写一个aar文件放到WEB-INF/services/目录下即可。
这时候你可能会问:这和我自己的程序没关系啊,难道我必须得在axis2这个应用下写我自己的应用吗?不用担心后面我会讲如何把axis2整合到你的应用下。
package com.neusoft.axis2demo.services;
import com.neusoft.axis2demo.common.AxisServiceResponseInfo;
public AxisServiceResponseInfo nameConvertToContext(
AxisClientRequestInfo clientrequest) {
System.out.println("进入服务器端!");
AxisServiceResponseInfo axisServiceresponseinfo = new AxisServiceResponseInfo();
String name = clientrequest.getName();
if (name.equals("红豆")) {
axisServiceresponseinfo.setPoemcontent("红豆生南国,春来发几枝?愿君多采撷,此物最相思!");
} else if (name.equals("无题")) {
axisServiceresponseinfo.setPoemcontent("相见时难别亦难,东风无力百花残。春蚕到死丝方尽,蜡炬成灰泪始干。"
+ "晓镜但愁云鬓改,夜吟应觉月光寒。蓬山此去无多路,青鸟殷勤为探看。");
} else if (name.equals("无名诗词"))
axisServiceresponseinfo.setPoemcontent("繁星烁闪浩月天,恰似嫦娥舞翩翩.可怜吴刚空对酒,相思泪洒孤枕边");
else if (name.equals("草")) {
axisServiceresponseinfo.setPoemcontent("离离原上草 一岁一枯荣. 野火烧不尽 春风吹又生.");
} else {
axisServiceresponseinfo.setPoemcontent("对不起,你要找的诗词没有存储!");
}
return axisServiceresponseinfo;
}
}
package com.neusoft.axis2demo.common;
{
private String name;
{
return name;
}
{
this.name = name;
}
}
{
private String poemcontent;
{
return poemcontent;
}
public void setPoemcontent(String poemcontent)
{
this.poemcontent = poemcontent;
}
}
下面是解析该服务器类AxisDemoService的 services.xml文件,该文件的内容如下:
<service name=" Axis2Demo">
<parameter name="ServiceClass" locked="false">
com.neusoft.axis2demo.services.AxisDemoService
</parameter>
<operation name=" nameConvertToContext">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</operation>
</service>
服务器类AxisDemoService中有几个方法就需要配置几个<operation></operation>。nameConvertToContext为AxisDemoService类中的方法。
目录结构如下:
首先我们不可能在我们的应用程序中直接调远程的方法,因为我们的Java编译器会因为找不到该方法而报错。所以我们想要调用一个我们本地工程没有的方法,而且还不让Java编译器报错,使用的肯定是Java的反射机制!
请下载Axis2_Codegen_Wizard,我用的是1.3.0版本。
在此之前请在浏览器访问刚才的服务器的描述文件,访问方法是刚才讲过的先访问http://localhost:8088/axis2,然后点击services,最后点击刚才的服务名。然后保存描述服务的网页(是个xml文件),保存在任意位置。
最后把保存后的文件后缀名改成wsdl,我们就用Axis2_Codegen_Wizard通过这个wsdl文件去生成代码。
现在回到Axis2_Codegen_Wizard,下载好后,把下载好的代码生成工具Axis2_Codegen_Wizard拷贝到eclipse下的plugins下。
以我机器为例拷贝到D:\eclipse3.2\plugins里,然后删除D:\eclipse3.2\configuration下的org.eclipse.update文件夹里的内容或者在eclipse的快捷方式里加上-clean以使插件生效。然后重启eclipse,选择“File->New->Other”可以看到如下的界面。
生成代码的具体步骤如下: 选择菜单“File->New->Other”,从对话框中选取“Axis2 Wizards”下面的“Axis2 Code Generator”,点next。
然后选择刚才保存的wsdl文件,点next。

注意,在图中选中custom和Generate Both with all classes for every elements on Shemas。很重要!
在Output Path这项选中工程的根目录作为这些自动生成代码的目录。
然后点击 finish 完成代码生成工作.下图为生成代码后的工程目录结构。

我标记的都是生成的文件。
下面咱们自己只需要写一点程序就可以调用远程的方法了。
下面写一个Test类,去调用远程的方法。
TestAxis2Demo.java
package com.neusoft.axis2demo.test;
import com.neusoft.axis2demo.common.xsd.AxisClientRequestInfo;
import com.neusoft.axis2demo.common.xsd.AxisServiceResponseInfo;
import com.neusoft.axis2demo.services.NameConvertToContext;
import com.neusoft.axis2demo.services.NameConvertToContextResponse;
public class TestAxis2Demo {
{
//axis2demostub是方法调度器
Axis2DemoStub axis2demostub = new Axis2DemoStub();
//nameConvertToContext是方法
NameConvertToContext nameConvertToContex = new NameConvertToContext();
//nameConvertToContextResponse是方法的执行结果
NameConvertToContextResponse nameConvertToContextResponse = new NameConvertToContextResponse();
//axisClientRequestInfo是方法的参数
AxisClientRequestInfo axisClientRequestInfo = new AxisClientRequestInfo();
//axisServiceResponseInfo是方法的返回值(方法的返回值.get_return())
AxisServiceResponseInfo axisServiceResponseInfo = new AxisServiceResponseInfo();
//给方法的参数添加上内容
axisClientRequestInfo.setName("无名诗词");
//给方法添加上参数
nameConvertToContex.setClientrequest(axisClientRequestInfo);
//执行方法
nameConvertToContextResponse = axis2demostub.nameConvertToContext(nameConvertToContex);
//得到返回值
axisServiceResponseInfo = nameConvertToContextResponse.get_return();
String poemcontent = axisServiceResponseInfo.getPoemcontent();
System.out.println("您输入的诗词题目是===="+axisClientRequestInfo.getName());
System.out.println("下边是根据您所输入的诗词的题目从服务器端返回的诗词内容!");
System.out.println(poemcontent);
}
下边我们只要把Tomcat目录下的\webapps\axis2下的内容copy到我们现有eclipse工程的应用目录下(这里我的web应用是D:\eclipse3.2\workspace\Axis2Demo\WebContext)就可以把刚才的Web Service和我们现有的工程集成一起了。
写这个总结真是累死我了,回去的车都少了。希望能给大家提供帮助,欢迎高手指点。