1.配置web.xml
在web,xml中需要加入如下代码:
<!--Axis2 config start -->
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<!--Axis2 end -->
其中<servlet-name>与<url-pattern>可以根据需要自行配置。
2.服务部署
Axis2使用service.xml来部署服务,具体步骤如下:
首先,需要在WEB-INF下的service文件夹中新建文件用于部署服务,名称自取。
其次在该文件下新建文件夹META-INF用于存放部署文件。
最后,在META-INF中新建service.xml文件,该文件用于服务的部署。
文档结构如图所示
3.配置service.xml文件
整个service.xml文档结构类似如下:
<?xml version="1.0" encoding="UTF-8"?>
<service name="TestServer" targetNamespace="http://ws.apache.org/axis2">
<description>测试接口服务</description>
<schema schemaNamespace="http://ws.apache.org/axis2" elementFormDefaultQualified="false"/>
<parameter name="ServiceClass">
com.test.TestServer
</parameter>
<operation name="isAlive">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="getIpSubNet">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
</service>
3.1部署单个服务
部署单个服务使用<service>标签。
name属性指明该服务的名称,若不指定,则默认使用该服务在Axis中的包名作为服务名。
targetNamespace属性指明该服务的命名空间,服务目标名字空间仅仅在WSDL生成过程中起作用。在运行时,如果有人试图使用?wsdl来查看WSDL,那么生成的WSDL文件中的目标名字空间就是services.xml文件中指定的值。同时,我们为了使用自定义的WSDL文件,把WSDL文件放到META-INF目录中,这种情况下要覆盖原有的目标名字空间,也是通过往services.xml文件中添加目标名字空间来实现的。目标名字空间的缺省值是http://ws.apache.org/axis2。
Axis2中Web服务有四种会话范围。如果不指定,则默认为 request 会话范围。我们可以通过给 service 节点添加一个可选的 scope参数来指定会话范围,会话范围共有如下四种:
- application : 应用级别。生命周期和Axis2引擎生命周期相同。
- soapsession : 使用addressing headers中的自定义引用属性来管理会话。
- transportsession : 使用transport cookies来管理会话,生命周期和底层的transport相同。
- request :生命周期很短,和请求处理周期相同。
对于该服务中的所有配置,都定义在<service>标签中。
<service scope = 'application' name = 'service1' targetNamespace="http://ws.apache.org/axis2">
......
</service>
3.2部署多个服务
当需要在一个service.xml中管理多个服务时,使用标签<serviceGroup>,将所有要部署的服务放入<serviceGroup>中。其中的各个service的名称不能相同。
<serviceGroup>
<service name = 'service1'>
......
</service>
<service name = 'service2'>
......
</service>
</serviceGroup>
3.3服务描述
服务编写者可以使用<description>元素来描述该服务。在Axis2 Web管理控制台中查看服务时,我们只能看到服务名和服务描述。如果我们不给services.xml文件添加description元素,则服务描述栏会显示服务名称。对于那些访问该服务的用户来说,服务描述是非常有用的。添加服务描述信息非常简单,给services.xml文件添加一个可选的description节点就可以了。该节点的值既可以是纯文本,也可以是HTML代码片段。
<description><b>接口服务</b></description>
3.4服务级参数
服务级参数通过<parameter>来指定,这些参数供消息上下文(在运行时)、AxisService或者AxisOperation访问。参数有一个必选参数和可选参数:参数名称是必选参数,locked 属性是可选参数。
locked属性指明了是否允许参数值被子节点覆盖。举例来说,如果我们在axis2.xml文件中添加了一个locked属性值为true的参数,那么如果服务试图在services.xml文件中定义同名参数,是会抛出异常的。
服务级参数中有一个特殊的参数“ServiceClass”,该参数用于指定服务的具体实现类。但是在Axis2中,Web服务并不强制要求指定服务实现类!Axis2架构允许编写没有服务实现类的Web服务,这是因为消息接收器允许这样做。Axis2中,一旦请求交予消息接收器处理,Axis2引擎就认为自己的事情做完了,剩余工作都是消息接收器的了。因此,services.xml并不强制要求提供服务实现类。但是绝大多数情况下,我们还是需要服务类的,我们可以在services.xml文件中添加ServiceClass参数来指定服务类。该参数的值是服务类的全路径名。
<service >
......
<parameter name="ServiceClass">com.test.TestServer
</parameter>
<parameter name="testParameter">ShangHai
</parameter>
......
</service>
3.5服务级消息接收器
Axis2中消息接收器是特殊的处理器,是In路径(请求路径)中的最后一个处理器。Web服务中的每个操作都有他自己的消息接收器,而且不同的操作可以有不同的消息接收器。消息接收器是依赖于消息交换模式的,所以我们必须为不同的消息交换模式指定不同的消息接收器。
怎样才能给所有的操作指定相同的消息接收器呢?只要添加服务级消息接收器即可。如此我们就不必在操作级别指定消息接收器了。我们要做的是指定服务级消息接收器。而在部署时,Axis2会自动给操作选择正确的消息接收器。
其中RPCInOnlyMessageReceiver用于处理不含返回值的请求。RPCMessageReceiver用于处理带返回值的请求。
<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>
3.6排除方法
Axis2在发布服务时会默认暴露指定的服务实现类中的所有public方法(如果是用java实现),如果我们把.wsdl文件放到META-INF目录中,而由不希望发布文件中的所有操作,那么我们可以添加<excludeOperations>标签来排除那些不希望暴露的操作。
<excludeOperations>
<operation>op1</operation>
</excludeOperations>
3.6暴露方法
Axis2用<operation>标签来声明需要暴露的方法以及重定义指定方法的某些属性。其中的name属性需要与实现类中的方法名相同。
在方法级别可以使用<messageReceiver>为该方法指定消息接收器。
使用<actionMapping>来为该方法添加别名。actionMapping相当于操作的别名。我们可以为操作添加任意数量的别名。我们可以根据ActionMapping来过滤请求,也可以为不同的action mapping 执行不同的处理逻辑。客户端请求消息中通过指定SOAPAction或者wsa:action来发送action mapping。这样Axis2的分发器就可以把请求消息分发给正确的操作。
<operation name=doSmt>
<actionMapping>mapping1</actionMapping>
<actionMapping>http://foo.org/doSmt</actionMapping>
<messageReceiver class="org.apache.axis2.MyMessageReceiver"/>
</operation>
3.7部署定义
当生成WSDL文件(运行时)或者生成schema(部署时)的时候,如果在META-INF目录中找不到WSDL文件,则可以通过往services.xml文件中添加<schema>节点来指定自定义的schema。
在部署的时候,如果不指定schema目标名字空间,则根据服务实现类的全路径名来生成目标名字空间。例如,如果服务类的全路径名是org.apache.axis2.FooService,那生成的schema名字空间是http://FooService.axis2.apache.org/xsd,如果你想使用自定义值,只需要在<schema>节点中指定schemaNamespace属性即可。
在使用Java类生成WSDL文件时,WSDL文件中schema定义中的elementFormDefault默认是设置为qualified。如果qualified为true,则响应消息中的所有元素都是受限的。但是有些时候我们并不需要这种行为,我们希望把elementFormDefault设置为unqualified。这时我们只需要在<schema>中重定义elementFormDefaultQualified
属性即可。
<service>
<schema elementFormDefaultQualified="false" schemaNamespace="http://foo.org/xsd"/>
</service>
3.8在指定的传输通道上暴露服务
Axis2可以在多种传输通道上暴露服务,这是通过Lister Manager完成的。例如,使用Listener Manager你可以在HTTP和TCP上暴露服务。
由于Axis2支持多种传输通道,所以我们可以在选定的传输通道上暴露服务。比如说系统管理服务,我们希望该服务只在支持SSL的通道上暴露,这样才能保证系统管理的安全性。
当服务端支持多种传输通道时,所有的服务都是在所有的通道上暴露的。如果只希望在选定的通道上暴露服务,我们需要在services.xml文件中添加<transport>标签。
<transports>
<transport>https</transport>
</transports>
3.9使用模块
我们可以在服务级和方法级使用指定的模块,使用<module>引用指定的模块,如果引用的模块错误,会导致该模块影响的服务和方法不可用。
<service>
<module ref="foo"/>
<operation name=doSmt>
<module ref="foo1"/>
</operation>
</service>