axis1-myeclipse/eclipse-入門級別-資源、流程、常見問題

本文轉載自:http://blog.csdn.net/bestcxx/article/details/52300248



axis1-myeclipse/eclipse-入門級別-資源、流程、常見問題




1、資源下載

總共需要 axis1.4資源包,mail.jaractivation.jar

下載完axis1.4資源包 後解壓縮到一個地方,路徑中不要出現中文,其路徑需要在下面axis的環境配置中用到。


我將mail.jar和 activation.jar放到了axis-1_4/lib下,這個在後面的環境變量配置中也要起到作用。


1.1下載途徑一:

http://download.csdn.net/detail/bestcxx/9611310

 

 

1.2下載途徑二:

·http://mirrors.hust.edu.cn/apache/axis/axis/java/1.4/

打開後選擇  axis-bin-1_4.tar.gz


此外還需要兩個常用的jar包,下載途徑一中包含了所有所需資源,但是如果你沒有下載權限也可以自己在網上找一下。

mail.jar和 activation.jar


2、環境變量配置

2.1 jdk環境變量配置,如果已經配置可以略過

參考:http://blog.csdn.net/bestcxx/article/details/52300559

2.2 axis1.4 環境變量配置

 

用戶變量和系統變量都要配置一下

·AXIS_HOME

AXIS_HOME    D:\axis-1_4        (注:這一條要根據你實際的路徑配置axis-1_4的位置)

 

·AXIS_LIB

AXIS_LIB       %AXIS_HOME%\lib

 

·AXISCLASSPATH

AXISCLASSPATH  %AXIS_LIB%\axis.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar

 

·classpath,這個在配置jdk的環境變量的時候已經配置了,但是那是jdk的,現在在後面追加AXISCLASSPATHmail.jaractivation.jar的路徑

 

classpath  .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%AXISCLASSPATH%;%AXIS_LIB%\activation.jar;%AXIS_LIB%\mail.jar;

 

檢查下:cmd  echo %AXIS_HOME% 等等,看配置的是否生效。


3、你一定安裝了tomcat服務器

D:\axis-1_4\webapps 下你會發現一個項目 axis ,將之複製到tomcatwebapps

