久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

用Axis 1.1 for Java進(jìn)行Web Services開發(fā)(1)

 冰紅荼 2006-03-18

用Axis 1.1 for Java進(jìn)行Web Services開發(fā)(1)

hgx107923 發(fā)表于 2005-05-27
點(diǎn)擊數(shù):6338 評論數(shù):4 評價(jià):24/10
關(guān)鍵詞:

摘要:

用Axis 1.1 for Java進(jìn)行Web Services開發(fā),本文基本上來自Axis1.1的文檔,。但本人做了部分修改,,以適合國內(nèi)讀者,。
用Axis 1.1 for Java進(jìn)行Web Services開發(fā)
下面的所有幾乎來自Axis1.1的文檔。但不完全來自文檔,,本人做了部分修改,,這些修改完全出自國內(nèi)讀者的需要。
什么是SOAP?
SOAP是一個(gè)基于XML的用于應(yīng)用程序之間通信數(shù)據(jù)編碼的傳輸協(xié)議,。最初由微軟和Userland Software提出,,隨著不斷地完善和改進(jìn),SOAP很快被業(yè)界廣泛應(yīng)用,,目前完全發(fā)布版本是1.1,。在其發(fā)展過程中,W3C XML標(biāo)準(zhǔn)工作小組積極促成SOAP成為一個(gè)真正的開放標(biāo)準(zhǔn),。在寫作此文檔之時(shí),SOAP1.2草案已經(jīng)發(fā)布,,1.2對1.1中相對混亂的部分做了改進(jìn),。
SOAP被廣泛作為新一代跨平臺(tái)、跨語言分布計(jì)算Web Services的重要部分,。
這里太膚淺的說明,,請參閱我的整理《一步一步學(xué)習(xí)SOAP》。
什么是Axis?
Axis本質(zhì)上就是一個(gè)SOAP引擎,,提供創(chuàng)建服務(wù)器端,、客戶端和網(wǎng)關(guān)SOAP操作的基本框架。Axis目前版本是為Java編寫的,,不過為C++的版本正在開發(fā)中,。
但Axis并不完全是一個(gè)SOAP引擎,它還包括:
    是一個(gè)獨(dú)立的SOAP服務(wù)器,。
    是一個(gè)嵌入Servlet引擎(例如Tomcat)的服務(wù)器,。
    支持WSDL。
    提供轉(zhuǎn)化WSDL為Java類的工具,。
    提供例子程序,。
    提供TCP/IP數(shù)據(jù)包監(jiān)視工具。
Axis是第三代Apache SOAP,,從2000年起,,SOAP v2開發(fā)小組開始討論如何讓Axis更加靈活、可配置,,以及能夠處理SOAP和來自W3C的各種XML標(biāo)準(zhǔn),。通過不斷地討論和代碼編寫,Axis目前取得了如下成果:
    速度提高,。 Axis通過基于事件的SAX對XML文檔進(jìn)行處理,,從而在速度和效率上比Apache SOAP有所提高。
    靈活性提高,。
    穩(wěn)定性提高,。
    提供面向組件的部署。
    提供一個(gè)簡潔的傳輸抽象框架。其核心引擎完全于傳輸方式獨(dú)立,。從而使基于何種協(xié)議傳輸?shù)倪x擇更加靈活,。
    支持WSDL。包括到處WSDL和客戶代理生成等,。
在目前發(fā)行1.1版本中有什么東西,?
    SOAP1.1/1.2引擎。
    靈活的配置和部署系統(tǒng),。
    支持及時(shí)自動(dòng)生成SOAP服務(wù)(JWS),。
    支持所有的基本數(shù)據(jù)類型,為自定義串行操作提供類型映射系統(tǒng),。
    JavaBean的自動(dòng)串行操作,,包括將自定義屬性類型映射到XML的屬性和元素。
    RPC和基于消息的SOAP服務(wù)提供者,。
    從部署好的服務(wù)自動(dòng)生成WSDL,。
    WSDL2Java工具可以從WSDL描述文件中產(chǎn)生相應(yīng)的客戶和服務(wù)器端SOAP操作框架。
    初步提供安全擴(kuò)展,,能夠與Servlet2.2安全集成,。
    通過HTTP Cookie和與傳輸無關(guān)的SOAP頭信息提供會(huì)話跟蹤。
    初步支持帶附件的SOAP消息,。
    在EJB方面提供把EJB作為Web服務(wù)的訪問途經(jīng),。
    基于Servlet的HTTP傳輸。
    基于JMS的傳輸,。
    獨(dú)立的服務(wù)器(但需要HTTP 服務(wù)器和Servlet容器支持),。
    提供客戶端、服務(wù)器端相關(guān)應(yīng)用程序的樣例,。
