Axis1.4發佈WebService


1、下載安裝

      下載地址:http://archive.apache.org/dist/axis/
      下載完成之後解壓文件,得到目錄如下
      目錄說明:
            docs:存放Axis的說明文檔。
            lib:存放Axis的二進制發佈包,(如果你想在你項目中使用就導入這裏的包)。
            samples:官方給的一些簡單案例。
            webapps:裏面放了一個axis項目,放到tomcat的webapps下可以直接使用。
            xmls:相關說明文檔。
      maven安裝:大多數情況下我們只是想在自己的web項目中引入這項技術,我們只需要導入jar包即可。
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <dependency>  
  2.     <groupId>axis</groupId>  
  3.     <artifactId>axis</artifactId>  
  4.     <version>1.4</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>axis</groupId>  
  8.     <artifactId>axis-wsdl4j</artifactId>  
  9.     <version>1.5.1</version>  
  10. </dependency>  
  11. <dependency>  
  12.     <groupId>javax.mail</groupId>  
  13.     <artifactId>mail</artifactId>  
  14.     <version>1.4.7</version>  
  15. </dependency>  

2、即時發佈JWS

步驟:編寫一個不帶包名的java類→修改後綴爲jws→將文件拷貝到項目根目錄下。
例如本例中:新建java類,將下載的axis1_4中webapps下的axis文件夾拷貝到tomcat的webapps下,啓動tomcat。
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public class HelloJWS {  
  2.     public String sayHello(String name){  
  3.         return "jws = " + name;  
  4.     }  
  5. }  
將上面java類後綴修改爲jws複製到tomcat/webapps/axis/ 目錄下。訪問路徑 :項目名/類名.jws?wsdl
訪問這個路徑:http://127.0.0.1:8080/axis/HelloJWS.jws?wsdl 在瀏覽器上就可以看到wsdl了,表示發佈服務成功。
JWS方式總結:
      1. 即時發佈方式比較簡單,寫個類一丟就可以了。
      2. 類不能有包名,而且如果你只有class或者jar包則不可以使用這種方式。
      3. 所以可以看出,這種方式只能發佈特別特別簡單的服務。不適用企業開發,所以瞭解就好了。

3、定製發佈

定製發佈的步驟:
      定製發佈就是需要自己寫配置文件然後指定哪些方法是需要發佈的,哪些方法不需要發佈。所以這種比較好。
一般來說定製發佈的步驟如下:
      1. 新建一個web工程。
      2. 導入jar包,如果使用maven管理jar包則使用上面給出的maven依賴即可。
      3. 像正常項目那樣編寫業務類。
      4. 修改web.xml文件,添加一個訪問地址,用於訪問wsdl文件。
      5. 寫一個deploy.wsdd文件,配置哪些方法需要發佈,哪些不用。然後在cmd命令行執行一個命令讀取這個文件。
服務就發佈了。如果想取消則可以寫一個undeploy.wsdd文件,同樣的命令執行這個文件即可。(下面會詳細說明)
      6. 訪問wsdl,看看服務是否發佈成功。
      注意: 上述步驟的第4步是爲了生成server-config.wsdd文件。如果你直接編輯server-config.wsdd文件。那麼就
