持之以恒

          記錄本
          posts - 4, comments - 32, trackbacks - 0, articles - 74
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
           因?yàn)楣ぷ麝P(guān)系需要從事Webservice的開(kāi)發(fā)工作,公司的webserivce是由Apache的AXIS來(lái)實(shí)現(xiàn)的,以前對(duì)這個(gè)了解不算多,不過(guò)經(jīng)過(guò)幾天的研究,特奉上小小的心得一篇。

          先介紹下本人開(kāi)發(fā)環(huán)境吧。 JDK 1.4.2 + Myeclipse 6.0(實(shí)在經(jīng)不起誘惑,嘗嘗鮮) + Tomcat 5.0.28 + AXIS 1.4。 AXIS 1.4包可以在http://ws.apache.org/axis/ 找到。 假設(shè)所有的環(huán)境你已經(jīng)搭好,并且AXIS包也已經(jīng)下好了。OK, Here we go~

          解壓axis-bin-1_4.zip這個(gè)包可以看到webapps目錄,雙擊進(jìn)入把里面的AXIS文件夾拷到 %TOMCAT_HOME%\webapps目錄下,之后拷貝activation.jar、mail.jar、tools.jar到%TOMCAT_HOME%\webapps\axis\WEB-INF\lib目錄下。啟動(dòng)tomcat,訪(fǎng)問(wèn)http://localhost:8080/axis/happyaxis.jsp 如果訪(fǎng)問(wèn)成功,恭喜你!基本的配置你已經(jīng)做完了。

          PS:此處的%TOMCAT_HOME%指的是Tomcat的安裝目錄,至于那另外的三個(gè)jar包,J2EE 1.4庫(kù)里就能找的到。

          現(xiàn)在來(lái)說(shuō)一下最關(guān)鍵的Webservice的發(fā)布。AXIS提供了兩種發(fā)布方式,一種是即時(shí)發(fā)布(Instant Deployment),另外一種是定制發(fā)布(Custom Deployment)。即時(shí)發(fā)布提供了一種非常簡(jiǎn)單的webservice的發(fā)布方式,但是其中限制太多,因此在實(shí)際的開(kāi)發(fā)中定制發(fā)布才是首選。這里也將會(huì)以定制發(fā)布為重點(diǎn)來(lái)介紹。

          1.即時(shí)發(fā)布 JWS (Java Web Service) Files - Instant Deployment

          即時(shí)發(fā)布提供了一種非常簡(jiǎn)單發(fā)布方式,發(fā)布者只要有Java源代碼(也就是.java文件),然后把其后綴名改成jws(也就是 java web service的縮寫(xiě))拷貝到%TOMCAT_HOME%\webapps\axis目錄下即完成了所有的發(fā)布工作。AXIS的編譯引擎會(huì)處理接下來(lái)的所有事情。下面是一段示例代碼:

          java 代碼
          1. public class HelloAXIS {
          2. public String Hello(String name){
          3. return "AXIS say hello to " + name;
          4. }
          5. }

          把 HelloAXIS.java 文件改成 HelloAXIS.jws 然后拷貝到%TOMCAT_HOME%\webapps\axis目錄下,啟動(dòng)Tomcat之后訪(fǎng)問(wèn) http://localhost:8080/axis/HelloAXIS.jws 如果能看到 Click to see the WSDL這個(gè)超鏈接就說(shuō)明已經(jīng)發(fā)布成功了,點(diǎn)擊進(jìn)去就可以看到這個(gè)Webservice的WSDL描述文件。server端的發(fā)布已經(jīng)完成了,接下來(lái)就是編寫(xiě)Client端測(cè)試代碼了。

          java 代碼
          1. package com.chnic.test;
          2. import java.net.URL;
          3. import javax.xml.namespace.QName;
          4. import org.apache.axis.client.Call;
          5. import org.apache.axis.client.Service;
          6. public class Test {
          7. public static void main(String[] args) throws Exception{
          8. String targetEendPoint = "http://localhost:8080/axis/HelloAXIS.jws" ;
          9. Service service = new Service();
          10. Call call = (Call) service.createCall();
          11. call.setOperationName( new QName(targetEendPoint, "Hello" ));
          12. call.setTargetEndpointAddress( new URL(targetEendPoint));
          13. String result = (String) call.invoke( new Object[]{ "Robert" });
          14. System.out.println(result);
          15. }
          16. }

          測(cè)試代碼很簡(jiǎn)單,如果熟悉java反射機(jī)制的朋友不用兩分鐘就能看明白。運(yùn)行后客戶(hù)端控制臺(tái)出現(xiàn) AXIS say hello Robert。測(cè)試成功。果然很簡(jiǎn)單吧。不過(guò)在這簡(jiǎn)單背后卻是以犧牲靈活性為代價(jià)的。假如你現(xiàn)在手里只有.class 或者一個(gè)jar包,jws就不再能滿(mǎn)足你的需求了,最要命的就是即時(shí)發(fā)布不支持帶包的類(lèi),這點(diǎn)AXIS的用戶(hù)手冊(cè)上寫(xiě)的也很明白。

          Important: JWS web services are intended for simple web services. You cannot use packages in the pages, and as the code is compiled at run time you can not find out about errors until after deployment. Production quality web services should use Java classes with custom deployment.

           

          2.定制發(fā)布 Custom Deployment - Introducing WSDD

          比起即時(shí)發(fā)布定制發(fā)布更加煩瑣也更復(fù)雜,但是換來(lái)的卻是更大的靈活性,因此在實(shí)際項(xiàng)目中定制發(fā)布還是不二的選擇。定制發(fā)布需要你自己編寫(xiě)一個(gè)WSDD(Web Service Deployment Descriptor)文件,這個(gè)東東類(lèi)似與XML稍后會(huì)做出介紹。廢話(huà)不多說(shuō),我們來(lái)看代碼:

          java 代碼
          1. package com.chnic.webservice;
          2. public class HelloWorld {
          3. public HelloWorld(){
          4. }
          5. public String hello(String str){
          6. return "Hello " + str;
          7. }
          8. public int add( int a, int b){
          9. return a + b;
          10. }
          11. }

          一個(gè)帶包的很簡(jiǎn)單的類(lèi),在eclipse下編譯后按照包名拷到 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes 目錄下。以這個(gè)類(lèi)為例,拷貝完之后這個(gè)HelloWorld.class的路徑就是 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes\com\chnic\webservice。PS: 如果嫌這樣太麻煩,可以另外建一個(gè)Java Web工程用myeclipse的發(fā)布工具發(fā)布到Tomcat之后,整體一次性拷貝到websericve的工程中。

          接下來(lái)就需要編寫(xiě)發(fā)布文件deploy.wsdd。到%TOMCAT_HOME%\webapps\axis\WEB-INF 目錄下建立這個(gè)文件并在其中添加如下內(nèi)容:

          xml 代碼
          1. < deployment xmlns = http://xml.apache.org/axis/wsdd/
          2. xmlns:java = "http://xml.apache.org/axis/wsdd/providers/java" >
          3. < service name = "HelloWorld" provider = "java:RPC" >
          4. < parameter name = "className" value = "com.chnic.webservice.HelloWorld" />
          5. < parameter name = "allowedMethods" value = "*" />
          6. </ service >
          7. </ deployment >

          簡(jiǎn)單的介紹下各個(gè)節(jié)點(diǎn)的含義,"HelloWorld"當(dāng)然是這個(gè)webservice的名字,后面緊跟的java:RPC指的是服務(wù)類(lèi)型。這里一共有有4種類(lèi)型,分別是:RPC, Document, Wrapped 和 Message。有興趣可以看下 org.apache.axis.providers這個(gè)包和子包下面的類(lèi)的API文檔。之后的parameter節(jié)點(diǎn)第一個(gè)當(dāng)然是指出具體的類(lèi),第二個(gè)從字面上也很好理解:允許調(diào)用的方法。這里的配置告訴引擎可以調(diào)用所有的public方法,當(dāng)然你也可以自己指定。

          編寫(xiě)完配置發(fā)布文件之后,cmd打開(kāi)windows的控制臺(tái),進(jìn)入%TOMCAT_HOME%\webapps\axis\WEB-INF目錄下鍵入如下命令

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

          之后控制臺(tái)返回Processing file deploy.wsdd 和 Done processing 這兩段話(huà)即說(shuō)明發(fā)布成功。(此時(shí)會(huì)在同級(jí)目錄生成一個(gè)server-config.wsdd文件 )在這里的AdminClient是AXIS提供的一個(gè)客戶(hù)端管理工具。至于java.ext.dirs的含義可以去了解一下classloader和JVM類(lèi)裝載機(jī)制方面的知識(shí),在這里就不多解釋。 還有一點(diǎn)要注意的是在發(fā)布的時(shí)候Tomcat服務(wù)必須處于啟動(dòng)狀態(tài),否則就會(huì)拋出一堆無(wú)法連接的異常信息。發(fā)布成功之后你可以通過(guò)訪(fǎng)問(wèn) http://localhost:8080/axis/servlet/AxisServlet 來(lái)查看你所有的定制發(fā)布的服務(wù)。

          客戶(hù)端測(cè)試代碼
          1. String targetEendPoint = "http://localhost:8080/axis/services/HelloWorld" ;
          2. Service service = new Service();
          3. Call call = (Call) service.createCall();
          4. call.setTargetEndpointAddress( new URL(targetEendPoint));
          5. call.setOperationName( new QName(targetEendPoint, "hello" ));
          6. String result = (String) call.invoke( new Object[]{ "Robert" });
          7. System.out.println(result);
          8. call.setOperationName( new QName(targetEendPoint, "add" ));
          9. Integer res = (Integer) call.invoke( new Object[]{ new Integer( 1 ), new Integer( 2 )});
          10. System.out.println( "The result is: " + res);

          運(yùn)行測(cè)試代碼,控制臺(tái)顯示 Hello Robert 和 The result is: 3 這兩句話(huà),說(shuō)明發(fā)布成功。仔細(xì)觀(guān)察下發(fā)現(xiàn)其實(shí)除了那個(gè)targetEndpoint 之外,即時(shí)發(fā)布和定制發(fā)布的客戶(hù)端調(diào)用代碼基本上都是一樣的。定制發(fā)布的URL可以在WSDL文件里找到。 其實(shí)定制發(fā)布還有一些高級(jí)特性,這個(gè)就留到下一篇再說(shuō)吧。



          小白

          評(píng)論

          # re: 轉(zhuǎn)---------利用AXIS開(kāi)發(fā)Webservice(一) —— 如何發(fā)布自己的webservice (目的:學(xué)習(xí))[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-10-30 14:29 by 1
          1

          # re: 轉(zhuǎn)---------利用AXIS開(kāi)發(fā)Webservice(一) —— 如何發(fā)布自己的webservice (目的:學(xué)習(xí))[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-10-30 14:30 by 1
          沒(méi)懂
          主站蜘蛛池模板: 昔阳县| 绥棱县| 陆良县| 波密县| 房山区| 合水县| 绍兴县| 巩义市| 镇康县| 旬阳县| 华蓥市| 仲巴县| 大竹县| 平舆县| 大余县| 洮南市| 承德市| 隆子县| 宜昌市| 尚志市| 银川市| 辉县市| 康保县| 渝中区| 光泽县| 桃园县| 嘉祥县| 梅河口市| 丘北县| 江都市| 罗江县| 怀仁县| 龙口市| 南澳县| 江孜县| 从江县| 龙里县| 甘洛县| 日土县| 奉化市| 方城县|