Axis的運(yùn)行需要如下組件包
    axis.jar
    jaxrpc.jar
    saaj.jar
    commons-logging.jar
    commons-discovery.jar
    wsdl4j.jar
    符合JAXP-1.1的XML處理器,。
一步一步開始用Axis進(jìn)行Web Services操作
下面給出一段簡單的調(diào)用Web Services方法的客戶端代碼(由于原文檔中直接用導(dǎo)入包的方式初學(xué)者不易了解那個(gè)類在那個(gè)包中,所以下面我做了一些簡單的修改,,希望能給學(xué)習(xí)者清晰的思路):
public class TestClient {

    public static void main(String[] args) {
        try{
            String endpoint="http://localhost:8080/axis/SayHello.jws?wsdl";// 調(diào)用的web服務(wù)的url地址,,這里是一個(gè)http請求,希望得到的結(jié)果是wsdl文檔,。
            org.apache.axis.client.Service service=new org.apache.axis.client.Service();//建立請求服務(wù)框架實(shí)例,。
            /*
             * org.apache.axis.client.Service實(shí)現(xiàn)JAX-RPC‘s javax.xml.rpc.Services接口
             * 該接口充當(dāng)產(chǎn)生下面提到的org.apache.axis.client.Call實(shí)例
             * 的角色。
             */
            org.apache.axis.client.Call call=(org.apache.axis.client.Call)service.createCall();//從框架中生成一個(gè)維護(hù)調(diào)用的實(shí)例,。
            /*
             * org.apache.axis.client.Call實(shí)現(xiàn)了JAX-RPC‘s javax.xml.rpc.Call接口,。
             */
             call.setTargetEndpointAddress(new java.net.URL(endpoint));
             call.setOperationName(new javax.xml.namespace.QName("http://www./luopc/ws","echoString"));//設(shè)置需要調(diào)用的函數(shù)名稱
             String result=(String)call.invoke(new Object[]{"hello!"});
             System.out.println(result);
            
        }catch(Exception e){
            System.err.println(e.toString());
        }    
    }
}

上面的代碼可能和原文檔中不同,并且在名稱空間,、函數(shù)多態(tài)上會(huì)給用戶造成糊涂,。不過別急,我在翻譯手冊的同時(shí)會(huì)加入很多解釋的代碼,如果哪位純粹看不懂可以通過郵件獲取幫助:luopc@ ,,郵件主題必須是我提供的文檔名稱,。
通過上面的調(diào)用代碼,最終生成向服務(wù)器請求SOAP信息包,,具體XML內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www./2001/XMLSchema"
       xmlns:SOAP-ENV="http://schemas./soap/envelope/"
       xmlns:xsi="http://www./2001/XMLSchema-instance">
  <SOAP-ENV:Body>
<ns1:echoString xmlns:ns1="http://www./luopc/ws">
   <arg0 xsi:type="xsd:string">Hello!</arg0>
</ns1:echoString>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


這里我不再多少,,細(xì)心的朋友請從代碼中找相應(yīng)的對應(yīng)信息來進(jìn)行自己的邏輯理解。至于SOAP協(xié)議在我以后的翻譯文檔中會(huì)加入進(jìn)去,。
從上面的代碼中我們在調(diào)用的時(shí)候輸入了參數(shù)new Object[]{“hello!”},。然后從生成的SOAP請求包中可以看到自動(dòng)序列化成<arg0 xsi:type="xsd:string">Hello!</arg0>。你可以看到參數(shù)名稱為arg0,,類型為xsd:string,。其實(shí)在Axis客戶端我們可以直接通過具體的方法來設(shè)置每一個(gè)參數(shù)名稱、類型以及返回值類型,。如下代碼:
call.addParameter("testParam", 
   org.apache.axis.Constants.XSD_STRING,
   javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.Constants.XSD_STRING);


加入上面的代碼之后生成如下的SOAP信息:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www./2001/XMLSchema"
       xmlns:SOAP-ENV="http://schemas./soap/envelope/"
       xmlns:xsi="http://www./2001/XMLSchema-instance">
  <SOAP-ENV:Body>