不用那麼麻煩了。所以我比較喜歡直接編輯server-config.wsdd文件。
定製發佈的詳細流程:
      1. 創建一個maven工程,並添加依賴導入jar包,編輯一個普通的方法用於發佈。
            
      上圖就是整個項目的結構了。其中WEB-INF目錄下的deploy.wsdd表示寫入其中的配置會被髮布。undeploy.wsdd則用於取消發佈。
      2. 修改web.xml文件,增加一個訪問路徑。所以如果你想看看項目一共發佈了多少個服,訪問這個路徑即可。
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <!DOCTYPE web-app PUBLIC  
  2.  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3.  "http://java.sun.com/dtd/web-app_2_3.dtd" >  
  4. <web-app>  
  5.     <servlet>  
  6.         <servlet-name>AxisServlet</servlet-name>  
  7.         <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>  
  8.     </servlet>  
  9.   
  10.     <servlet-mapping>  
  11.         <servlet-name>AxisServlet</servlet-name>  
  12.         <url-pattern>/services/*</url-pattern>  
  13.     </servlet-mapping>  
  14. </web-app>  
      3. 新建deploy.wsdd文件,將我們服務發佈出去。
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <deployment xmlns="http://xml.apache.org/axis/wsdd/"  
  2.     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
  3.   
  4.     <!-- name: 服務名隨便寫。 -->  
  5.     <service name="SayHello" provider="java:RPC">  
  6.         <parameter name="className" value="com.ztesoft.axis.ws.HelloImpl" />  
  7.         <!-- value表示哪些方法需要發佈,*表示全部的public方法。 -->  
  8.         <!-- 如果想指定方法名,方法名與方法名用逗號隔開 -->  
  9.         <parameter name="allowedMethods" value="*" />  
  10.         <!-- 指定命名空間 -->  
  11.         <namespace>http://www.ztesoft.com/axis/sayHello</namespace>  
  12.     </service>  
  13. </deployment>  
      4. 部署項目到tomcat,並且啓動項目。這個時候訪問 http://127.0.0.1:8080/axis/services(因爲web.xml配置了這個servlet路徑,
所以訪問這個路徑)你會發現有兩個服務,AdminService 和 Version。因爲我們還沒有生成server-config.wsdd文件,所以只有兩個。
      5. 通過命令行執行命令讀取deploy.wsdd生成server-config.wsdd文件發佈服務。項目的WEB-INF目錄下
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://127.0.0.1:8080/axis/services deploy.wsdd  
     注意:此處是相對路徑,所以你需要到tomcat/webapps/axis/WEB-INF 目錄下執行cmd。你就會看到
      如果你看到上面兩行內容,說明執行成功了。-l 後面的路徑就是你在web.xml中配置的AxisServlet路徑這個時候該目錄下會生成
一個server-config.wsdd文件。這時訪問 http://127.0.0.1:8080/axis/services。你就會發現多出來一個服務。點擊SayHello的wsdl
你就可以看見服務描述了。
      如果不想發佈這個服務了,則同樣執行上面的命令,將deploy.wsdd換成undeploy.wsdd即可。undeploy.wsdd內容如下
執行之後就看不到該服務了。下面的服務名就是上面可以隨便寫的name。
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <deployment xmlns="http://xml.apache.org/axis/wsdd/" >  
  2.     <service name="SayHello"  />  
  3. </deployment>  
總結:
      1. 定製發佈比即時發佈方便很多,可以自由定義。所以一般用這種,而且不需要添加任何註解只需要配置一個文件即可。
      2. deploy.wsdd以及undeploy.wsdd的目的都是爲了生成或者修改server-config.wsdd。所以直接編輯server-config.wsdd就可以了。
      3. 完整的server-config.wsdd文件如下。
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <deployment xmlns="http://xml.apache.org/axis/wsdd/"  
  3.     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
  4.     <globalConfiguration>  
  5.         <parameter name="sendMultiRefs" value="true" />  
  6.         <parameter name="disablePrettyXML" value="true" />  
  7.         <parameter name="adminPassword" value="admin" />  
  8.         <parameter name="dotNetSoapEncFix" value="true" />  
  9.         <parameter name="enableNamespacePrefixOptimization" value="false" />  
  10.         <parameter name="sendXMLDeclaration" value="true" />  
  11.         <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl" />  
  12.         <parameter name="sendXsiTypes" value="true" />  
  13.         <requestFlow>  
  14.             <handler type="java:org.apache.axis.handlers.JWSHandler">  
  15.                 <parameter name="scope" value="session" />  
  16.             </handler>  
  17.             <handler type="java:org.apache.axis.handlers.JWSHandler">  
  18.                 <parameter name="scope" value="request" />  
  19.                 <parameter name="extension" value=".jwr" />  
  20.             </handler>  
  21.         </requestFlow>  
  22.     </globalConfiguration>  
  23.     <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />  
  24.     <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder" />  
  25.     <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />  
  26.     <transport name="http">  
  27.         <requestFlow>  
  28.             <handler type="URLMapper" />  
  29.             <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />  
  30.         </requestFlow>  
  31.         <parameter name="qs:list"  
  32.             value="org.apache.axis.transport.http.QSListHandler" />  
  33.         <parameter name="qs:wsdl"  
  34.             value="org.apache.axis.transport.http.QSWSDLHandler" />  
  35.         <parameter name="qs.list"  
  36.             value="org.apache.axis.transport.http.QSListHandler" />  
  37.         <parameter name="qs.method"  
  38.             value="org.apache.axis.transport.http.QSMethodHandler" />  
  39.         <parameter name="qs:method"  
  40.             value="org.apache.axis.transport.http.QSMethodHandler" />  
  41.         <parameter name="qs.wsdl"  
  42.             value="org.apache.axis.transport.http.QSWSDLHandler" />  
  43.     </transport>  
  44.     <transport name="local">  
  45.         <responseFlow>  
  46.             <handler type="LocalResponder" />  
  47.         </responseFlow>  
  48.     </transport>  
  49.   
  50.     <!-- 想要添加或者取消修改一下內容即可,AdminService與Version註銷不提供服務。 -->  
  51.   
  52.     <service name="SayHello" provider="java:RPC">  
  53.         <parameter name="allowedMethods" value="*" />  
  54.         <parameter name="className" value="com.ztesoft.axis.ws.HelloImpl" />  
  55.         <namespace>http://www.ztesoft.com/axis/sayHello</namespace>  
  56.     </service>  
  57. </deployment>  

4、高級特性Handler & Chain 

      上面說了直接編輯server-config.wsdd即可發佈服務,所以下面就不再使用命令行方式。
Handler:
      有時候我們有一些特別的需求,比如當執行我們提供的服務時,希望有一些攔截動作。例如攔截一些非法的用戶,
或者統計下這個服務被調用了多少次等很奇怪的問題。對於這種問題一般做法就是設置攔截器。就是在執行你的服務
前執行某些方法,執行之後在執行某些方法。Handler就是做這類事情的。項目結構如下:
具體步驟:
      1. 寫兩個類,繼承BasicHandler。類分別叫BeforeHandle,AfterHandler。
      2. 配置server-config.wsdd,將這兩個方法加入到服務中。
詳細步驟:
      1. 創建類並繼承BasicHandler
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package com.ztesoft.axis.ws;  
  2.   
  3. import org.apache.axis.AxisFault;  
  4. import org.apache.axis.MessageContext;  
  5. import org.apache.axis.handlers.BasicHandler;  
  6.   
  7. public class BeforeHandle extends BasicHandler {  
  8.   
  9.     /** 
  10.      */  
  11.     private static final long serialVersionUID = -1804045183252961242L;  
  12.   
  13.     @Override  
  14.     public void invoke(MessageContext msgContext) throws AxisFault {  
  15.         String someParam = (String) this.getOption("someParam");  
  16.         System.out.println("前置方法,這裏會第一個被調用");  
  17.         System.out.println("server-config.wsdd中配置的自定義參數 :" + someParam);  
  18.           
  19.     }  
  20.   
  21. }  
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package com.ztesoft.axis.ws;  
  2.   
  3. import org.apache.axis.AxisFault;  
  4. import org.apache.axis.MessageContext;  
  5. import org.apache.axis.handlers.BasicHandler;  
  6.   
  7. public class AfterHandler extends BasicHandler{  
  8.   
  9.     /** 
  10.      */  
  11.     private static final long serialVersionUID = -1077633556581583559L;  
  12.   
  13.     @Override  
  14.     public void invoke(MessageContext msgContext) throws AxisFault {  
  15.         System.out.println("後置方法,執行完服務後調用我。我是第三個被調用的。");  
  16.     }  
  17.   
  18. }  
      2. 修改server-config.wsdd文件,type裏面的類路徑前面需要加上前綴java:
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <!-- 添加一個自定義的handler -->  
  2. <handler name="beforeHandler" type="java:com.ztesoft.axis.ws.BeforeHandle">  
  3.     <!-- 這裏還可以設置自定義參數,在類中使用this.getOptions("someParam") 獲取參數 -->  
  4.     <parameter name="someParam" value="好好學習,天天向上" />  
  5. </handler>  
  6.   
  7. <handler name="afterHandler" type="java:com.ztesoft.axis.ws.AfterHandler" />  
  8.   
  9. <service name="SayHello" provider="java:RPC">  
  10.     <parameter name="allowedMethods" value="*" />  
  11.     <parameter name="className" value="com.ztesoft.axis.ws.HelloImpl" />  
  12.     <namespace>http://www.ztesoft.com/axis/sayHello</namespace>  
  13.     <!-- 添加handler -->  
  14.     <requestFlow>  
  15.         <handler type="beforeHandler" />  
  16.     </requestFlow>  
  17.     <responseFlow>  
  18.         <handler type="afterHandler" />  
  19.     </responseFlow>  
  20. </service>  
