axis2開發webservice之編寫Axis2模塊(Module)

?axis2中的模塊化開發。能夠讓開發者自由的加入自己所需的模塊。提高開發效率,減少開發的難度。

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 ws;public class TestWs {public String showName(String name) {return name; }public String getName() {return "axis2 webservice";}
}

以下我們來編寫一個記錄請求和響應SOAP消息的Axis2模塊。當client調用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 {public void applyPolicy(Policy arg0, AxisDescription arg1) throws AxisFault {}public boolean canSupportAssertion(Assertion arg0) {return true;}public void engageNotify(AxisDescription arg0) throws AxisFault {}public void init(ConfigurationContext arg0, AxisModule arg1)throws AxisFault {System.out.println("init");}public void shutdown(ConfigurationContext arg0) throws AxisFault {System.out.println("shutdown");}
}

在本例中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;public class LogHandler extends AbstractHandler implements Handler {private String name;public String getName() {return this.name;}public void setName(String name) {this.name = name;}public Handler.InvocationResponse invoke(MessageContext arg0)throws AxisFault {System.out.println(arg0.getEnvelope().toString());return Handler.InvocationResponse.CONTINUE;}public void revoke(MessageContext msgContext) {System.out.println(msgContext.getEnvelope().toString());}
}

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.xmlweb-inf/conf文件。分別在例如以下四個<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="AxisService"><description>AxisService</description><parameter name="ServiceClass">ws.TestWs</parameter><module ref="logging"/><operation name="showName"><messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /></operation><operation name="getName"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /></operation>
</service>

6步:公布logging模塊

????到如今為止,我們應用能夠建立兩個發行包:logging.marservice.aar。跟我們之前公布的.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模塊,該文件的內容例如以下:


假設modules文件夾中不包括modules.list文件,則Axis2會裝載modules文件里的全部Axis2模塊。

????如今啟動Tomcat,結果例如以下

能夠看到,logging已經初始化了。

接下來就是用wsdl2java方法生成client代碼,再去調用webservice,例如以下

