Apache Axis初級教程---安裝、應用

本文講述了Apache Axis的安裝及簡單應用,作爲Apache Axis的一個入門教程。雖然現在Apache Web Service項目已經推出了Apache Axis2Axis2相對Axis是一個很大的更新,關於Apache Axis2的介紹,請參考http://ws.apache.org/axis2,目前的版本是1.3。既然已經有了Apache Axis2這個更加優秀的Web Service Engine,爲什麼還要介紹Apache Axis呢,原因在於系統的兼容性,從Apache Axis既存系統MigrationApache Axis2有的時候並不是很容易,所以Axis還殘留一些利用的價值。
本文主要介紹安裝下載、安裝、運行Apache Axis及部署一個樣例Web Service並使用客戶端進行調用。
關於Apache Axis的一些概念,摘錄Apache Axis官方說明:
Apache Axis是開源的SOAP服務器和客戶端。SOAP是網絡間不同語言的程序進行交互的方法。SOAP通常在HTTP上交換信息:客戶端POST一個SOAP請求,然後接受HTTP響應,HTTP的響應可能爲成功代碼、SOAP響應或者錯誤代碼。
SOAP消息的格式是XML,在不同的SOAP系統之間使用這種消息格式來對信息進行結構化。消息在SOAP Envelope中包含一個或者多個SOAP元素,Header或者SOAP Body
Axis實現了JAX-RPC APIJAX-RPC APIJava服務編程的標準之一。
Axis編譯後的文件爲axis.jar,它實現了在jaxrpc.jarsaaj.jar中聲明的JAX-RPC API。它需要很多輔助類,例如日誌、WSDL處理和內省。這些文件可以被打包成axis.war,然後將其部署到servlet容器中。Axis中附帶了一些樣例的SOAP服務程序。
 
前提條件:
本部分內容講述的是Java的服務器端編程,設計的內容較多,主要是以下各部分內容,讀者應該掌握或者瞭解以下內容:
1.         核心Java數據類型、類以及編程概念。
2.         線程、線程安全以及同步的概念。
3.         類加載器的概念以及層次化類加載器,"ClassNotFoundException"的常見原因。
4.         如何從異常信息中分析問題,NullPointerException以及一些常見異常的原因及修正方法。
5.         web應用程序、servlet的概念,以及類、類庫和數據在web應用程序中的分佈位置。
6.         應用程序服務器的啓動以及發佈應用程序。
7.         網絡的概念,sockets API,尤其是TCP/IP
8.         HTTP的概念、核心協議以及錯誤代碼,HTTP頭信息以及基本認證的細節。
9.         XML的概念。
以上9條是Apache Axis中的說明,筆者認爲除此之外,還應該對WSDL(Web Service Description Language),SOAP(Simple Object Access Protocol)有一定的瞭解。
另外,Apache Axis 1.4需要XML Parser的支持,如果Java的版本是Java 1.4的話,那麼已經包含了XML Parser,如果使用以前的版本,需要下載XML Parser並設置到系統CLASSPATH中。或者如果使用Apache Tomcat 4.1版本以後的服務器,都已經包含了XML Parser。推薦使用的XML ParserXercesApache Axis要求jdk的版本爲jdk 1.3+
 