Chain:
      如果我有一連串的方法需要被調用,那該怎麼辦呢?將Handler一個一個的連接起來組成一個鏈就是chain。
步驟:
      1. 新建一個類繼承SimpleChain。
      2. 將這個類提供的服務像Handler一樣配置到server-config.wsdd中。
詳細步驟:
      1. 新建類
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package com.ztesoft.axis.ws;  
  2.   
  3. import org.apache.axis.SimpleChain;  
  4.   
  5. public class BeforeChain extends SimpleChain{  
  6.   
  7.     /** 
  8.      */  
  9.     private static final long serialVersionUID = 7781745675745772330L;  
  10.       
  11.     // 寫在構造器重即可  
  12.     public BeforeChain(){  
  13.         BeforeHandle beforeHandle = new BeforeHandle();  
  14.         AfterHandler afterHandler = new AfterHandler();  
  15.           
  16.         // 執行順序與添加順序一致。  
  17.         this.addHandler(beforeHandle);  
  18.         this.addHandler(afterHandler);  
  19.     }  
  20. }  
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package com.ztesoft.axis.ws;  
  2.   
  3. import org.apache.axis.SimpleChain;  
  4.   
  5. public class AfterChain extends SimpleChain {  
  6.   
  7.     /** 
  8.      */  
  9.     private static final long serialVersionUID = -620214048210047247L;  
  10.   
  11.     public AfterChain(){  
  12.         BeforeHandle beforeHandle = new BeforeHandle();  
  13.         AfterHandler afterHandler = new AfterHandler();  
  14.           
  15.         // 執行順序與添加順序一致。  
  16.         this.addHandler(afterHandler);  
  17.         this.addHandler(beforeHandle);  
  18.     }  
  19. }  
      2. 修改配置文件
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <!-- 添加自定義Chain -->  
  2. <chain name="beforeChain">  
  3.     <handler type="java:com.ztesoft.axis.ws.BeforeChain" />  
  4. </chain>  
  5. <chain name="afterChain">  
  6.     <handler type="java:com.ztesoft.axis.ws.AfterChain" />  
  7. </chain>  
  8. <service name="SayHello" provider="java:RPC">  
  9.     <parameter name="allowedMethods" value="*" />  
  10.     <parameter name="className" value="com.ztesoft.axis.ws.HelloImpl" />  
  11.     <!-- 添加handler -->  
  12.     <requestFlow>  
  13.         <chain type="beforeChain" />  
  14.     </requestFlow>  
  15.     <responseFlow>  
  16.         <chain type="afterChain" />  
  17.     </responseFlow>  
  18. </service>  
