<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 64,  comments - 9,  trackbacks - 0

    利用AXIS開發(fā)Webservice(二) —— WSDD的一些高級特性

    關(guān)鍵字: webservice axis handler chain

    時(shí)間過的真快,一不小心過了半年了,半年后我來更新第二篇webservice的博文。春困秋乏夏打盹,睡不醒的冬三月。最近又懶了。confused

     

    第一篇介紹了AXIS的兩種發(fā)布方式,和一些基本的應(yīng)用。這一篇說一下一些高級應(yīng)用。 開篇之前先把上篇的一個(gè)遺漏補(bǔ)充上,上篇只講了怎么發(fā)布一個(gè)webservice,但是如何取消沒有卻沒有提。其實(shí)取消一個(gè)已經(jīng)發(fā)布的webservce也是非常簡單的,我們就拿上篇的HelloWorld來做例子吧。 

     

    發(fā)布webservice的時(shí)候我們有一個(gè)deploy.wsdd文件,當(dāng)然在取消發(fā)布的時(shí)候就會(huì)有一個(gè)undeploy.wsdd文件。這個(gè)文件的內(nèi)容也很簡單,xml的代碼如下。

    Xml代碼 復(fù)制代碼
    1. <undeployment xmlns="http://xml.apache.org/axis/wsdd/">  
    2.  <service name="HelloWorld"/>  
    3. </undeployment>  

    編寫完這個(gè)xml文件之后,把它同樣copy到%TOMCAT_HOM\webapps\axis\WEB-INF目錄下,然后CMD打開控制臺(tái),在控制臺(tái)輸入一個(gè)我們很熟悉的命令

        java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd

     

    運(yùn)行之后得到如下結(jié)果說明取消發(fā)布成功

    Processing file undeploy.wsdd       
    <Admin>Done processing</Admin>

     

    說完取消發(fā)布之后就來說一下AXIS的一些高級特性,AXIS在編寫deploy.wsdd這個(gè)文件時(shí),每個(gè)<service>節(jié)點(diǎn)下面會(huì)有這樣一個(gè)子節(jié)點(diǎn)。

    Xml代碼 復(fù)制代碼
    1. <parameter name="scope" value="value"/>  

    這個(gè)節(jié)點(diǎn)配置著你的service object也就是你webservice服務(wù)的那個(gè)object的圣明周期,在后面的value里可以有三個(gè)選項(xiàng)request, session, or application。熟悉Jsp、Servlet、或者EJB里的SessionBean的朋友應(yīng)該能很快能明白這個(gè)三個(gè)配置選項(xiàng)的含義。

     

    requst :這個(gè)選項(xiàng)會(huì)讓AXIS為每一個(gè)SOAP的請求產(chǎn)生一個(gè)服務(wù)對象,可以想像如果這個(gè)webservice的對象足夠復(fù)雜,而且SOAP的請求過多,這個(gè)選項(xiàng)是非常耗費(fèi)服務(wù)器性能的。

    session :如果選擇了session,程序就會(huì)給每個(gè)調(diào)用這個(gè)webservice的客戶端創(chuàng)造一個(gè)服務(wù)對象。

    application :這個(gè)選項(xiàng)最彪悍,程序只會(huì)在內(nèi)存里new出來一個(gè)服務(wù)對象,然后為所有webservice客戶端服務(wù)。很顯然這個(gè)選項(xiàng)不能儲(chǔ)存客戶端的一些個(gè)性化數(shù)據(jù)。所以在功能性上很多時(shí)候不能滿足要求。

     

    接下來說一下Axis的Handler和Chain機(jī)制,Handler和Chain是Axis引擎提供的一個(gè)很強(qiáng)大的工具。假如現(xiàn)在客戶有這樣一個(gè)需求,需要記錄某一個(gè)webservice被調(diào)用的次數(shù),這個(gè)時(shí)候如果在service object里去實(shí)現(xiàn)這個(gè)功能不僅麻煩,而且侵入了原有的程序也會(huì)對增加原有程序的不穩(wěn)定性。有了Handler我們就能見easy的解決這個(gè)問題。我們先來編寫handler的代碼。

    Java代碼 復(fù)制代碼
    1. package com.chnic.handler;   
    2.   
    3. import org.apache.axis.AxisFault;   
    4. import org.apache.axis.MessageContext;   
    5. import org.apache.axis.handlers.BasicHandler;   
    6.   
    7. public class HelloWorldHandler extends BasicHandler{   
    8.   
    9.     private static final long serialVersionUID = 1L;   
    10.     public void invoke(MessageContext context) throws AxisFault {   
    11.         String status = (String) this.getOption("status");   
    12.         System.out.println("HelloWorldHandler's status is: " + status);   
    13.     }   
    14. }   

    BasicHandler是一個(gè)抽象類,Axis提供了很多Handler的具體實(shí)現(xiàn),BasicHandler只是其中最簡單的一個(gè)。要實(shí)現(xiàn)一個(gè)自己的handler首先要從繼承BasicHandler這個(gè)類開始并實(shí)現(xiàn)其中的invoke(MessageContext arg)這個(gè)方法。MessageContext可以看成是一個(gè)Axis的上下文,里面存儲(chǔ)的是一些Axis和webservice的基本信息。想了解的朋友可以看一下Axis的API。編寫完Handler代碼之后我們連編寫發(fā)布文件。

    Xml代碼 復(fù)制代碼
    1. <deployment xmlns="http://xml.apache.org/axis/wsdd/"    
    2.     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
    3.     <handler name="Hello" type="java:com.chnic.handler.HelloWorldHandler">  
    4.        <parameter name="status" value="success"/>  
    5.     </handler>  
    6.   
    7.     <service name="HelloWorld" provider="java:RPC">  
    8.      <requestFlow>  
    9.        <handler type="Hello"/>  
    10.      </requestFlow>  
    11.         <parameter name="className" value="com.chnic.webservice.HelloWorld"/>  
    12.         <parameter name="allowedMethods" value="*"/>  
    13.         <parameter name="scope" value="session"/>  
    14.     </service>  
    15. </deployment>  

    發(fā)布代碼中有這樣的一句,細(xì)心的朋友一定會(huì)發(fā)現(xiàn)。

    Xml代碼 復(fù)制代碼
    1. <parameter name="status" value="success"/>  

    看完這句代碼再對比一下Handler的實(shí)現(xiàn)代碼中的一句,相信大多數(shù)人都能明白了。

    Java代碼 復(fù)制代碼
    1. String status = (String) this.getOption("status");  

    Handler通過getOption(String)這個(gè)方法拿到了配置文件中我配置的屬性值。而我們上述所做的所有工作對于原來的Webserivce來說都是透明的,不會(huì)對侵入原有的程序當(dāng)中。 一個(gè)Handler可以被多個(gè)service所使用通過<requestFlow>這個(gè)標(biāo)簽來引用到某一個(gè)service中,這里還要多提一句既然是一個(gè)requestFlow,這個(gè)當(dāng)然可以加不只一個(gè)的Handler。接下來編寫測試代碼運(yùn)行。在本地應(yīng)用服務(wù)器上會(huì)打出如下語句:HelloWorldHandler's status is: success

    說明測試成功,而且handler是配置在requestflow標(biāo)簽中所以這段代碼會(huì)在service代碼之前先執(zhí)行。

     

    介紹完了Handler再來介紹Chain。從Chain的字面意思就能猜到他實(shí)現(xiàn)的一連串Handler的功能。假如某個(gè)service需要不止一個(gè)Handler,或者要根據(jù)Client的情況來選擇需要那些Handler。特別是后一個(gè)需求,我們無法用一個(gè)或者幾個(gè)Handler來解決,這個(gè)時(shí)候我們就需要<Chain>來實(shí)現(xiàn)了。我們先再編寫一個(gè)Handler,加上之前的那個(gè)Handler我們來組成一條鎖鏈。

    Java代碼 復(fù)制代碼
    1. package com.chnic.handler;   
    2.   
    3. import org.apache.axis.AxisFault;   
    4. import org.apache.axis.MessageContext;   
    5. import org.apache.axis.handlers.BasicHandler;   
    6.   
    7. public class MyHandler extends BasicHandler {   
    8.   
    9.     private static final long serialVersionUID = 1L;   
    10.     public void invoke(MessageContext context) throws AxisFault {   
    11.         System.out.println("This is MyHandler..");   
    12.     }   
    13. }  

     之后我們編寫Chain的代碼

    Java代碼 復(fù)制代碼
    1. package com.chnic.chain;   
    2.   
    3. import org.apache.axis.SimpleChain;   
    4. import com.chnic.handler.HelloWorldHandler;   
    5. import com.chnic.handler.MyHandler;   
    6.   
    7. public class HelloWorldChain extends SimpleChain {   
    8.   
    9.     private static final long serialVersionUID = 1L;   
    10.     public HelloWorldChain(){   
    11.         HelloWorldHandler hwh = new HelloWorldHandler();   
    12.         MyHandler mh = new MyHandler();   
    13.         this.addHandler(hwh);   
    14.         this.addHandler(mh);   
    15.     }   
    16. }  

    在Chain的構(gòu)造函數(shù)中,把我要的兩個(gè)Handler用addHandler()方法加載進(jìn)去。之后我們來編寫發(fā)布文件。<chain>和<handler>元素有些許不同在這里有必要多句嘴。

    <chain>元素中的子元素只允許是<handler>或者<chain>。后者也就是允許在“鎖鏈”里再嵌套“鎖鏈”,在這里就拿嵌套<handler>來舉例,他同樣有兩種方式來實(shí)現(xiàn)。第一種是直接包含<handler>:

     

    Xml代碼 復(fù)制代碼
    1. <chain name="myChain">  
    2.     <handler type="java:com.chnic.handler.MyHandler"/>  
    3. </chain>  

    第二種是引用別的<handler>

     

    Xml代碼 復(fù)制代碼
    1. <handler name="myHandler" type="java:com.chnic.handler.MyHandler"/>  
    2. <chain name="myChain"/>  
    3.    <handler type="myHandler"/>  
    4. </chain>  

    因?yàn)槲覀冞@里的Handler并沒有由BasicHandler來實(shí)現(xiàn),而是由繼承SimpleChain這個(gè)類來實(shí)現(xiàn),嚴(yán)格意義上講,SimpleChain也可以算是一個(gè)Handler,因?yàn)镾impleChain也是從BasicHandler繼承而來,他同樣實(shí)現(xiàn)了invoke()這個(gè)方法。下面回歸正題,來看我們的發(fā)布代碼。

    Xml代碼 復(fù)制代碼
    1. <deployment xmlns="http://xml.apache.org/axis/wsdd/"    
    2.     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
    3.        
    4.     <chain name="myChain">  
    5.         <handler type="java:com.chnic.chain.HelloWorldChain"/>  
    6.     </chain>  
    7.        
    8.     <service name="HelloWorld" provider="java:RPC">  
    9.      <requestFlow>  
    10.        <chain type="myChain"/>  
    11.      </requestFlow>  
    12.   
    13.         <parameter name="className" value="com.chnic.webservice.HelloWorld"/>  
    14.         <parameter name="allowedMethods" value="*"/>  
    15.         <parameter name="scope" value="session"/>  
    16.     </service>       
    17. </deployment>  

    從新發(fā)布webservice之后,運(yùn)行我們的測試代碼。會(huì)發(fā)現(xiàn)在應(yīng)用服務(wù)器的本地控制臺(tái)上打出兩句Handler要輸出的語句,說明測試成功。而且控制臺(tái)打出語句的順序是和我們加載handler的順序一樣的。

     

    除了<requestFlow>之外,Axis還提供了與之相應(yīng)的</responseFlow>,用法和是requestflow一樣的,所不同的是一個(gè)在service執(zhí)行之前一個(gè)是之后。可以加下面代碼到發(fā)布文件中的<service>元素下就可以實(shí)現(xiàn)responseflow的功能

    Xml代碼 復(fù)制代碼
    1. <responseFlow>  
    2.     <handler type="HelloWorldHandler"/>  
    3.  </responseFlow>  

     

    最后簡單提一下遠(yuǎn)程管理,也就是Remote Administration。要實(shí)現(xiàn)遠(yuǎn)程管理在發(fā)布文件的<service>標(biāo)簽下加入下面一段語句就可以了。

    Xml代碼 復(fù)制代碼
    1. <parameter name="enableRemoteAdmin" value="true"/>  

     不過遠(yuǎn)程管理會(huì)有安全方面的問題,所以不建議使用。

     

    一些高級部分就先說到這里,還有一些比如RPC docuement Wrapped Message的區(qū)別和使,如何傳遞一個(gè)Javabean,還有一些配置方面的的問題就留到下節(jié)說吧。

    posted on 2009-07-03 18:39 super_nini 閱讀(449) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2009年7月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    常用鏈接

    留言簿

    隨筆檔案

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费一区二区视频| 1000部禁片黄的免费看| 美女视频黄视大全视频免费的| 456亚洲人成在线播放网站| 久久精品国产精品亚洲毛片| 亚洲国产第一页www| 亚洲国产成人久久综合一| 久久亚洲综合色一区二区三区| 国产亚洲AV无码AV男人的天堂| 亚洲中文久久精品无码| 亚洲精品无码乱码成人| 久久久久亚洲AV成人无码| 亚洲av永久无码精品古装片| 亚洲va在线va天堂va不卡下载| 亚洲视频在线观看| 亚洲熟妇av一区二区三区下载 | 久久免费国产视频| 97视频免费观看2区| 美女被免费喷白浆视频| 久久这里只有精品国产免费10| 在线观看免费毛片| 国产免费资源高清小视频在线观看| 免费在线观看a级毛片| 亚洲А∨精品天堂在线| 亚洲色偷偷综合亚洲AVYP| 亚洲av永久无码精品漫画| 亚洲大香人伊一本线| 亚洲深深色噜噜狠狠网站| 亚洲国产精品自在自线观看 | 亚洲AV成人一区二区三区AV| 亚洲日韩国产精品无码av| 亚洲人成7777| 免费国产黄网站在线看| 在线播放免费人成毛片乱码| 91成人免费观看| 国产精品美女自在线观看免费| 国产成人亚洲综合| 4480yy私人影院亚洲| 亚洲AV综合色区无码一二三区| 一区二区三区在线观看免费| 一区二区三区在线免费看|