0.下載必要的軟件及jar文件。
本文需要下載一下軟件及jar文件:
tomcat(tomcat5.5)
mail.jar(javamail)
activation.jar(jaf)
xmlsec.jarxmlsec
axis-1_4axis
1.設置環境變量
將下載的axis-bin-1_4.zip解壓縮,解壓縮後的目錄爲AXIS_HOME,目錄結構如下:
假設AXIS_HOMEd:/axis-1_4,設置以下環境變量:
AXIS_HOME=d:/axis-1_4
AXIS_LIB=%AXIS_HOME%/lib
AXISCLASSPATH=%AXIS_LIB%/axis.jar;%AXIS_LIB%/commons-discovery-0.2.jar;%AXIS_LIB%/commons-logging-1.0.4.jar;%AXIS_LIB%/jaxrpc.jar;%AXIS_LIB%/saaj.jar;%AXIS_LIB%/log4j-1.2.8.jar;%AXIS_LIB%/wsdl4j-1.5.1.jar;
windows系統中,可以將上述變量設置到環境屬性中,避免每次執行set操作。通過查看我的電腦”--->”屬性,設置以上三個環境變量,如下圖所示:
然後將AXISCLASSPATH添加到系統的CLASSPATH變量中,這樣在執行需要用到AXISCLASSPATH中的類的時候,就不需要使用java –cp %AXISCLASSPATH%了。當然也可以不將其加入到系統CLASSPATH中,up to you
2.安裝axis
拷貝AXIS_HOME/webapps/axis目錄到你的應用程序服務器,這個服務器需要支持Servlet 2.2以上的規範,推薦使用Tomcat 4.1版本以上的服務器。當然也可以使用其他的服務器。筆者使用的服務器爲apache-tocmat-5.5.25,此時應該將AXIS_HOME/webapps/axis拷貝到TOMCAT_HOME/webapps目錄下,即拷貝完成後axis的目錄爲TOMCAT_HOME/webapps/axis
Java 1.4中修改了以java.*javax.*類的加載順序,他們只能從endorsed (認可的)目錄。jaxrpc.jarsaaj.jar包含javax package,所以可能沒有被加載。如果happyaxis.jsp不能找到相關的類,那麼應該將這些類由TOMCAT_HOME/webapps/axis/WEB-INF/lib下拷貝到TOMCAT_HOME/common/lib目錄下,然後重新啓動Tomcat
Axis需要找到一個XML Parser,如果應用程序服務器或者Java運行時環境沒有相應的解析器(並且axis web應用程序可以使用),那麼就需要下載並添加。Java 1.4包含Crimson解析器,所以可以忽略這個步驟,雖然Apache Axis認爲Xerces更好一些。
添加的XML解析器需要兼容JAXP 1.1。建議使用Xerces jars,下載地址爲xml-xerces distribution。除非JRE或者服務器有明確的要求,否則的話可以將解析器的jar文件放在axis/WEB-INF/lib目錄下。本部分如果使用Xerces的話,需要將xml-apis.jarxercesImpl.jar文件拷貝到AXISCLASSPATH(如前所述),這樣Axis就可以使用XML解析器。
3.查看Axis信息
啓動Tomcat服務器,然後再地址欄輸入http://localhost:8080/axis,根據需要修改主機名和端口號,應該可以看到如下頁面:
其中主要的菜單如下:
Validation:確認本地的安裝配置是否成功,在該頁面會對系統的配置做一個彙總,如果存在問題會以警告的消息進行醒目提示。
List:列出當前可用的Web Service
Call:調用本地終端節點。
Visit:訪問Apache Axis官方網站。
Administrater Axis:管理員信息,默認情況下是禁用的,可以通過修改%TOMCAT_HOME%/webapps/axis/WEB-INF/web.xml添加servlet-mapping來啓用。
SOAPMonitorSOAP監視器,默認情況下禁用,啓用方法在後文介紹。
 
