Axis2可以通过模块(Module)进行扩展。Axis2模块至少需要有两个类,这两个类分别实现了Module和Handler接口。开发和使用一个Axis2模块的步骤如下:

1. 编写实现Module接口的类。Axis2模块在进行初始化、销毁等动作时会调用该类中相应的方法)。

2. 编写实现Handler接口的类。该类是Axis2模块的业务处理类。

3. 编写module.xml文件。该文件放在META-INF目录中,用于配置Axis2模块。

4. 在axis2.xml文件中配置Axis2模块。

5. 在services.xml文件中配置Axis2模块。每一个Axis2模块都需要使用<module>元素引用才能使用。

6. 发布Axis2模块。需要使用jar命令将Axis2模块压缩成.mar包(文件扩展名必须是.mar),然后将.mar文件放在

<Tomcat安装目录>\webapps\axis2\WEB-INF\modules目录中。    
    先来编写一个WebService类,代码如下:

package service;

public 
class MyService

{

    
public String getGreeting(String name)

    {

        
return "您好 " + name;

    }

}

下面我们来编写一个记录请求和响应SOAP消息的Axis2模块。当客户端调用WebService方法时,该Axis2模块会将请求和响应SOAP消息输出到Tomcat控制台上。

第1步:编写LoggingModule类

LoggingModule类实现了Module接口,代码如下:

package module;

import org.apache.axis2.AxisFault;


import org.apache.axis2.context.ConfigurationContext;


import org.apache.axis2.description.AxisDescription;


import org.apache.axis2.description.AxisModule;


import org.apache.axis2.modules.Module;


import org.apache.neethi.Assertion;


import org.apache.neethi.Policy;

public 
class LoggingModule 
implements Module

{

    
//
 initialize the module

    
public 
void init(ConfigurationContext configContext, AxisModule module)

            
throws AxisFault

    {

        System.out.println("init");

    }

    
public 
void engageNotify(AxisDescription axisDescription) 
throws AxisFault

    {

    }

    
//
 shutdown the module

    
public 
void shutdown(ConfigurationContext configurationContext)

            
throws AxisFault

    {

        System.out.println("shutdown");

    }

    
public String[] getPolicyNamespaces()

    {

        
return 
null;

    }

    
public 
void applyPolicy(Policy policy, AxisDescription axisDescription)

            
throws AxisFault

    {

    }

    
public 
boolean canSupportAssertion(Assertion assertion)

    {

        
return 
true;

    }

}

在本例中LoggingModule类并没实现实际的功能,但该类必须存在。当Tomcat启动时会装载该Axis2模块,同时会调用LoggingModule类的init方法,并在Tomcat控制台中输出“init”。

第2步:编写LogHandler类

LogHandler类实现了Handler接口,代码如下:

package module;

import org.apache.axis2.AxisFault;


import org.apache.axis2.context.MessageContext;


import org.apache.axis2.engine.Handler;


import org.apache.axis2.handlers.AbstractHandler;


import org.apache.commons.logging.Log;


import org.apache.commons.logging.LogFactory;

public 
class LogHandler 
extends AbstractHandler 
implements Handler

{

    
private 
static 
final Log log = LogFactory.getLog(LogHandler.
class);

    
private String name;

    
public String getName()

    {

        
return name;

    }

    
public InvocationResponse invoke(MessageContext msgContext)

            
throws AxisFault

    {

        
//
  向Tomcat控制台输出请求和响应SOAP消息

        log.info(msgContext.getEnvelope().toString());

        
return InvocationResponse.CONTINUE;

    }

    
public 
void revoke(MessageContext msgContext)

    {

        log.info(msgContext.getEnvelope().toString());

    }

    
public 
void setName(String name)

    {

        
this.name = name;

    }

}

LogHandler类的核心方法是invoke,当使用该Axis2模块的WebService的方法被调用时,LogHandler类的invoke方法被调用。

第3步:编写module.xml文件    

在META-INF目录中建立一个module.xml文件,内容如下:

<
module 
name
="logging"
 class
="module.LoggingModule"
>

    
<
InFlow
>

        
<
handler 
name
="InFlowLogHandler"
 class