<ns1:echoString xmlns:ns1="http://www./luopc/ws">
   <testParam xsi:type="xsd:string">Hello!</testParam>
</ns1:echoString>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


可以作簡單的對比。
也許你會(huì)疑惑設(shè)置參數(shù)名稱和不設(shè)置參數(shù)名稱有什么區(qū)別的疑問,。這里作簡單的解釋:
1.    為什么要call.setReturnType(org.apache.axis.Constants.XSD_STRING),?
上面你可以調(diào)用或者可以不調(diào)用,但當(dāng)返回結(jié)果中沒有標(biāo)明數(shù)據(jù)類型時(shí)Axis就不知道如何進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換,。當(dāng)然如果返回類型你很清楚并且返回應(yīng)答SOAP的結(jié)果中表明了相應(yīng)的數(shù)據(jù)類型你便可以不進(jìn)行上面的函數(shù)調(diào)用,。
2.    為什么要設(shè)置參數(shù)名稱和類型?

好了,,下在你知道了如何調(diào)用Web Services了,,下面告訴你如何寫作和發(fā)布Web Services。
通過Axis發(fā)布Web Services
這里寫作一個(gè)簡單的類,,然后一步一步進(jìn)行發(fā)布,。希望用戶能夠從中理出一些思路來。我在其他的關(guān)于Web Services的文章中會(huì)專門針對Web Services的通用發(fā)布方法,。雖然Web Services牽涉到很多復(fù)雜的知識(shí),,但請大家不要感覺到這些操作簡單,也許你已經(jīng)有很多疑問,,沒關(guān)系,,記下你的疑問,不斷的投試,。
public class SayHello {

    public String echoString(String hello){
        return hello;
    }
}


哈哈,,這個(gè)類是不是太簡單了。
一步一步來,。
Axis提供兩種將Java類發(fā)布成Web Services的途徑,,即即時(shí)快速自動(dòng)發(fā)布和通過配置文件進(jìn)行發(fā)布。我們首先從最容易部署的入手。
JWS----即時(shí)部署
簡單說就是將自己寫的Java類源文件按一定的規(guī)則Copy到特定的目錄下便可自行被Axis部署,。具體步驟如下:
    將上面寫的SayHello.java復(fù)制到axis目錄下,。
    改名為SayHello.jws。
注意:在你寫的類中不能有具體包的信息,,因?yàn)檫@正是Axis即時(shí)部署不支持的,。
運(yùn)行我們前面寫的客戶端進(jìn)行測試,運(yùn)行結(jié)果是hello!,。
目前你是否有如下的問題,?
如果類中用多態(tài)的函數(shù)將如何處理?
其實(shí)很簡單,,我們知道在每次發(fā)出調(diào)用請求之前代理程序在后臺(tái)會(huì)直接請求你給的URL,,這里是http://localhost:8080/axis/SayHello.jws?wsdl,其實(shí)這一請求返回來的是WSDL描述文件,,通過具體的描述文件的內(nèi)容和你輸入的參數(shù)的類型比較,,最終確定發(fā)送什么請求。細(xì)節(jié)上的解釋需要用戶閱讀SOAP的具體內(nèi)容,。我也會(huì)提供相應(yīng)的權(quán)威文當(dāng)翻譯的,。
Axis的客戶端默認(rèn)就是通過HTTP協(xié)議傳輸嗎?
如何將自己定義的類型進(jìn)行映射,?
通過WSDD自定義部署
上面的自動(dòng)部署相當(dāng)簡單,,但當(dāng)你需要
    映射自己的類型時(shí)
    不需要暴露源代碼時(shí)
    需要自己的路徑和包管理時(shí)
    對用戶操作Web Services的事件進(jìn)行相應(yīng)時(shí)
就需要通過WSDD來自定義部署。
前面新特性中提到過,,Axis是一個(gè)很靈活的可配置系統(tǒng),,但在配置之前你得懂得Axis Web Services描述文檔(WSDD)的格式和意義。這里有一個(gè)簡單的例子(deploy.wsdd):
    
<deployment xmlns="http://xml./axis/wsdd/"
       xmlns:java="http://xml./axis/wsdd/providers/java">
     <service name="SayHello2" provider="java:RPC">
      <parameter name="className" value="luopc.ws.SayHello"/>
      <parameter name="allowedMethods" value="*"/>
     </service>
    </deployment>