執行Validation操作,可以看到如下頁面:
這就是所謂的Axis Happiness頁面了,這個頁面包含了如下的內容:
需要的組件
Ø         Found SAAJ API ( javax.xml.soap.SOAPMessage ) at D:/apache-tomcat-5.5.25/common/lib/saaj.jar
Ø         Found JAX-RPC API ( javax.xml.rpc.Service ) at D:/apache-tomcat-5.5.25/common/lib/jaxrpc.jar
Ø         Found Apache-Axis ( org.apache.axis.transport.http.AxisServlet ) at D:/apache-tomcat-5.5.25/webapps/axis/WEB-INF/lib/axis.jar
Ø         Found Jakarta-Commons Discovery ( org.apache.commons.discovery.Resource ) at D:/apache-tomcat-5.5.25/webapps/axis/WEB-INF/lib/commons-discovery-0.2.jar
Ø         Found Jakarta-Commons Logging ( org.apache.commons.logging.Log ) at D:/apache-tomcat-5.5.25/bin/commons-logging-api.jar
Ø         Found Log4j ( org.apache.log4j.Layout ) at D:/apache-tomcat-5.5.25/webapps/axis/WEB-INF/lib/log4j-1.2.8.jar
Ø         Found IBM's WSDL4Java ( com.ibm.wsdl.factory.WSDLFactoryImpl ) at D:/apache-tomcat-5.5.25/webapps/axis/WEB-INF/lib/wsdl4j-1.5.1.jar
Ø         Found JAXP implementation ( javax.xml.parsers.SAXParserFactory ) at an unknown location
Ø         Found Activation API ( javax.activation.DataHandler ) at D:/apache-tomcat-5.5.25/webapps/axis/WEB-INF/lib/activation.jar
可選組件(用於附件、安全)
Ø         Found Mail API ( javax.mail.internet.MimeMessage ) at D:/apache-tomcat-5.5.25/webapps/axis/WEB-INF/lib/mail.jar
Ø         Found XML Security API ( org.apache.xml.security.Init ) at D:/apache-tomcat-5.5.25/webapps/axis/WEB-INF/lib/xmlsec-1.4.0.jar
Ø         Found Java Secure Socket Extension ( javax.net.ssl.SSLSocketFactory ) at an unknown location
如果以上組件都存在,那麼Axis將提示如下信息。
The core axis libraries are present.The optional components are present.
如果以上組件有缺少的,或者Apache Axis沒有找到的,那麼將會有警告信息。
(筆者將mail.jaractivation.jarxmlsec-1.4.0.jar都拷貝到了%TOMCAT_HOME%/webapps/axis/WB-INF/lib目錄下,所以可以找到這三個軟件包,實際上,這三個軟件包並不是必須的,只是在一些例子程序中需要,但是如果缺少的話,在tomcat控制檯會打印警告日誌,提示找不到文件或者不能完成某些操作。)
最後在該頁面顯示一些Apache Tomcat服務器的信息以及系統屬性信息,諸如操作系統、瀏覽器、Java版本等等。
4.測試Axis服務
查找服務
在開始頁(http://localhost:8080/axis),選擇List鏈接,查看已經註冊的Web Services。在這個頁面可以點擊wsdl的鏈接來查看Web Service是否正在運行。注意,Axis支持的JWS Web Service並沒有在這裏列出。
測試SOAP Endpoint
下面來測試一個服務。雖然SOAP 1.1使用HTTP POST來提交一個XML請求到endpoint,但是Axis也支持強制的HTTP GET方法來訪問,這對測試很有幫助。首先測試一下獲取Axis的版本這個服務,需要調用getVersion方法:
這個例子返回的值應該與下面的結果類似:
 <?xml version="1.0" encoding="UTF-8" ?>
 <soapenv:Envelope
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
      <getVersionResponse
          soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
          <getVersionReturn
              xsi:type="xsd:string">
              Apache Axis version: 1.1 Built on Apr 04, 2003 (01:30:37 PST)
          </getVersionReturn>
      </getVersionResponse>
      </soapenv:Body>
 </soapenv:Envelope>
不同的Axis的版本顯示也不同。
測試JWS Endpoint
現在測試一個JWS Web ServiceAxisJWS Web Service就是java文件,保存在Axis webapp的目錄樹中,但是不能保存在WEB-INF目錄中,並且文件擴展名爲.jws。當通過URL請求.jws文件的時候,它會被編譯並執行。
通過請求樣例程序EchoHeaders.jws (這個文件保存在axis目錄下)
這時會返回如下XML格式的消息,顯示了應用程序Headers的信息:
<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <listResponse
            soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <listReturn xsi:type="soapenc:Array"
                soapenc:arrayType="xsd:string[6]"
                xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
                <item>accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*</item>
                <item>accept-language:en-us</item>
                <item>accept-encoding:gzip, deflate</item>
                <item>user-agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)</item>
                <item>host:localhost:8080</item>
                <item>connection:Keep-Alive</item>
            </listReturn>
        </listResponse>
    </soapenv:Body>