總結:
      Handler與Chain只是一種攔截作用,Axis也默認提供了一些攔截的類。例如:有個Handler叫做Authenticate。
利用他可以實現用戶權限控制,即調用方法的時候需要提供用戶名密碼,只有正確的才能調用。利用Handler和
Chain我們也可以做一些日誌記錄等相關內容,或者報文記錄。配置在全局攔截裏面,globalConfiguration節點即可。

5、自帶調試工具tcpmon

      有時候我們想查看我們發送與請求的內容,這個時候我們該怎麼做呢?tcpmon也許是一個很不錯的選擇。tcpmon主要
起到一個攔截的作用,原理如下,本來我們是直接訪問8080端口的。使用tcpmon之後,我們訪問地址改成8081(可以自
己定義)接着請求的內容被記錄下來,然後tcpmon將請求的內容一模一樣的轉到8080。處理完成之後服務器將處理內容
回給tcpmon,tcpmon記錄返回內容。在將處理結果轉發給我們。
      該工具集成到了axis包中,查找org.apache.axis.utils.tcpmon ,運行這個類的main方法即可看見
      點擊Add按鈕,修改請求地址端口爲紅色的端口。發起服務調用即可看到下面接受與發送的消息了。
總結:
      通過攔截webservice的請求我們發現,webservice採用http的方式傳遞數據。傳輸的數據是滿足soap規則的xml文檔。
由此可以證明 WebService = HTTP + SOAP + WSDL

