java webservice開發入門之二

shwenwen發表於2011-04-11
用Java 開發 WebService Axis簡單例項
在開發之前, 先了解一下AXIS,axis目前出現的2版本以其靈活性,快速開發工具的整合高於xfire而使用者居其上.用Eclipse開發,一開始就會想到xfire,它是整合與Eclipse的.所以
開發起來非常方便,現在我們來看看axis的開發是怎麼樣的? 看完本文後,你可以相互比較一下xfire與它的差別.[@more@]


首先,建立axis環境 .(注:我事先說明.這是對此版本的基本功能與簡單例項的描術)

本人的開發環境eclipse3.2 ,tomcat5.0.28 ,jdk1.4 axis_1.4目前最新版
這裡主要講一下webservice的一個開發過程,
1. 下載axis1.4最新版本
2. 將解壓後的axis-1_4檔案下的webapps目錄下的axis目錄考到
%TOMCAT_HOME%Webapps/目錄下
3. 啟動tomcat的.輸入路徑 - 開啟axis主介面
4. 點選頁面上的Validation ->檢視一下你的axis 是否新增了完整的jar檔案,注意,這
裡要仔細看一下,自已少了什麼 樣的 jar檔案,有時缺少了檔案axis將無法正常工
作.補充一下:這裡的xmlsec.jar檔案如果缺少的話. 可以到這裡
下載 http://xml.apache.org/security/dist/java-library/ c++的與java兩個目錄.
下載後把xmlsec-1.4.0.jar考到axis的lib目錄下.
上面的步驟如果進行正常將會在Validation頁面中就看不到有Error與Warning的
資訊.好了,接下來我們開始編寫程式碼
Axis支援三種web service的部署和開發,分別為:
1、Dynamic Invocation Interface ( DII)
2、Stubs方式
3、Dynamic Proxy方式
這裡主要講一下我的開發過程,透過這樣過程,你也將初步的掌握axis 開發Webservice
的整體過程.
第一種Dynamic Invocation InterFace(DII) 開發方式
步驟1:開啟eclipse建立一個新專案編寫一個類.程式碼如下:
public class SayHello {//這個類沒有包,注意了.
public String say(String name){
return " Hello ~~" + name;
}
}
步驟2:
編寫好上面的類(SayHello.java)後,將原始碼copy到%tomcat_home%webapps
/axis/目錄下.這裡要注意了,只需要把類考備到這個目錄下
,然後重新命名為:SayHello.jws
步驟3:
開啟你的瀏覽器: 開啟頁面後你會看到
Click to see the WSDL 包的話,那麼就生成了wsdl了.
恭喜你!到這裡DII方式的伺服器端編寫完成了.接下來我們來看一下客戶端是怎麼調
用的
步驟4:DII方式的客戶端的呼叫.
首先將axis/web-inf/lib/目錄下的axis.jar,commons-discovery-0.2.jar,
comm.ons-logging-1.0.4.jar匯入到剛才的專案中,因為編寫客戶端時
要用到這些包.客戶端程式碼如下:
package com.huwd.web;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class ToClient {
public static void main(String args[]) throws Exception {

String urlname = "";
//這是wsdl的絕對路徑.也可以直接寫成如下 ,這個沒有區別.
//String urlname=”?wsdl”
Service s = new Service();

Call call = (Call)s.createCall();

call.setOperationName("say");//注意。這裡是要呼叫的方法名

call.setTargetEndpointAddress(urlname);//設定呼叫的目標url

String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"}); //設定呼叫方法中的引數

System.out.println("這是webservice伺服器返回給你的:>>>>"+val);

}
}
執行結果輸出:Hello ~~我是Blue’s Boy;
到此DII呼叫方式完成!接下來要講的是第二種方式的呼叫.請繼續學習第二種方式
第二種:Stubs 開發方式(stubs 故名思意,存根的方式)
Stubs 方式相對要複雜一點.不過如果學會了這種方式,嘿嘿,那你開發的時候
 就會明顯比第一種方式快了,接下來,跟我一起學吧.
步驟1:
建立環境變數,設定AXIS的環境變數.
這種方式的編碼,先要設定一下命令列的環境.右鍵我的電腦――>屬性――>
選擇高階選項卡――>新建使用者變數――>輸入使用者變數如下:
變數名:AXIS_LIB
變數值: E:tomcat5.28Tomcat 5.0webappsaxisWEB-INFlib(這是本人的)
變數名:CLASSPATH
變數值: .;%AXIS_LIB%axis.jar;
%AXIS_LIB%activation.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%mail.jar;
%AXIS_LIB%saaj.jar;
%AXIS_LIB%wsdl4j-1.5.1.jar;
%AXIS_LIB%xmlsec-1.4.0.jar;
%AXIS_LIB%dom4j-1.6.1.jar;
變數名:AXIS_HOME
變數值:E:tomcat5.28Tomcat 5.0webappsaxis
新建好上述的三個變數後.確定退出.
步驟2:
編碼開始!這裡要稍講得詳細並複雜一點了,我們上面看到了,只設定了一個普通
的引數,這裡我就寫一下自定義資料型別引數的傳遞.網上很多文章只講到了
普通資料型別做引數傳遞.
 伺服器端的編寫,程式碼與註釋如下:
 首先定義自定義引數類(第一個類)
package com.web.test;

publicclass UserBean {//自定義資料型別.
//很簡單,只有一個String 與int 型
private String name="";
privateint age ;
publicint getAge() {
returnage;
}

publicvoid setAge(int age) {
this.age = age;
}

public String getName() {
returnname;
}

publicvoid setName(String name) {
this.name = name;
}

}
其次編寫第二個類Webservice伺服器端類
package com.web.test;