目錄下(我的是D:\tomcat7\webapps,然後啓動服務器




4、Axis1.4 自帶的 axis項目訪問

Tomcat服務器啓動之後,在瀏覽器中訪問:

http://localhost:8080/axis/

顯示如下頁面說明系統部署正常,接下來我們將以這個axis項目爲中介逐步在一個獨立的項目中完成webservice服務的實現。


5、jws方式發佈 webservice服務

這種方式發佈webservice服務需要以axis這個項目爲載體。

大致的流程是,編寫一個沒有package包路徑的java文件,比如HelloJWS.java,然後直接重命名爲HelloJWS.jws

將這個文件複製到D:\tomcat7\webapps\axis 目錄下

內容如下(再強調一下,不能有package包路徑)

public class HelloJWS{

public String getSayHello(String name,int age){

return "Hello "+ name+",you are "+age+" years old.";

}

}

 

文件結構如下:


然後,服務器也不用重啓,直接在地址欄中訪問

http://localhost:8080/axis/HelloJWS.jws

你會看到


點擊 Click to see the WSDL , 看到下面的內容說明你的JWS式服務發佈成功了。

可以放大圖片查看基本含義。


6、調用已經發布的webservice 服務

有一種是直接在代碼中調用,還有一種是生成客戶端代碼,後者的優勢是可以調用的方法名可以直接通過IDE代碼提示獲知,前者則需要以String字符串的形式體現出來。

6.1 使用代碼調用發佈的webservice服務

[java] view plain copy
  1. import java.rmi.RemoteException;  
  2.   
  3. import javax.xml.namespace.QName;  
  4. import javax.xml.rpc.ServiceException;  
  5.   
  6. import localhost._8080.axis.hellows.HelloWSService;  
  7.   
  8. import org.apache.axis.client.Call;  
  9. import org.apache.axis.client.Service;  
  10.   
  11.   
  12.   
  13. public class WebserviceTestForHelloWS {  
  14.   
  15.     /** 
  16.      * @param args 
  17.      * @throws ServiceException  
  18.      * @throws RemoteException  
  19.      * @throws ServiceException  
  20.      * @throws RemoteException  
  21.      */  
  22.     public static void main(String[] args) throws RemoteException, ServiceException {  
  23.         // TODO Auto-generated method stub  
  24.         System.out.println(new WebserviceTestForHelloWS().firstwsmethod("Han MeiMei",20));  
  25.     }  
  26.   
  27.     public String firstwsmethod(String name,int age) throws ServiceException, RemoteException{  
  28.         String result=null;  
  29.           
  30.         //設置遠程訪問鏈接  
  31.         String url="http://localhost:8080/axis/HelloJWS.jws";  
  32.           
  33.         //獲取Service 對象-創建服務  
  34.         Service service=new Service();  
  35.           
  36.         //通過 Service 對象獲取遠程調用對象Call-創建調用句柄  
  37.         Call call=(Call) service.createCall();  
  38.           
  39.         //設置遠程調用樁-設置請求地址  
  40.         call.setTargetEndpointAddress(url);  
  41.           
  42.         //設置遠程操作方法名  
  43.          /** 
  44.          * 設置調用的方法和方法的命名空間; 
  45.          * 因爲這裏是手動發佈到webroot目錄下的,所以命名空間和請求地址一致 
  46.          * 當然null也可以,因爲本身它就沒有設置命名空間,一般方法的命名空間是 
  47.          * 包名倒寫組成,如com.hoo.service,ns=http://service.hoo.com 
  48.          *  getSayHello 是要調用的方法名     
  49.          */  
  50.         call.setOperationName(new QName(url,"getSayHello"));//寫成 (null,"getSayHello")也是可以的  
  51.           
  52.         //設置參數,執行遠程方法  
  53.         result=(String)call.invoke(new Object[]{name,age});  
  54.           
  55.         return result;  
  56.     }  
  57.       
  58. }  

6.2 生成webservice客戶端調用服務

首先,你需要一點點的DOS系統的操作知識(下面所有需要輸入的內容都僅含雙引號內的內容,此外注意空格的存在)。

打開cmd :即啓動dos系統。

打開盤符:比如D盤,輸入 “D:,然後按enter鍵。

打開某個文件:cd  文件名” ,這裏有個小竅門,比如有個文件叫filename ,輸入 “f”之後 按tab 鍵,系統會自動提示文件名全稱。

如果你想看當前目錄下有哪些文件,直接 輸入 “dir”, 然後按enter鍵。

返回上一層目錄: 輸入 “cd ..”。

 

DOS 操作的東西這麼點就夠了。

 

DOS中使用cd命令,打開HelloJWS.jws所在的文件夾,注意這一點十分重要

D:\tomcat7\webapps\axis>

然後輸入命令行,中間是個空格,第一部分是固定的,第二行是不是很熟悉?放到瀏覽器中看一下就知道了。

Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java

http://localhost:8080/axis/HelloJWS.jws?wsdl

 

可以使用複製粘貼來完成這個操作,之後按 enter 鍵,正常來說會看到下面的景象,就是什麼也沒有發生,事實上,打開下面的目錄,你會發現多出一個文件夾,這個文件夾可以加到你的其他java項目中,像調用一般類一樣調用你剛纔發佈的webservice方法。


先看下生成的文件夾:


看看裏面的結構

下面演示如何調用剛剛生成的webservice 客戶端代碼,當然,你需要有一個javaweb項目,還需要把axis這個項目中的jar包添加到這個項目的lib路徑中。

下面的例子將在myeclipse 中實現服務的調用過程。

新建一個web project ,然後把剛纔生成的客戶端的文件夾整個複製到src目錄下


然後,報錯了,別擔心,把jar包考到lib路徑下,或者直接設置路徑(建議這樣,節約存儲空間)


恢復正常


然後新建一個java測試類HelloJWSTest.java


HelloJWSTest.java代碼內容如下

[java] view plain copy
  1. package stu.test.demo;  
  2.   
  3. import java.rmi.RemoteException;  
  4.   
  5. import javax.xml.rpc.ServiceException;  
  6.   
  7. import org.junit.Test;  
  8.   
  9. import localhost.axis.HelloJWS_jws.HelloJWS;  
  10. import localhost.axis.HelloJWS_jws.HelloJWSService;  
  11. import localhost.axis.HelloJWS_jws.HelloJWSServiceLocator;  
  12.   
  13.   
  14. public class HelloJWSTest {  
  15.   
  16.     @Test  
  17.     public void testMethod() {  
  18.         try {  
  19.             //HelloJWSService 和HelloJWSServiceLocator(),要根據你客戶端的實際值進行更改  
  20.             HelloJWSService hellojwss=new HelloJWSServiceLocator();  
  21.             //HelloJWS要根據你的客戶端的實際值進行更改  
  22.             HelloJWS hellojws=hellojwss.getHelloJWS();  
  23.             String result=hellojws.getSayHello("Jecket"20);  
  24.             System.out.println("調用url返回的結果爲:"+result);  
  25.         } catch (ServiceException e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         } catch (RemoteException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }  
  32.   
  33.     }  
  34.       
  35. }  

運行結果如下


運行正常,但是提示有個class文件無法解析,我們把mail.jar也加入到路徑中,或者拷貝到本項目的lib包中,再次運行測試方法shift+alt+d+t,就完全正常了。


爲了之後不再出現其他問題,順便把activation.jar 也加入到路徑中。



6.3然後介紹一下使用eclipse這個IDE自動生成客戶端的方法





完成


延伸,可能我測試環境和生產環境的url是不同的,客戶端應該更自由些

回到myeclipse的項目中

HelloJWSServiceLocator.java

添加一個帶參數的構造方法

[java] view plain copy
  1. public HelloJWSServiceLocator() {  
  2.     }  
  3.       
  4.     public HelloJWSServiceLocator(String HelloJWS_address) {  
  5.         this.HelloJWS_address=HelloJWS_address;  
  6. }  
  7.   
  8. 然後就可以自由的更改wsdl的參數了。  
  9. @Test  
  10.     public void testMethod() {  
  11.         try {  
  12.             //HelloJWSService 和HelloJWSServiceLocator(),要根據你客戶端的實際值進行更改  
  13.             HelloJWSService hellojwss=new HelloJWSServiceLocator("http://localhost:8080/axis/HelloJWS.jws");  
  14.             //HelloJWS要根據你的客戶端的實際值進行更改  
  15.             HelloJWS hellojws=hellojwss.getHelloJWS();  
  16.             String result=hellojws.getSayHello("Jecket"20);  
  17.             System.out.println("調用url返回的結果爲:"+result);  
  18.         } catch (ServiceException e) {  
  19.             // TODO Auto-generated catch block  
  20.             e.printStackTrace();  
  21.         } catch (RemoteException e) {  
  22.             // TODO Auto-generated catch block  
  23.             e.printStackTrace();  
  24.         }  
  25.   
  26.     }  

7、WSDD發佈webservice

在使用JWS發佈webservice服務的時候,儘管我們再axis這個項目中添加了一項服務,但是去訪問http://localhost:8080/axis/servlet/AxisServlet的時候,並不能發現我們剛纔發佈的服務,反過來說,我們把HelloJWS.jws這個文件的存在是不可知的,如果我們添加一個服務就可以通過http://localhost:8080/axis/servlet/AxisServlet來看到,移除這個服務這裏就減少,顯然這樣更加有利於我們對項目的管理。所以,就涉及到另一種更爲複雜也更爲常用的webservice服務的發佈方式,WSDD式的發佈。

我們還是在helloworld項目中進行操作,不同的是這次我們將允許package包的存在。

這個服務將先被添加到axis 項目中,然後最終會直接在helloworld 項目中被訪問。

新建java文件,HelloWSDD.java


HelloWSDD.java的內容如下,將提供webservice的對外發布的方法:

[java] view plain copy
  1. package src.test.demo;  
  2.   
  3. public class HelloWSDD {  
  4.     public String getUser(String name,int age){  
  5.         return "Hello "+name+", you are "+age+" years old.";  
  6.     }  
  7. }  

然後啓動一下項目,實質上是編譯一下項目,獲取class文件


複製 stu這個文件夾到D:\tomcat7\webapps\axis\WEB-INF\classes


然後編寫兩文件,分別爲deploy.wsddundeploy.wsdd,當然名字不是固定的,你可以自定義。

deploy.wsdd的內容如下

[html] view plain copy
  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. <service name="HelloWSDD" provider="java:RPC">  
  5. <!-- * stu.test.demo.HelloWSDD 具體到類路徑 -->  
  6.         <parameter name="className" value="stu.test.demo.HelloWSDD" />  
  7.         <!-- * 代表所有的方法都暴露 -->  
  8.         <parameter name="allowedMethods" value="*" />  
  9.         <parameter name="scope" value="request" />  
  10.     </service>  
  11. </deployment>  


undeploy.wsdd的內容如下(注意servicename就是deploy.wsdd中設定的內容)

[html] view plain copy
  1. <undeployment xmlns="http://xml.apache.org/axis/wsdd/">  
  2.     <service name="HelloWSDD"/>  
  3. </undeployment>  


編寫完畢後將這兩個文件複製到D:\tomcat7\webapps\axis\WEB-INF

然後訪問一下http://localhost:8080/axis/servlet/AxisServlet

 

如圖

然後在DOS中操作

打開axisWEB-INF(D:\tomcat7\webapps\axis\WEB-INF)

輸入

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://localhost:8080/axis/services/HelloWSDD  deploy.wsdd

 

爲了防止報錯,mail.jar 和 activation.jar  複製 axis這個項目下的lib文件夾下

enter

運行結果如下:



然後看下路徑D:\tomcat7\webapps\axis\WEB-INF

多了一個文件server-config.wsdd 說明成功了。

然後再次訪問一下鏈接http://localhost:8080/axis/servlet/AxisServlet

多了一個服務有木有,說明WSDD發佈成功了,點進去看看,訪問的方法前面已經說過,自己訪問看看吧

然後再次回到DOS窗口

D:\tomcat7\webapps\axis\WEB-INF>

輸入下面的命令行

java org.apache.axis.client.AdminClient undeploy.wsdd

enter 

然後再次訪問一下鏈接

http://localhost:8080/axis/servlet/AxisServlet

剛纔WSDD發佈的服務HelloWSDD已經從列表中去掉了


8、在自己的項目中使用WSDD方式發佈webservice服務

我們已經在axis項目中實現了以jws方式和wsdd方式發佈簡單的webservice服務,下面將演示如何在我們自己的項目中以wsdd方式發佈webservice服務(jws式的就不實用了)。

首先在我們自己的項目中引入足夠的jar


然後把剛纔的兩個文件 deploy.wsdd 和 undeploy.wsdd複製到項目helloworldWEB-INF文件夾中


然後需要對web.xml 的內容做出處理

如果你還記得axis 這個項目,把他的web.xml文件找出來,複製裏面的內容,替換掉helloworldweb.xml (頭部可以保留編碼格式<?xml version="1.0" encoding="UTF-8"?>,內部的AdminServlet可以註釋掉,儘管沒有啥影響)

 

然後啓動項目(如果你不想程序報錯,就把剛纔爲訪問axis項目而啓動的tomcat服務器關閉掉,然後再去啓動項目,我是在myeclipse中直接啓動的,而且我myeclipsetomcat端口是8085


我們再次來到DOS環境,不過這次需要打開的是helloworldWEB-INF,我們需要deploy.wsddundeploy.wsdd


輸入剛纔一模一樣的命令,噢,不 ,你現在的項目是helloworld,不是axis,而且要注意你的端口號是不是8080,我的測試環境端口是8085

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://localhost:8085/helloworld/services/HelloWSDD  deploy.wsdd



然後訪問http://localhost:8085/helloworld/servlet/AxisServlet

點進去


然後是去掉剛纔添加的wsdd服務

,回到DOS環境

輸入命令

java org.apache.axis.client.AdminClient undeploy.wsdd

如果是這個項目是發佈在axis這個項目中的話,這個命令是OK的,但是如果失敗了,也不要擔心,換成下面的命令試試

java org.apache.axis.client.AdminClient undeploy.wsdd -l http://localhost:8085/helloworld/servlet/AxisServlet undeploy.wsdd


再次訪問http://localhost:8085/helloworld/servlet/AxisServlet

服務成功去除了

9、常見問題解決

9.1 jar包錯誤

解決辦法是把必須的那幾個jar包添加到路徑中。


9.2 jws發佈失敗

看看是不是文件內部有 package com.demo.test 類似的,jws 發佈是不允許有包路徑的。

9.3wsdd 找不到wsdd路徑

在你DOS當前路徑下輸入 “dir+enter鍵,看是否有wsdd文件,如果沒有wsdd文件就再看下DOS中打開文件夾的教程,否則就去除路徑中的中文試一下。

9.4 404等錯誤

看你的環境是否啓動了服務器,服務器中是否有要訪問的項目,訪問路徑是否正確,端口號是否正確。



10、wsdd命令的作用是什麼?如何在使 項目名.war 具備可訪問的webservice服務——直接編輯server-config.wsdd文件

作用是在與wsdd通路徑下產生一個server-config.wsdd文件,我們添加wsdd服務或者去除wsdd服務本質上都是對這個文件內容的修改



但是需要注意的是,這個文件默認是不存在的,而且,即便是在ide環境中調用了tomcat可以訪問wsdd發佈的服務,在直接導出的項目名.war中也不包含這個文件。

也就是說:如果想要生成的項目名.war 在tomcat中發佈後可以被訪問到webservice服務,必須在項目的sources目錄下增加server-config.wsdd文件

技巧就是,直接把tomcat中使用wsdd命令自動生成的server-config.wsdd複製到當前的目錄下,或者在生產環境運行wsdd發佈服務命令。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章