这两天由于工作需要,需要使用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。
部署成功之后,在浏览器访问
http://localhost:8088/axis2/,点击Services可以看到所有的服务器端。
我们可以看到这个默认的服务端名是Version,而getVersion是服务提供的方法。点击服务名可以看到有关该服务的描述。
我们可以看到这个默认的服务端名是Version,而getVersion是服务提供的方法。点击服务名可以看到有关该服务的描述。
千万别被这个xml给吓到了,因为我从来不看。
通过观察应用的目录结构可以发现:
一个服务器端其实就是WEB-INF/services/目录下的一个aar文件而已。所以以后咱们写服务器端只需要写一个aar文件放到WEB-INF/services/目录下即可。
这时候你可能会问:这和我自己的程序没关系啊,难道我必须得在axis2这个应用下写我自己的应用吗?不用担心后面我会讲如何把axis2整合到你的应用下。
一个服务器端其实就是WEB-INF/services/目录下的一个aar文件而已。所以以后咱们写服务器端只需要写一个aar文件放到WEB-INF/services/目录下即可。
这时候你可能会问:这和我自己的程序没关系啊,难道我必须得在axis2这个应用下写我自己的应用吗?不用担心后面我会讲如何把axis2整合到你的应用下。
3.写一个服务器端程序
小虞的服务器端程序写的很好,很有代表性,直接粘过来。
先写服务器的类:
AxisDemoService.java
package com.neusoft.axis2demo.services;
package com.neusoft.axis2demo.services;
import com.neusoft.axis2demo.common.AxisClientRequestInfo;
import com.neusoft.axis2demo.common.AxisServiceResponseInfo;
import com.neusoft.axis2demo.common.AxisServiceResponseInfo;
public class AxisDemoService {
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;
}
}
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;
}
}
这个类的作用就是在客户端传来一个AxisClientRequestInfo类型的bean里边存储一个诗词的题目,该类取出诗词的题目和服务器类里存储的题目比较如果有相同的就把它的内容放到AxisServiceResponseInfo这个bean里返回给客户端。
下边是上个类中用到的传递参数的两个bean他们都在com.neusoft.axis2demo.common这个包中。
AxisClientRequestInfo.java
package com.neusoft.axis2demo.common;
package com.neusoft.axis2demo.common;
public class AxisClientRequestInfo
{
private String name;
{
private String name;
public String getName()
{
return name;
}
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
{
this.name = name;
}
}
AxisServiceResponseInfo.java
package com.neusoft.axis2demo.common;
public class AxisServiceResponseInfo
{
private String poemcontent;
{
private String poemcontent;
public String getPoemcontent()
{
return poemcontent;
}
public void setPoemcontent(String poemcontent)
{
this.poemcontent = 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类中的方法。
下面是解析该服务器类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类中的方法。
Axis2Demo为服务的名字也就是后边的打包服务器端Axis2Demo.aar的名字。
最后把以上三个类的class文件和一个xml文件打包成aar文件(aar文件其实就是把jar文件的后缀名改成aar)。
目录结构如下:
目录结构如下:
图中只显示了文件夹。
把这个aar文件放到放到WEB-INF/services/目录下,这个服务就可以被远程调用了。
4.写一个客户端程序调用刚才的服务器端程序(重点难点)
首先我们不可能在我们的应用程序中直接调远程的方法,因为我们的Java编译器会因为找不到该方法而报错。所以我们想要调用一个我们本地工程没有的方法,而且还不让Java编译器报错,使用的肯定是Java的反射机制!
首先我们不可能在我们的应用程序中直接调远程的方法,因为我们的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。
注意,在图中选中custom和Generate Both with all classes for every elements on Shemas。很重要!
在Output Path这项选中工程的根目录作为这些自动生成代码的目录。
然后点击 finish 完成代码生成工作.下图为生成代码后的工程目录结构。
我标记的都是生成的文件。
下面咱们自己只需要写一点程序就可以调用远程的方法了。
请下载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”可以看到如下的界面。
下面,根据wsdl文件生成客户端代码。
生成代码的具体步骤如下: 选择菜单“File->New->Other”,从对话框中选取“Axis2 Wizards”下面的“Axis2 Code Generator”,点next。
选择Generate Java source code from a WSDL file,点next。
然后选择刚才保存的wsdl文件,点next。
然后选择刚才保存的wsdl文件,点next。
![](http://dl.iteye.com/upload/attachment/612026/c89da67c-796c-386c-a0cb-384408b6502e.jpg)
注意,在图中选中custom和Generate Both with all classes for every elements on Shemas。很重要!
在Output Path这项选中工程的根目录作为这些自动生成代码的目录。
然后点击 finish 完成代码生成工作.下图为生成代码后的工程目录结构。
![](http://dl.iteye.com/upload/attachment/612028/c2a0e726-e3c2-3a16-b40d-1b75ed38c793.jpg)
我标记的都是生成的文件。
下面咱们自己只需要写一点程序就可以调用远程的方法了。
5.完善客户端程序
下面写一个Test类,去调用远程的方法。
TestAxis2Demo.java
package com.neusoft.axis2demo.test;
下面写一个Test类,去调用远程的方法。
TestAxis2Demo.java
package com.neusoft.axis2demo.test;
import java.rmi.RemoteException;
import com.neusoft.axis2demo.services.Axis2DemoStub;
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 {
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 {
public static void main(String args[]) throws RemoteException
{
//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);
}
{
//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);
}
}
6.关于axis2服务器和我们现有系统的集成
下边我们只要把Tomcat目录下的\webapps\axis2下的内容copy到我们现有eclipse工程的应用目录下(这里我的web应用是D:\eclipse3.2\workspace\Axis2Demo\WebContext)就可以把刚才的Web Service和我们现有的工程集成一起了。
写这个总结真是累死我了,回去的车都少了。希望能给大家提供帮助,欢迎高手指点。
下边我们只要把Tomcat目录下的\webapps\axis2下的内容copy到我们现有eclipse工程的应用目录下(这里我的web应用是D:\eclipse3.2\workspace\Axis2Demo\WebContext)就可以把刚才的Web Service和我们现有的工程集成一起了。
写这个总结真是累死我了,回去的车都少了。希望能给大家提供帮助,欢迎高手指点。