</soapenv:Envelope>
到目前爲止,Apache Axis安裝完成,並正常工作。
5.安裝新的Web Service
安裝新的Web Service的過程主要分以下兩個步驟:
(1)     將新的Web Service的類和類庫放到Axis WAR目錄樹中
(2)     將新的文件通知AxisEngine
後者是通過Admin web服務來提交一個XML部署描述符給Axis來完成的,通常是通過AdminClient來完成或者<axis-admin>這個Ant任務來完成。兩者實現的功能是一致的:執行Axis SOAP客戶端來和Axis管理服務通信(Axis web service是一個SOAP service)。同時它也是一個特殊的SOAP service,因爲只能在本地調用,並且是密碼保護的,這樣可以阻止遠程調用和防止任何人使用管理程序。客戶端知道一個默認的密碼。當修改這個密碼時,需要告訴客戶端。
第一步是將代碼添加到服務器。在WEB-INF目錄中,查找(或者創建)classes目錄。在這個目錄中,將編譯後的Java類文件拷貝到這裏,注意Java包層次結構。
如果類文件已經打包成JAR文件,那麼可以將其放在WEB-INF/lib目錄中。其他的第三方類庫(jar)也放在這個目錄中。
當添加完類文件或者類庫文件後,需要重新啓動axis web應用程序,使用Tomcat管理控制檯重啓webapp或者重啓Tomcat服務器。
6.發佈Web Service
(5)中已經完成安裝Web Service,現在需要做的就是告訴Axis如何發佈這個Web ServiceAxis使用Web服務部署描述符(WSDD)文件(XML格式的文件)來描述Web服務:服務方法和SOAP endpoint的其他內容。
Apache Axis的用戶指南中詳細描述了WSDD文件,現在來運行一個Axis樣例:Stock Quote服務。
根據前面的內容,已經設置AXIS_HOMEAXIS_LIBAXISCLASSPATH環境變量,並將其添加到CLASSPATH中。(Apache Axis的安裝指南中沒有將其添加到CLASSPATH中,而是使用java –cp %AXISCLASSPATH% JavaClass的形式來使用)
AXIS_HOME/sampes/stock目錄下,包含了deploy.wsdd文件,這就是需要告訴給axis的部署描述符。如下圖所示文件位置:
         不是描述符是Axis-specificXML文件,用於告訴Axis發佈或者卸載一個Web Service,以及如何配置Axis自身的文件。Axis Administration Web Service允許AdminClient程序或者它對應的Ant任務提交一個用於說明的WSDD文件。Axis “engine”會更新配置信息,並保存狀態。
         默認情況下,Axis將狀態保存到一個全局的配置文件TOMCAT_HOME/webapps/axis/WEB-INF/server-config.wsdd。有的時候在服務器啓動的時候會看到一個警告信息,說server-config.wsdd文件不存在,沒有關係,因爲Axis在部署任意服務後就會自動的創建這個文件。部署完成後可以查看這個文件的內容。
         進入AXIS_HOME/samples/stock目錄,執行以下命令:
         java org.apache.axis.client.AdminClient –lhttp://localhost:8080/axis/services/AdminService deploy.wsdd
         運行結果如下:(由於筆者先前已經部署過這個web service,所以先undeploy一下,然後再進行deploy)
(如果在執行的時候發生java客戶端異常,比如ClassNotFoundException,需要檢查AXISCLASSPATHCLASSPATH是否設置正確,是否寫錯了類名或者其他的一些錯誤。)
         執行後,在TOMCAT_HOME/axis/WEB-INF/目錄下生成了server-config.wsdd文件,其內容的說明,在用戶指南有詳細的介紹,這裏不做介紹。
         測試客戶端訪問:
         返回到AXIS_HOME目錄,執行下面的命令:
         java –cp .;%AXISCLASSPATH% samples.stock.GetQuote –lhttp://localhost:8080/axis/servlet/AxisServlet –uuser1 –wpass1 XXX
         運行結果如下:
 