package ws;import java.rmi.RemoteException;import org.apache.axis2.AxisFault;public class TestClient {<span style="white-space:pre">	</span>public static void main(String[] args) {
<span style="white-space:pre">		</span>try {
<span style="white-space:pre">			</span>AxisServiceStub stub = new AxisServiceStub();
<span style="white-space:pre">			</span>ShowName show = new ShowName();
<span style="white-space:pre">			</span>show.setName("thinkpad,今天任務完畢的不錯,加油!");
<span style="white-space:pre">			</span>System.out.println(stub.showName(show).get_return());
<span style="white-space:pre">		</span>} catch (AxisFault e) {
<span style="white-space:pre">			</span>// TODO Auto-generated catch block
<span style="white-space:pre">			</span>e.printStackTrace();
<span style="white-space:pre">		</span>} catch (RemoteException e) {
<span style="white-space:pre">			</span>// TODO Auto-generated catch block
<span style="white-space:pre">			</span>e.printStackTrace();
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
}


在這里須要強調的一點就是,System.out.println(stub.showName(show).get_return());這里一定要get_return()一下,盡管在java se中,這時不須要的。可是這里是webservice。是須要從server端來獲取。否則的話,打印出來的就是返回值的內存地址。假設不注意的話,非常easy覺得是沒有重寫toString()方法的原因。


執行結果

可是始終沒有在控制臺輸出對應的請求和響應SOAP消息。沒辦法,僅僅好再細致檢查了一遍,沒發現錯誤,還以為是tomcat須要重新啟動一下才干夠呢。結果在stop時,發現tomcat輸出了soap信息,例如以下

完整的結果例如以下

?


轉載于:https://www.cnblogs.com/gavanwanggw/p/6816155.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541426.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 看書瀏覽器官_JAVA讀取文件流,設置瀏覽器下載或直接預覽操作

最近項目需要在瀏覽器中通過url預覽圖片。但發現瀏覽器始終默認下載&#xff0c;而不是預覽。研究了一下&#xff0c;發現了問題&#xff1a;// 設置response的header&#xff0c;注意這句&#xff0c;如果開啟&#xff0c;默認瀏覽器會進行下載操作&#xff0c;如果注釋掉&…

Java PriorityQueue poll()方法與示例

PriorityQueue類poll()方法 (PriorityQueue Class poll() method) poll() method is available in java.util package. poll()方法在java.util包中可用。 poll() method is used to return the first element with removing an element from this PriorityQueue. poll()方法用于…

scrapy抓取淘寶女郎

scrapy抓取淘寶女郎 準備工作 首先在淘寶女郎的首頁這里查看&#xff0c;當然想要爬取更多的話&#xff0c;當然這里要查看翻頁的url,不過這操蛋的地方就是這里的翻頁是使用javascript加載的&#xff0c;這個就有點尷尬了&#xff0c;找了好久沒有找到&#xff0c;這里如果有朋…

map在Java集合_java集合之Map

MapMap用于保存具有映射關系的數據。Map中key不允許重復&#xff0c;value可以重復&#xff0c;key和value之間存在單向一對一關系HashMap和Hashtable區別1 Hashtable線程安全、HashMap線程不安全&#xff0c;所以HashMap性能高一點2 Hashtable不允許用null做key和value&#x…

Java OutputStream close()方法與示例

OutputStream類close()方法 (OutputStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this OutputStream stream and free all system resources linked with this stream and …

怎樣在fastboot 里面加入新的命令

fastboot 是android 默認的一種debug 方法。它的優點是在進入linux kernel 之前就可以操作。默認fastboot 支持的命令&#xff1a; usage: fastboot [ <option> ] <command>commands: update <filename> reflash device …

java編寫字符串連接程序注釋_Java 注解自動化處理對應關系實現注釋代碼化

public class EsQuery { private static int DEFAULT_SIZE 100; private final Map termFilter;private final Map rangeFilter;private final Map matchFilter;private int size;private String orderBy null;private String order null; // query 查詢語法, 是否需要 filtere…

getlanguage_Java語言環境getLanguage()方法與示例

getlanguage區域設置類getLanguage()方法 (Locale Class getLanguage() method) getLanguage() method is available in java.util package. getLanguage()方法在java.util包中可用。 getLanguage() method is used to retrieve this Locale language code and the language co…

[轉]Anaconda

安裝 Anaconda Anaconda 可用于 Windows、Mac OS X 和 Linux。可以在 https://www.continuum.io/down... 上找到安裝程序和安裝說明。 如果計算機上已經安裝了 Python&#xff0c;這不會有任何影響。實際上&#xff0c;腳本和程序使用的默認 Python 是 Anaconda 附帶的 Python。…

win10 iot core java_Windows 10 IoT Core 正式版初體驗

今天收到Windows 10 IoT Core Team郵件&#xff0c;Windows 10 IoT Core正式發布。以下記錄了今天在Raspberry Pi 2上的體驗過程&#xff1a;準備工作一臺運行著正版Windows 10且版本不小于10240的個人PCVisual Studio 2015 版本不小于14.0.23107.0 D14Rel Install Visual Stud…

filterwriter_Java FilterWriter flush()方法與示例

filterwriterFilterWriter類flush()方法 (FilterWriter Class flush() method) flush() method is available in java.io package. flush()方法在java.io包中可用。 flush() method is used to flush out the string from this FilterWriter stream. flush()方法用于從此Filter…

VUE2 第五天學習--過渡效果

閱讀目錄 1.理解VUE---過渡效果回到頂部1.理解VUE---過渡效果 1. 過渡的-css-類名會有4個(css) 類名在 enter/leave 在過渡中切換。1. v-enter: 進入過渡的開始狀態。在元素被插入時生效&#xff0c;在下一個幀移除。2. v-enter-active: 進入過渡的結束狀態。在元素被插入時生效…

java 集合addall_Java集合的addAll()方法和示例

java 集合addall集合類的addAll()方法 (Collections Class addAll() method) addAll() Method is available in java.lang package. addAll()方法在java.lang包中可用。 addAll() Method is used to put all the given elements(ele) to the given collection (co). addAll()方…

國家可持續發展議程創新示范區創建工作推進會在北京召開

2019獨角獸企業重金招聘Python工程師標準>>> 為推進地方申報國家可持續發展議程創新示范區相關工作&#xff0c;根據國家可持續發展議程創新示范區創建工作的進展及需求&#xff0c;2017年4月23日—25日&#xff0c;科技部社會發展科技司、中國21世紀議程管理中心在…

java控制臺打印圖片_java——控制臺輸入打印圖形

1. 打印直角三角形需求說明&#xff1a;從控制臺輸入直角三角形的高度(行數)。每行*的數目依次為1、3、5、7等。實現思路&#xff1a;外層循環控制行數&#xff0c;根據用戶輸入的行數得到外層循環條件分析每行打印的內容&#xff1a;每一行均打印*號&#xff0c;第i行的*號數為…

Java日歷compareTo()方法與示例

日歷類的compareTo()方法 (Calendar Class compareTo() method) compareTo() method is available in java.util package. compareTo()方法在java.util包中可用。 compareTo() method is used to compare two Calendar objects or in other words, we can say this method is u…

在struts2中配置自定義攔截器放行多個方法

源碼&#xff1a; 自定義的攔截器類&#xff1a; //自定義攔截器類:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation;im…

java多態和泛型_Java面向對象(二) 接口、多態和泛型

一、接口二、多態多態是同一個行為具有多個不同表現形式或形態的能力。2.1 類型轉換轉換方式隱式 向上轉型對于基本數據類型&#xff0c;存儲容量低的可自動向存儲容量高的類型轉換對于引用變量&#xff0c;子類可被轉換為超類&#xff0c;可被賦給所屬類實現的接口的引用顯式 …

Java ArrayList contains()方法及示例

ArrayList類contains()方法 (ArrayList Class contains() method) contains() method is available in java.util package. contains()方法在java.util包中可用。 contains() method is used to check whether this Arraylist contains the given object or not. contains()方法…

BlockingQueue詳解

前言&#xff1a; 在新增的Concurrent包中&#xff0c;BlockingQueue很好的解決了多線程中&#xff0c;如何高效安全“傳輸”數據的問題。通過這些高效并且線程安全的隊列類&#xff0c;為我們快速搭建高質量的多線程程序帶來極大的便利。本文詳細介紹了BlockingQueue家庭中的所…