Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          Axis2可以通過模塊(Module)進行擴展。Axis2模塊至少需要有兩個類,這兩個類分別實現了ModuleHandler接口。開發和使用一個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.marservice.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#代碼調用MyServicegetGreeting方法則會在Tomcat控制臺中輸出相應的請求和響應SOAP消息。

          //??async是引用MyService的服務名
          async.myService?my?=?new?WSC.asyn.myService();
          MessageBox.Show(my.getGreeting(
          "中國"));
          MessageBox.Show(
          "完成調用");

          ??? 在執行上面的代碼后,在Tomcat控制臺中輸出的信息如下圖所示。


          posted on 2009-09-23 14:42 禮物 閱讀(584) 評論(0)  編輯  收藏 所屬分類: Axis
          主站蜘蛛池模板: 铜川市| 沁水县| 普定县| 霍州市| 龙井市| 云南省| 乌拉特前旗| 塔城市| 霍邱县| 沂源县| 石门县| 岳阳市| 思南县| 田东县| 潮州市| 古丈县| 铁岭县| 建阳市| 通榆县| 香港| 岑巩县| 渝中区| 四会市| 平和县| 察哈| 大关县| 安庆市| 古浪县| 三穗县| 大名县| 永德县| 绥滨县| 南宁市| 文化| 和龙市| 阳山县| 蒲城县| 巍山| 凤城市| 祁门县| 固始县|