7.高級安裝:將Axis添加到應用程序中
如果對於Web應用程序開發很熟悉的話,那麼可能需要將web services添加到一個已經存在的web應用程序中,可以通過這種辦法來運行Axis。與安裝web serviceAxis不同,需要將Axis添加到Web應用程序。
¨         axis.jarwsdl.jarsaaj.jarjaxrpc.jar以及其他依賴的jar文件添加到自定義的WAR文件中。
¨         Axis Servlet的聲明從TOMCAT_HOME/webapps/axis/WEB-INF/web.xml文件中拷貝到自定義的web.xml文件中。
¨         構建並部署webapp
¨         運行Axis AdminClient來訪問webapp,而不是Axis,這時需要修改訪問的URL
8.啓用SOAPMonitor
SOAPMonitor允許通過Web瀏覽器來監視SOAP請求和響應。關於SOAPMonitor的使用,可以參考用戶指南中的相關部分。
默認情況下,SOAPMonitor是禁用的。啓用它的基本步驟如下:編譯SOAP Monitor java applet、發佈SOAP Monitor web service、在需要監視的web service中添加請求和響應的處理流。
(1)進入到AXIS_HOME/webapps/axis目錄,然後編譯SOAPMonitorApplet.java程序:
javac –classpath %AXIS_HOME%/lib/axis.jar SOAPMonitorApplet.java
運行結果如下:
D:/axis-1_4/webapps/axis>javac -classpath %AXIS_HOME%/lib/axis.jar SOAPMonitorAp
plet.java
         將編譯後的SOAPMonitorApplet*.class文件拷貝到TOMCAT_HOME/webapps/axis目錄下。
(2)發佈SOAPMonitorService
將下面的內容拷貝到一個文件中,並保存爲deploy-monitor.wsdd文件,作爲SOAPMonitorService的部署描述符,將其保存在AXIS_HOME/webapps/axis目錄下(文件名和目錄任意)
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <handler name="soapmonitor"
      type="java:org.apache.axis.handlers.SOAPMonitorHandler">
    <parameter name="wsdlURL"
      value="/axis/SOAPMonitorService-impl.wsdl"/>
    <parameter name="namespace"
      value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
    <parameter name="serviceName" value="SOAPMonitorService"/>
    <parameter name="portName" value="Demo"/>
 </handler>
 <service name="SOAPMonitorService" provider="java:RPC">
    <parameter name="allowedMethods" value="publishMessage"/>
    <parameter name="className"
      value="org.apache.axis.monitor.SOAPMonitorService"/>
    <parameter name="scope" value="Application"/>
 </service>
</deployment>
進入到deploy-monitor.wsdd保存的目錄,執行如下程序:
java –cp %AXISCLASSPATH% org.apache.axis.client.AdminClient –lhttp://localhost:8080/axis/services/AdminService deploy-monitor.wsdd
運行結果如下:
(3)對於每個要監視的服務,在服務部署描述符中添加請求和響應的flow定義並部署(或者重新部署)服務。requestFlowresponseFlow定義在<service>元素後面,如果一個服務已經發布了,那麼首先undeploy,之後使用修改後的部署描述符deploy。下面是一個例子:
...
<service name="xmltoday-delayed-quotes" provider="java:RPC">
    <requestFlow>
      <handler type="soapmonitor"/>
    </requestFlow>
    <responseFlow>
      <handler type="soapmonitor"/>
    </responseFlow>
    ...
(4)使用Web瀏覽器輸入http://host:port/webapp/SOAPMonitor就可以SOAP請求和響應消息了。
例如,重新訪問stock這個樣例服務時,可以看到如下消息:
SOAP Reuqest:
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <ns1:getQuote soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:xmltoday-delayed-quotes">
      <symbol xsi:type="xsd:string">XXX</symbol>
    </ns1:getQuote>
  </soapenv:Body>
</soapenv:Envelope>
SOAP Response:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <ns1:getQuoteResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:xmltoday-delayed-quotes">
      <getQuoteReturn xsi:type="xsd:float">55.25</getQuoteReturn>
    </ns1:getQuoteResponse>
  </soapenv:Body>
</soapenv:Envelope>
 
總結:AxisSOAP的一個簡單實現,可以添加到可以操作web服務的應用程序中。
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章