="module.LogHandler"
>

            
<
order 
phase
="loggingPhase"
/>

        
</
handler
>

    
</
InFlow
>

    
<
OutFlow
>

        
<
handler 
name
="OutFlowLogHandler"
 class
="module.LogHandler"
>

            
<
order 
phase
="loggingPhase"
/> 

        
</
handler
>

    
</
OutFlow
>

<
OutFaultFlow
>

        
<
handler 
name
="FaultOutFlowLogHandler"
 class
="module.LogHandler"
>

            
<
order 
phase
="loggingPhase"
/>

        
</
handler
>

    
</
OutFaultFlow
>

    
<
InFaultFlow
>

        
<
handler 
name
="FaultInFlowLogHandler"
 class
="module.LogHandler"
>

            
<
order 
phase
="loggingPhase"
/>

        
</
handler
>

    
</
InFaultFlow
>


</
module
>

第4步:在axis2.xml文件中配置Axis2模块

打开axis2.xml文件,分别在如下四个<phaseOrder>元素中加入<phase name="loggingPhase"/>:

<
phaseOrder 
type
="InFlow"
>

    
 



    <
phase 
name
="soapmonitorPhase"
/>


    <
phase 
name
="loggingPhase"
/>


</
phaseOrder
>


<
phaseOrder 
type
="OutFlow"
>

    
 


    
<
phase 
name
="Security"
/>

    
<
phase 
name
="loggingPhase"
/>


</
phaseOrder
>


<
phaseOrder 
type
="InFaultFlow"
>

    
 


    
<
phase 
name
="soapmonitorPhase"
/>

    
<
phase 
name
="loggingPhase"
/>


</
phaseOrder
>


<
phaseOrder 
type
="OutFaultFlow"
>

    
 


    
<
phase 
name
="Security"
/>

    
<
phase 
name
="loggingPhase"
/>


</
phaseOrder
>

第5步:在services.xml文件中引用logging模块

services.xml文件的内容如下:

<
service 
name
="myService"
>

    
<
description
>

        使用logging模块

    
</
description
>

    
<!--
  引用logging模块  
-->

    
<
module 
ref
="logging"
/>

    
<
parameter 
name
="ServiceClass"
>

        service.MyService   

    
</
parameter
>

    
<
messageReceivers
>

        
<
messageReceiver 
mep
="http://www.w3.org/2004/08/wsdl/in-out"

            class
="org.apache.axis2.rpc.receivers.RPCMessageReceiver"
 
/>

    
</
messageReceivers
>


</
service
>

第6步:发布logging模块

到现在为止,我们应用可以建立两个发行包:logging.mar和service.aar。其中logging.mar文件是Axis2模块的发行包,该包的目录结构如下:

logging.mar

module\LoggingModule.class

module\LogHandler.class

META-INF\module.xml

service.aar文件是本例编写的WebService发行包,该包的目录结构如下:

service.aar

service\MyService.class

META-INF\services.xml

将logging.mar文件放在<Tomcat安装目录>\webapps\axis2\WEB-INF\modules目录中,将service.aar文件放在<Tomcat安装目录>\webapps\axis2\WEB-INF\services目录中。要注意的是,如果modules目录中包含了modules.list文件,Axis2会只装载在该文件中引用的Axis2模块,因此,必须在该文件中引用logging模块,该文件的内容如下:

addressing-1.4.1.mar

soapmonitor-1.4.1.mar

ping-1.4.1.mar

mex-1.4.1.mar

axis2-scripting-1.4.1.mar

logging.mar

如果modules目录中不包含modules.list文件,则Axis2会装载modules文件中的所有Axis2模块。

现在启动Tomcat,使用如下的C#代码调用MyService的getGreeting方法则会在Tomcat控制台中输出相应的请求和响应SOAP消息。

//
  async是引用MyService的服务名

async.myService my = 
new WSC.asyn.myService();

MessageBox.Show(my.getGreeting("中国"));

MessageBox.Show("完成调用");

在执行上面的代码后,在Tomcat控制台中输出的信息如下图所示。