6、額外注意事項

      Axis技術發佈服務就暫時寫到這裏了。如果博文中有什麼不對的地方請指出,我會第一時間修訂過來。這裏只說瞭如何
發佈一個服務,關於調用則會在後續章節詳細說明。

7、附錄一些最終的配置文件

web.xml配置
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <!DOCTYPE web-app PUBLIC  
  2.  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3.  "http://java.sun.com/dtd/web-app_2_3.dtd" >  
  4. <web-app>  
  5.     <servlet>  
  6.         <servlet-name>AxisServlet</servlet-name>  
  7.         <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>  
  8.     </servlet>  
  9.   
  10.     <servlet-mapping>  
  11.         <servlet-name>AxisServlet</servlet-name>  
  12.         <url-pattern>/services/*</url-pattern>  
  13.     </servlet-mapping>  
  14. </web-app>  
server-config.wsdd配置文件詳細。
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <deployment xmlns="http://xml.apache.org/axis/wsdd/"  
  3.     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
  4.     <globalConfiguration>  
  5.         <parameter name="sendMultiRefs" value="true" />  
  6.         <parameter name="disablePrettyXML" value="true" />  
  7.         <parameter name="adminPassword" value="admin" />  
  8.         <parameter name="dotNetSoapEncFix" value="true" />  
  9.         <parameter name="enableNamespacePrefixOptimization" value="false" />  
  10.         <parameter name="sendXMLDeclaration" value="true" />  
  11.         <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl" />  
  12.         <parameter name="sendXsiTypes" value="true" />  
  13.         <requestFlow>  
  14.             <handler type="java:org.apache.axis.handlers.JWSHandler">  
  15.                 <parameter name="scope" value="session" />  
  16.             </handler>  
  17.             <handler type="java:org.apache.axis.handlers.JWSHandler">  
  18.                 <parameter name="scope" value="request" />  
  19.                 <parameter name="extension" value=".jwr" />  
  20.             </handler>  
  21.         </requestFlow>  
  22.     </globalConfiguration>  
  23.     <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />  
  24.     <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder" />  
  25.     <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />  
  26.   
  27.     <transport name="http">  
  28.         <requestFlow>  
  29.             <handler type="URLMapper" />  
  30.             <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />  
  31.         </requestFlow>  
  32.         <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler" />  
  33.         <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler" />  
  34.         <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler" />  
  35.         <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler" />  
  36.         <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler" />  
  37.         <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler" />  
  38.     </transport>  
  39.     <transport name="local">  
  40.         <responseFlow>  
  41.             <handler type="LocalResponder" />  
  42.         </responseFlow>  
  43.     </transport>  
  44.       
  45.     <!-- 添加一個自定義的handler -->  
  46.     <handler name="beforeHandler" type="java:com.ztesoft.axis.ws.BeforeHandle">  
  47.         <!-- 這裏還可以設置自定義參數,在類中使用this.getOptions("someParam") 獲取參數 -->  
  48.         <parameter name="someParam" value="好好學習,天天向上" />  
  49.     </handler>  
  50.     <handler name="afterHandler" type="java:com.ztesoft.axis.ws.AfterHandler" />  
  51.       
  52.     <!-- 添加自定義Chain -->  
  53.     <chain name="beforeChain">  
  54.         <handler type="java:com.ztesoft.axis.ws.BeforeChain" />  
  55.     </chain>  
  56.     <chain name="afterChain">  
  57.         <handler type="java:com.ztesoft.axis.ws.AfterChain" />  
  58.     </chain>  
  59.   
  60.     <service name="SayHello" provider="java:RPC">  
  61.         <parameter name="allowedMethods" value="*" />  
  62.         <parameter name="className" value="com.ztesoft.axis.ws.HelloImpl" />  
  63.         <namespace>http://www.ztesoft.com/axis/sayHello</namespace>  
  64.         <!-- 添加handler或者Chain -->  
  65.         <requestFlow>  
  66.             <!-- <handler type="beforeHandler"/> -->  
  67.             <chain type="beforeChain" />  
  68.         </requestFlow>  
  69.         <responseFlow>  
  70.             <!-- <handler type="afterHandler"/> -->  
  71.             <chain type="afterChain" />  
  72.         </responseFlow>  
  73.     </service>  
  74.   
  75. </deployment>  

發佈了256 篇原創文章 · 獲贊 37 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章