很簡短的描述就會(huì)自定義對特定類以Web Services的形式發(fā)布,。上面的每一個(gè)service項(xiàng)都會(huì)意味著開通一個(gè)相應(yīng)的可被WSDL文件引用的服務(wù),。其內(nèi)部描述信息將會(huì)描述從請求-處理請求-應(yīng)答需要的所有核心信息。這里provider=”java:RPC”對應(yīng)著相應(yīng)的服務(wù)類為org.apache.axis.providers.java.RPCProvider,。其實(shí)你可以通過多種方式提供相應(yīng)的服務(wù),。在關(guān)于Axis的架構(gòu)文章中將會(huì)詳細(xì)解釋這些內(nèi)容。
上面的各個(gè)參數(shù)我不再解釋,,我想大家一看就明白,。
下面讓我們在上面的簡單配置上開始一步一步的進(jìn)行各種高級(jí)配置:
服務(wù)存活范圍
Axis提供Session、Request和Application三種可選范圍配置,。具體配置標(biāo)記為:
<service name="MyService"...>
  <parameter name="scope" value="value"/>
  ...
</service>

一旦你完成上面的文件,。可以寫一個(gè)腳本批處理文件來完成部署,。批處理文件如下:
java -classpath F:\resource\tools\axis-1_1\lib\axis.jar;F:\resource\tools\axis-1_1\lib\commons-discovery.jar;F:\resource\tools\axis-1_1\lib\jaxrpc.jar;F:\resource\tools\axis-1_1\lib\commons-logging.jar;F:\resource\tools\axis-1_1\lib\log4j-1.2.8.jar;F:\resource\tools\axis-1_1\lib\wsdl4j.jar;F:\resource\tools\axis-1_1\lib\j2ee.jar org.apache.axis.client.AdminClient sayHelloD.wsdd,。

上面的一些jar文件都是Axis運(yùn)行需要的組件,,所以必須添加到環(huán)境中。上面的目錄是我的機(jī)器里的目錄,,你可以按自己的目錄進(jìn)行,。
如果部署成功,會(huì)輸出<Admin>Done processing</Admin>信息,。
但本人這里再強(qiáng)調(diào)幾個(gè):
    你首先要將你編譯好的類放到axis/web-inf/classes/下面,。
    可以通過http://localhost:8080/axis/services/SayHello2來調(diào)用。
    你可以從我的配置文件中發(fā)現(xiàn)了包的概念,。
    可以用相應(yīng)的xml文件進(jìn)行卸載已部署的服務(wù),。
卸載方法如下:
編寫如下XML文檔
<undeployment xmlns="http://xml./axis/wsdd/">
<service name="MyService"/>
</undeployment>

把上面的批處理文件中的sayHelloD.wsdd換成該文件便可。

繼續(xù)關(guān)注高級(jí)部署
如果你想知道自己的某個(gè)Web Services被調(diào)用多少次,,你應(yīng)該怎么做呢,?
Axis提供了相應(yīng)的跟蹤機(jī)制。
    首先你應(yīng)該編寫一個(gè)滿足一定接口的事件處理類,。
    在配置文件中添加事件處理器信息,。
我們先看看配置文件中的信息:
<deployment xmlns="http://xml./axis/wsdd/"
   xmlns:java="http://xml./axis/wsdd/providers/java">
  <!-- define the logging handler configuration -->
<handler name="track" type="java:samples.userguide.example4.LogHandler">
  <parameter name="parameter1" value="訪問該services"/>
</handler>
<!-- define the service, using the log handler we just defined -->
<service name="SayHello2" provider="java:RPC">
  <requestFlow>
   <handler type="track"/>
  </requestFlow>
  <parameter name="className" value="luopc.ws.SayHello"/>
  <parameter name="allowedMethods" value="*"/>
</service>
</deployment>

上面的綠色部分起到核心的配置信息提供。
下面提供一個(gè)事件處理類,,同樣來自原文檔,,但為了更清晰我同樣將所有的類前面加上了包名稱。
package luopc.ws;

/**
* @author luopc
*/
public class EventHandler extends org.apache.axis.handlers.BasicHandler{
    public void invoke(org.apache.axis.MessageContext mtxt){
        String param=(String)getOption("parameter1");
        System.out.println(param);
    }

    public static void main(String[] args) {
    }
}
就這樣,,我們對請求跟蹤了,。嘻嘻,。
可以遠(yuǎn)程進(jìn)行管理(不推薦)
前面就提到服務(wù)類型的問題,,在Axis有四種類型的服務(wù),分別為RPC,、Document,、Wrapped和Message。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多