Axis2(9):编写Axis2模块(Module)的更多相关文章

  1. 使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。

    在新的版本下,使用AndroidStudio编写APICloud模块,已经非常简单了,解决模块未定义,最重要的就是要先看官方的视频! 注意在模块的module.json中name很重要,建议做到三统一 ...

  2. Python中模块(Module)和包(Package)的区别

    本文绝大部分内容转载至:廖雪峰官方网站 1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函 ...

  3. 00.模块1.模块(Module)和包(Package)

    转自廖雪峰老师官方网站 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件 ...

  4. Saltstack_使用指南09_远程执行-编写执行模块

    1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...

  5. 21.python的模块(Module)和包(Package)

    目录 模块(Module)和包(Package) 模块(modue)的概念 模块导入方法 1.import 语句 2.from-import 语句 3.from-import* 语句 4.运行本质 i ...

  6. 15_Python的模块module

    1.模块的概述 1.模块是Python程序架构的一个核心概念,每一个以.py结尾的Python源代码文件都是一个模块 2.模块名和标识符的命名规则一样,由数字字母下划线组成且不能以数字开头,也不要和系 ...

  7. 【转】PowerShell入门(十一):编写脚本模块

    转至:http://www.cnblogs.com/ceachy/archive/2013/03/08/PowerShell_Script_Module.html 现在通过编写模块就可以在PowerS ...

  8. [转]使用 C 编写 Lua 模块

    Lua 作为一种小巧的语言,一般都是嵌入到 C/C++ 中作为扩展语言,但是也可以作为独立的脚本语言使用,并且可以使用 C/C++ 编写扩展模块.在参考资料 [1] 中有怎样用 C/C++ 编写模块的 ...

  9. 用Perl编写Apache模块续二 - SVN动态鉴权实现SVNAuth 禅道版

    代码地址:https://code.csdn.net/x3dcn/svnauth 以禅道项目管理系统的数据库结构为标准,实现了可用的svn authz验证功能. 以用户名.密码.项目的acl开发程度o ...

随机推荐

  1. python实现的文本编辑器 - Skycrab - 博客频道 - CSDN.NET

    Download Qt, the cross-platform application framework | Qt Project Qt 5.2.1 for Windows 64-bit (VS 2 ...

  2. 介绍一个python的新的web framework——karloop框架

    karloop是一款轻型的web framework,和tornado.webpy类似.mvc分层设计,眼下已经公布早期版本号了,使用方便, 下载地址例如以下:https://github.com/k ...

  3. IPv4头部结构具体解释

    IPv4头部结构具体解释 下面为书中原文摘录: $(function () { $('pre.prettyprint code').each(function () { var lines = $(t ...

  4. DontDestroyOnLoad(Unity3D开发之五)

    Unity中我们从A场景切换到B场景的时候,A场景全部对象都会销毁,但有时候我不须要销毁某些东西. 比方一个简单的游戏的背景音乐,我不须要多次反复创建,多个场景播放这一个即可了.这个时候就须要用到Do ...

  5. BI系统的应用组织思路与数据分析模式

    BI商业智能软件一般都会提供若干数据整合.数据查询.分析与评价.数据可视化及数据分享的手段,但是在BI项目的构建与实施过程中,如果不按照一定的应用组织思路.数据分析模式及分析流程使用这些工具或手段,呈 ...

  6. 在 Windows系统中编译node.js 源代码

    Node.js 在 Windows 下只能通过 Microsoft Visual Studio 编译,因此你需要首先安装 Visual Studio 或者免费的 Visual Studio Expre ...

  7. Ecmall系统自带的分页功能使用

    在控制器如果没有定义相关模型,直接使用sql语句的话,直接使用如下语句. 即: public $db; $this->db = &db(); //然后开始使用分页类 $sql='sele ...

  8. projecteuler之58题Spiral primes

    package com.android; public class SpiralPrimes { public static void main(String args[]) { long numPr ...

  9. U-Boot在FL2440上移植(三)----支持NAND Flash

    <一>支持NAND Flash 1. 首先在配置文件 include/config/fl2440.h 的宏 CONFIG_COMMANDS 中增加 CFG_CMD_NAND, #defin ...

  10. MFC的最大化,最小化,关闭

    最大化.最小化和关闭按钮是窗口中最主要的元素.首先要说明,说他们是按钮其实是不准确的,按钮是一种窗口,而这三个组件根本就不是窗口,而是一个窗口常见的组成部分.出于习惯的原因,这里还是称呼他们为按钮. ...