publicclass Server {//伺服器端
//服務端,傳遞的是一個自定義的資料型別. UserBean
public String getBeanStr(UserBean bean){
return"You Name:"+bean.getName() +
" , You Age:" + bean.getAge();
}
}
最後編寫一個deploy.wsdd檔案如下:
xmlns:java="">


客戶端只能呼叫其中一個方法時,value值改為方法名就可以了.

在要網路上傳遞,那就一定得讓他序列化. --&gt
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle=
qname="ns1:user"
   <!――序列化類配置――>
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
type="java:com.web.test.UserBean"
xmlns:ns1="urn:BeanService"
/>


到這一步,我們的服務端配置完成,整理一下思路,stubs方式呼叫需要
(這裡主要是為了講述自定義類的對像傳遞)
    1.一個自定義類.2,一個服務端類,3.一個wsdd檔案服務描術符.OK接著看.
將上面寫好的兩個類的class檔案複製到/axis/web-inf/class目錄下,只要把整個包複製過來就
行了,然後在把deploy.wsdd檔案複製到/axis/web-inf/目錄下.
開啟控制檯進入你的axis目錄:
>cd E:tomcat5.28Tomcat 5.0webappsaxisWEB-INF (我的目錄)
>java org.apache.axis.client.AdminClient
–l deploy.wsdd
(說明: stubs就是剛才我們在deploy.wsdd檔案裡配置的這裡是關鍵.這個命令就是釋出這個服務.你只需這樣理解它.釋出成功後,你在看下你的
Axis/web-inf/目錄下,多了一個server-config.wsdd檔案,你可開啟它看下里成的描述符
是不是跟我們寫的deploy.wsdd相類似呢?
如果釋出失敗,那麼在控制檯下你將會看到一些錯誤資訊,並仔細的解決它.
(注:一般錯誤的原因有這麼幾點,我個人在開發學習時,可能是類路徑沒有寫對,也
可能是你的也有可能是你的wsdd檔案裡面寫得不規範,最後可能就是你的命令無效,
ClassNotFoundException 錯誤,這個錯誤是因為你沒有配置好axis的環境造
成的.)
釋出成功後在控制檯下會有提示:
Processing file deploy.wsdd
Done processing
OK當您釋出成功後.可以開始往下寫了.
步驟3:
嘿.完成了上面兩個步驟,接下來的工作就是很輕鬆的了,我們來生成一個客戶端
>cd E:tomcat5.28Tomcat 5.0webappsaxisWEB-INF (我的目錄)控制檯命令
>java org.apache.axis.wsdl.WSDL2Java –p client
services/stubs?wsdl
開啟axis/web-inf/目錄下可以看到生成了一個client目錄,OK,複製client目錄,到你
的專案中.這個client就是我們的客戶端程式碼了.
Client目錄生成了:
Server.java
ServerService.java
ServerServiceLocator.java
StubsSoapBindingStub.java
User.java
java檔案;
接下來的工作就是編寫一個呼叫類測試.程式碼與註釋如下

package myclient;

import java.net.URL;

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;

publicclass Test {

publicstaticvoid main(String []args) throws Exception {

QName qname = new QName("urn:BeanService","user");

Service s = new Service();

Call call = (Call)s.createCall();
//註冊這個bean為可序列化的.傳遞引數
call.registerTypeMapping(User.class, qname, new BeanSerializerFactory(User.class,qname), new BeanDeserializerFactory(User.class,qname));

//設定一下呼叫方法名.不設定肯定會報錯的哦
call.setOperationName("getBeanStr");

//設定一下這個服務的絕對路徑.
call.setTargetEndpointAddress(new URL(""));

//例項化一個User,這個User是生成出來的User哦.,不是原先那個,
User u = new User();

u.setAge(23);

u.setName("do WebService!");
//通知方法,並返回結果
String str = (String)call.invoke(new Object[]{u});

System.out.println(str);

//out.print ==> You Name:do WebService! , You Age:23
}
}
好了,這下完成了stubs的方式.看起來很累,其實當你開發第二個例子的時候
就不會這麼累了.我已經滿頭大汗了,公司沒開空調.

接下來就是第三種方式了,其實第三種方式更簡單了,我這裡還是稍微講一下:
第三種: Dynamic Proxy方式 (代理方式)
這個例子就以第一種方式為基礎,因這服務端類的編寫是一樣的.
那麼服務端類就是第一種方式的類了,(完成第一種方式的3個步驟)
主要講一下客戶端透過代理介面的方式呼叫.

介面這義
import java.rmi.Remote;
import java.rmi.RemoteException;
publicinterface SayHelloInter extends Remote{
public String say(String name) throws RemoteException;
}

//客戶端的呼叫類如下:
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;


publicclass Test2 {

publicstaticvoid main(String []args) throws Exception{

String wsdlname = "";
//服務路徑
String namespaceUrl = "http:// localhost:8080/axis/SayHello.jws";

//服務名
String serviceName = "SayHelloService";
//服務
String portName = "SayHello";

//建立代理對像
ServiceFactory service = ServiceFactory.newInstance();

//建立遠端服務
Service s = service.createService(new URL(wsdlname), new QName(namespaceUrl,serviceName));

//向上轉型為介面
AxisWebInter inter = (AxisWebInter)s.getPort(new QName(namespaceUrl,portName), AxisWebInter.class
);

System.out.println(inter.getName("Blue boy!"));
}
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/143526/viewspace-1048511/,如需轉載,請註明出處,否則將追究法律責任。

相關文章