java生成客戶端代碼
摘要
本文解釋了如何利用庫用Java語言編寫FTP客戶端代碼。它比較了FTP庫的一個完全列表,演示了每個庫的優點和缺點,並且幫助決策者為他們的需要選擇適當的庫。另外,本文闡述了Fa?ade模式如何在取代一個庫時改變管理。最後,作者Jean-Pierre Norguet討論並解決了由於缺乏權威性的說明書引起的一些問題。
讓我們假設一個情景:我們要編寫一個純Java應用程序,該程序必須從運行FTP伺服器的遠程計算機上下載文件。我們也通過遠程文件信息,像名字、日期、或者尺寸,來過濾下載。
自己來寫一個FTP協議處理,盡管是有可能,並且可能很有趣。但是這樣做也有可能有困難、花費長時間、並且有潛在的風險。既然我們不肯花費時間、精力、或者金錢自己來寫一個處理器,那我們推薦使用一個可重用的現有的軟體組件。萬維網上有並且大量的庫可供使用。有了一個FTP客戶端庫,下載一個文件用Java語言編寫就像下面一樣簡單:
FTPClient ftpClient = new FTPClient();
ftpClient.connect("ftp.foo.com", "user01", "pass1234");
ftpClient.download("C:\\Temp\\", "README.txt");
// Eventually other operations here ...
ftpClient.disconnect();
尋找一個適合我們需要的高質量的Java FTP客戶端庫並不像他看起來那麼簡單;它可能相當困難。要找到一個Java FTP客戶端庫需要花一些時間。接著,在我們找到所有的已存在的庫之後,我們選哪個?每個庫適合不同的需要。庫在質量上是不等的,並且它們的設計有本質的區別。每個提供一套不同的屬性和使用不同類型的行話來描述他們。
因此,計算和比較FTP客戶端庫證明是困難而且令人迷惑的。重復使用已存在的組件是一個值得推薦的過程,但在這個例子中,啟動它也是令人沮喪的。並且這有點羞愧:在選好的一個好的FTP庫之後,剩下的工作就是常式了。
本文旨在使選擇過程簡短、容易、並且有價值。我首先列出了所有的FTP客戶端庫。接著,我定義和描述了庫應該用某種方式找到的相關標準的一個表格。最後,我列出了一個總瀏覽的矩陣,該矩陣給出了庫間相互比較的過程的快速瀏覽。所有的信息提供了我們作出一個迅速、可靠、和長期的決定所需的每件事。
使用JDK(Java 開發工具集)的FTP支持
用於FTP的訪問規范是用於注釋的請求:959(RFC959)。Sun Microsystems提供了JDK的一個RFC959執行。但是它是內部的、非文檔化的、並且不提供任何資源。當RFC959在尚未公開時,它實際上是執行RFC1738、URL規范的一個公共界面的後終端。如圖1。
圖1. 使用JDK的FTP支持。
RFC1738的一個執行過程在JDK中作為標准給出。它為基本的FTP傳送做一個可推理的工作。它是公共的、文檔化的、並且提供源代碼。要使用它,我們可編寫下面語句:
URL url = new URL("ftp://user01:[email protected]/README.txt;type=i");
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream(); // To download
OutputStream os = urlc.getOutputStream(); // To upload
使用JDK的FTP客戶端嚴格的遵守標准推薦,但它有以下幾個說明:
它從根本上區別於第三方的FTP客戶端庫;這些執行RFC959而不是RFC1738
RFC959用大多數的桌面FTP客戶端工具執行。許多Java程序員使用這些工具連接到FTP伺服器上。作為一個嘗試,這些工具及有可能優先於類似的RFC959庫。
URL 和URLConnection類只開放用於通訊的流。Sun庫不為構造原始的FTP伺服器響應成為像String、 File、 RemoteFile、 或者 Calendar之類的更合用的Java對象而提供直接支持。所以我們不得不編寫更多的代碼,只是為了把數據寫入一個文件中或者開始一個目錄列表。
正像RFC1738的3.2部分解釋的一樣,"最優化",FTP URL在每個操作後要求關閉(控制)連接。這對於傳送許多小文件是一種浪費、並且毫無效率。而且,作了特別限制FTP伺服器可能把會這樣一個通訊開銷認為一個是惡毒的網路攻擊或者濫用而拒絕提供進一步的服務。
最後,它缺乏幾個有用的屬性。
由於以上所有或者某種原因,可優先使用一個第三方的庫。下面部分列出了可供選擇的第三方的庫。
見:http://www.javaworld.com/javaworld/jw-04-2003/ftp/jw-0404-ftptable.html
2. 如何用axis的WSDL2Java生成webservice介面的客戶端的java代碼
你可以試試直接選擇「import as web service」這個向導,看能不能把web mole弄出來
你可以試試JB9開發,我在JB9上試過,可以完全使用向導開發的web service(不過還是有點小問題:新增一個web service會覆蓋以前的web service;JB9向導生成的WSDL文件竟然不符合w3c的標准)
就不要使用JB2006開發web service,現在AXIS2.0都已經出來了,比1.2的強大不少。你到apache網站上下載新版本,按照axis的user guide文檔就可以在純文本編輯工具下實現web service
通過JBuilder向導開發的web service在你完成開發後也許你仍然不知道web service的工作流程,不利於自己的水平提高。建議使用純文本編輯工具,配合ANT整合開發web service。
3. cxf wsdl2java命令生成客戶端java類,怎麼設置超時時間
可能是wsdl2java命令沒有生成超時的代碼,具體需要研究下生成代碼的wsdl2java的工作原理,我一般都是手動設置超時時間
Service
service
=
new
Service();
Call
call
=
(Call)
service.createCall();
call.
setTimeout
(1000*60*15);
//設置超時時間
15分鍾
4. 怎麼用java編寫簡單客戶端程序
我這里有一個例子希望能夠幫助你
public class Client{
private Socket socket;
try{
Socket socket=new Socket ("localhoast',8088);
ip=InetAddress.getLocalHost();
String localip=ip.getHostAddress();
System.out.println(localip);
String name=ip.getHostName();
System.out.println(name);
}
catch(Exception e){
}
public void start(){
try{
Run r2=new Run();
Thread t1=new Thread(r2);
t1.setDaemon(true);
t1.start();
Scanner sc=new Scanner(System.in);
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
PrintWriter writer=new PrintWriter(osw,true);
while(true){
writer.println(sc.nextLine());
}
}catch(Exception e){
}
}
public static void main(String args[]){
Client client=new Client();
client.start();
}
class Run implements Runnable{
public void run() {
while(true){
try {
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
while(true){
String str=br.readLine();
System.out.println("伺服器說:"+str);
if("bye".equals(str)){
System.out.println("再見客戶端");
System.out.println("聊天結束");
}
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
運行命令WSDL2Java。
生成服務端代碼命令是WSDL2Javauriwsdl文件全路徑p包名dxmlbeanss,sssdssio生成的java代碼存放路徑。生成客戶端包代碼命令是WSDL2Java至uriwsdl文件全路徑p包名dxmlbeansso生成的java代碼存放路徑。
源碼就是指編寫的最原始程序的代碼。運行的軟體是要經過編寫的,程序員編寫程序的過程中需要他們的語言。音樂家用五線譜和音符,建築師用圖紙和筆,那程序員的工作的語言就是源碼了。
6. java2wsdl生成的客戶端代碼怎麼調用
首先, 你要先把你的WS服務啟動起來,就是 比如ht tp:/ /localhost:8080/Example/services/HelloWorldService?wsdl
然後在你的另一個項目中建一個Webservice Client 客戶端,用來訪問你的WS服務。
建立Webservice Client 方法如下,在Eclipses中建立一個java工程,然後在src上右鍵--NEW---Other---Web Service Client --Xfire--在WsdL url 中寫上htt p:/ /localhost:8080/Example/services/HelloWorldService?wsdl-----下一步結束。
在src里的會出現一些java文件,你找一個以Client結束的java文件,在裡面的main方法中會有個service對象,現在你就可以直接用這個對象了,service.peerstatus(參數)這樣寫就行了。
7. springmvc框架如何實現像webservice一樣通過wsdl2Java生成客戶端代碼
在用到web service時,如果是調用自己開發的web service還好,可以有一個方法的介面或參數對象實體類什麼的,但如果是調用第三方的服務,除了得到web service服務地址的wsdl文檔外,沒有任何實質性編碼的東西,寫原生調用太麻煩,這時就需要自己寫一個方法的介面類。
這個,目前已經有比較成熟的工具,可以自動生成,下面作一下簡單的介紹。
apache的wsdl2java工具,目前貌似CXF和axis各有一套,使用方式大同小異,但生成的代碼會有所區別,這時說的是CXF提供的wsdl2java工具。
wsdl2java用法:
wsdl2java -p com -d src -all aa.wsdl
-p 指定其wsdl的命名空間,也就是要生成代碼的包名:
-d 指定要產生代碼所在目錄
-client 生成客戶端測試web service的代碼
-server 生成伺服器啟動web service的代碼
-impl 生成web service的實現代碼
-ant 生成build.xml文件
-all 生成所有開始端點代碼:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
詳細用法見:http://cwiki.apache.org/CXF20DOC/wsdl-to-java.html
一開始使用了CXF的這套工具,發現不是很方便,畢竟依賴CXF提供的工具jar包,個人不是很喜歡用。
後來發現JDK居然也自帶了對web service生成java代碼的功能,貌似1.6版本開始的,試用後發現效果十分不錯,果斷投入它的懷抱。下面作下簡單的介紹,以備忘。
打開jdk下的bin目錄 看下能否找到"wsimport.exe"這個文件
一般情況下都會有
如果沒有則說明你的JDK不支持這個功能
然後在DOS窗口下輸入wsimport 敲回車
如果提示錯誤的話 說明你的JDK環境變數還沒有配好
一句話總結,如果你在dos窗口下輸入wsimport正常,就可以
如果OK的話 輸入以下命令就可以將wsdl文件生成java文件了
wsimporthttp://127.0.0.1/TicketMobile/services/Cococ?wsdl -keep -p com.llg.ws2 -s g:/ws
參數說明
wsimport 這個是必須的 該工具的名稱
http://127.0.0.1/TicketMobile/services/Cococ?wsdl wsdl文件
-keep 是否生成源文件
-p com.llg.ws2 生成後的java包名
-s g:/ws 生成後放哪個目錄
但是前幾天,在對一個第三方提供的web service使用該工具生成java代碼的時候,居然出錯了,網上查找後終於找到原因。
使用cxf wsdl2java或javax wsimport工具的時候,可能會遇到關於生成的Response類文件名沖突的問題
Console代碼
WSDLToJavaError:ThrownbyJAXB:Aclass/interfacewiththesamename"***"isalreadyinuse..
@WebMethod
@WebResult(name="response")
(@WebParam(name="request")ValidateCCRequestrequest);
@WebMethod
@WebResult(name="response")
(@WebParam(name="request")ValidateCCRequestrequest);
目前可選擇的方案:
apache的wsdl2java工具,使用-autoNameResolution自動處理
wsdl2java -autoNameResolutionhttp://hello.joy2everyone.com/yourWebService?wsdl
JDK自帶的工具
wsimport -p com.test.client -keephttp://hello.joy2everyone.com/yourWebService?wsdl-B-XautoNameResolution
2.如果web service是己方開發的,可以修改代碼,使用自定義bindings,詳細可看sun webservice文檔
例如:
Java代碼
這個情況下定義的方法名,如果使用工具生成客戶端代碼,很可能存在Response沖突,因為定義的wsdl中會有一個關於介面方法的message
<wsdl:message name="validateCCResponse">
</wsdl:message>
方法名定義的message與介面定義返回的ValidateCCResponse,在工具生成客戶端代碼時就會產生命名沖突。
但是通過更改介面方法名為:
Java代碼
即可解決該沖突,
8. 如何在Java中快速發布WebService服務
1,在Java項目中發布一個WebService服務:
如何發布?
——JDK1.6中JAX-WS規范定義了如何發布一個WebService服務;
(1)用jdk1.6.0_21以後的版本發布;
(2)與Web服務相關的類,都位於Javax.jws.*包中
@WebService——此註解用在類上指定將此類發布成一個WebService;
EndPoint——此類為端點服務類,其中publish()方法用於將一個已經添加了@WebService註解對象綁定到一個地址的埠上,用於發布。
2,例子:
(1)發布WebService服務
HelloWebService.java:
[java]view plain
<spanstyle="font-family:KaiTi_GB2312;font-size:18px;">packagecn.tgb.ws;
importjavax.jws.WebMethod;
importjavax.jws.WebService;
importjavax.xml.ws.Endpoint;
/**
*@WebService-它是一個註解,用在類上指定將此類發布成一個ws.
Endpoint–此類為端點服務類,它的方法publish用於將一個已經添加了@WebService註解對象綁定到一個地址的埠上。
*@authorxuemin
*
*/
@WebService
publicclassHelloWebService{
publicStringHelloWord(Stringname){
return"Hello:"+name;
}
/**
*添加exclude=true後,HelloWord2()方法不會被發布
*@paramname
*@return
*/
@WebMethod(exclude=true)
publicStringHelloWord2(Stringname){
return"Hello:"+name;
}
publicstaticvoidmain(String[]args){
/**
*參數1:服務的發布地址
*參數2:服務的實現者
*/
Endpoint.publish("http://192.168.24.138:456/helloWord",newHelloWebService());
}
}</span>
- [java]view plain
<spanstyle="font-family:KaiTi_GB2312;font-size:18px;">packagecn.tgb.ws;
publicclassMyClient{
publicstaticvoidmain(String[]args){
HelloWebServiceServicehwss=newHelloWebServiceService();
HelloWebServicehws=hwss.getHelloWebServicePort();
Stringresult=hws.helloWord("hanxuemin");
System.out.println(result);
}
}</span>
註:
@WebService-它是一個註解,用在類上指定將此類發布成一個ws.
Endpoint –此類為端點服務類,它的方法publish用於將一個已經添加了@WebService註解對象綁定到一個地址的埠上。
運行以上程序進行發布。
(2)查看wsdl
地址:http://192.168.24.138:456/helloWord?wsdl
只要在客戶端瀏覽器能看到此WSDL文檔,說明服務發布成功
以上服務發布成功;
總結:
如何發布一個Web服務:
a,在類上添加@WebService註解
(註:此註解是jdk1.6提供的,位於javax.jws.WebService包中)
b,通過EndPoint(端點服務)發布一個WebService
(註:EndPoint是jdk提供的一個專門用於發布服務的類,該類的publish方法接收兩個參數,一個是本地的服務地址,二是提供服務的類。位於javax.xml.ws.Endpoint包中)
c,註:
類上添加註解@WebService,類中所有非靜態方法都會被發布;
靜態方法和final方法不能被發布;
方法上加@WebMentod(exclude=true)後,此方法不被發布;
(3)客戶端訪問發布的服務
根據WSDL文檔來在客戶端編寫代碼,訪問發布的服務;
但是,WSDL文檔看不懂怎麼辦?代碼該如何編寫?
——你看不懂,JDK看得懂,wsimport是JDK自帶的,可以根據WSDL文檔生成客戶端調用代碼的工具。無論伺服器端WebService使用什麼語言編寫的,豆漿在客戶端生成Java代碼。所以伺服器用什麼語言編寫的並不重要。
wsimport.exe命令參數熟知:
-d:生成class文件。默認參數。
-s:生成Java文件
-p:自定義包結構
解析地址生成源碼到E盤:
MyClient.java: