在创建任何服务之前,了解一个完整工程的结构对我们是很有用的。
Axis2的服务端可以发布在任何Servlet容器中,并且具有如下结构。显示在代码列表2中。
Code Listing 2: The Directory Structure of axis2.war
axis2-web
META-INF
WEB-INF
classes
conf
axis2.xml
lib
activation.jar
...
xmlSchema.jar
modules
modules.list
addressing.mar
...
soapmonitor.mar
services
services.list
aservice.aar
...
version.aar
web.xml
从最上面开始,aixis2-web是一个jsp文件的集合,它组成了Axis2的管理程序,通过这个管理程序,你可以完成任何操作比如添加服务、添加和删除模型。WEB-INF目录包含所有java的class文件和其他辅助文件,这些辅助性文件可以帮助完成services目录下所有service的发布。
在WEB-INF下最重要的文件是axis2.xml,这个配置文件用来控制应用如何处理接收到的消息,决定Axis2是否需要申请modules目录下的任何模块。
就像你看到的,服务可以被发布成*.aar格式文件,但是他们的目录必须按照制定的方式安排。比如,我们这个服务的结构将是下面这个样子:
- StockQuoteService
- META-INF
- services.xml
- lib
- samples
- quickstart
- service
- pojo
- StockQuoteService.class
服务的名字是StockQuoteService,这个会在services.xml中配置并且绑定到服务的最高层目录。编译后的java class文件会根据包名被放置在服务下合适的额位置。Lib目录用来存放除过Axis2 war包中已经存在的和servlet容器用到的基本jar包外所有service运行所需要的指定jar文件。最后,为了Axis2能够恰当的执行这个服务,META-INF目录存放了所有需要用到的附加信息供Axis2使用。Services.xml定义了服务本身并且将class文件关联到服务。(看代码表3)
Code Listing 3: The Service Definition File
<service name="StockQuoteService" scope="application">
<description>
Stock Quote Sample Service
</description>
<messageReceivers>
<messageReceiver
mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver
mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass">
samples.quickstart.service.pojo.StockQuoteService
</parameter>
</service>
在相关的messageReceiver类型配置后面,service紧跟着被定义,它会为不同的消息交换模式提供服务。
META-INF目录同时也是你要引入整个工程应用的所有自定义WSDL文件的存放位置。要发布一个服务,你可以简单的将StockQuoteService整个目录下的文件拷贝到servlet容器的webapps/axis2/WEB-INF/services 目录下。(注意:Axis2的WAR包必须首先安装到容器)这就是众所周知的“爆炸”方式部署 。你也可以将你的工程压缩成一个 .aar文件,类似于.jar文件,然后将*.aar文件直接放置在servlet容器的webapps/axis2/WEB-INF/services目录下。
现在你应该明白了我们要做什么了,我们基本上已经做好了创建服务的准备了。