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

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

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

    持之以恒

    記錄本
    posts - 4, comments - 32, trackbacks - 0, articles - 74
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

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

     

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

     

    發布webservice的時候我們有一個deploy.wsdd文件,當然在取消發布的時候就會有一個undeploy.wsdd文件。這個文件的內容也很簡單,xml的代碼如下。

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

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

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

     

    運行之后得到如下結果說明取消發布成功

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

     

    說完取消發布之后就來說一下AXIS的一些高級特性,AXIS在編寫deploy.wsdd這個文件時,每個<service>節點下面會有這樣一個子節點。

    Xml代碼 復制代碼 收藏代碼
    1. <parameter name="scope" value="value"/>

    這個節點配置著你的service object也就是你webservice服務的那個object的圣明周期,在后面的value里可以有三個選項request, session, or application。熟悉Jsp、Servlet、或者EJB里的SessionBean的朋友應該能很快能明白這個三個配置選項的含義。

     

    requst :這個選項會讓AXIS為每一個SOAP的請求產生一個服務對象,可以想像如果這個webservice的對象足夠復雜,而且SOAP的請求過多,這個選項是非常耗費服務器性能的。

    session :如果選擇了session,程序就會給每個調用這個webservice的客戶端創造一個服務對象。

    application :這個選項最彪悍,程序只會在內存里new出來一個服務對象,然后為所有webservice客戶端服務。很顯然這個選項不能儲存客戶端的一些個性化數據。所以在功能性上很多時候不能滿足要求。

     

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

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

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

    Xml代碼 復制代碼 收藏代碼
    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. <service name="HelloWorld" provider="java:RPC">
    7. <requestFlow>
    8. <handler type="Hello"/>
    9. </requestFlow>
    10. <parameter name="className" value="com.chnic.webservice.HelloWorld"/>
    11. <parameter name="allowedMethods" value="*"/>
    12. <parameter name="scope" value="session"/>
    13. </service>
    14. </deployment>

    發布代碼中有這樣的一句,細心的朋友一定會發現。

    Xml代碼 復制代碼 收藏代碼
    1. <parameter name="status" value="success"/>

    看完這句代碼再對比一下Handler的實現代碼中的一句,相信大多數人都能明白了。

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

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

    說明測試成功,而且handler是配置在requestflow標簽中所以這段代碼會在service代碼之前先執行。

     

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

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

    之后我們編寫Chain的代碼

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

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

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

     

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

    第二種是引用別的<handler>

     

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

    因為我們這里的Handler并沒有由BasicHandler來實現,而是由繼承SimpleChain這個類來實現,嚴格意義上講,SimpleChain也可以算是一個Handler,因為SimpleChain也是從BasicHandler繼承而來,他同樣實現了invoke()這個方法。下面回歸正題,來看我們的發布代碼。

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

    從新發布webservice之后,運行我們的測試代碼。會發現在應用服務器的本地控制臺上打出兩句Handler要輸出的語句,說明測試成功。而且控制臺打出語句的順序是和我們加載handler的順序一樣的。

     

    除了<requestFlow>之外,Axis還提供了與之相應的</responseFlow>,用法和是requestflow一樣的,所不同的是一個在service執行之前一個是之后。可以加下面代碼到發布文件中的<service>元素下就可以實現responseflow的功能

    Xml代碼 復制代碼 收藏代碼
    1. <responseFlow>
    2. <handler type="HelloWorldHandler"/>
    3. </responseFlow>

     

    最后簡單提一下遠程管理,也就是Remote Administration。要實現遠程管理在發布文件的<service>標簽下加入下面一段語句就可以了。

    Xml代碼 復制代碼 收藏代碼
    1. <parameter name="enableRemoteAdmin" value="true"/>

    不過遠程管理會有安全方面的問題,所以不建議使用。

     

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



    小白
    主站蜘蛛池模板: 久久精品国产亚洲沈樵| 国产免费卡一卡三卡乱码| 亚洲国产精品高清久久久| xxxxxx日本处大片免费看| 亚洲国产天堂久久久久久| 一二三四在线观看免费中文在线观看 | 国产在线国偷精品免费看| 国产亚洲精品无码专区| 国产一级在线免费观看| 亚洲不卡中文字幕无码| 久久国产乱子伦精品免费一| 亚洲久本草在线中文字幕| 最好看的中文字幕2019免费| 亚洲成aⅴ人在线观看| 免费激情视频网站| 黄页视频在线观看免费| 伊人婷婷综合缴情亚洲五月| 九九美女网站免费| 亚洲妓女综合网99| 国产精品免费综合一区视频| 男女作爱免费网站| 久久久亚洲精品视频| 大学生一级毛片免费看| 曰批全过程免费视频观看免费软件| 久久亚洲欧洲国产综合| 亚洲免费视频播放| 亚洲Av永久无码精品一区二区| 亚洲&#228;v永久无码精品天堂久久 | 免费人成视频x8x8入口| 精品在线免费观看| 亚洲色大成网站WWW国产| 亚洲国产精品毛片av不卡在线| 免费无码成人AV在线播放不卡| 亚洲人成电影网站久久| 亚洲福利视频一区二区| 国产国产人免费视频成69堂| 亚洲AV无码成人网站在线观看| 亚洲产国偷V产偷V自拍色戒| 成年女人色毛片免费看| a级片免费观看视频| 亚洲综合欧美色五月俺也去|