Sliding into WebDAV(轉載)

http://www.onjava.com/pub/a/onjava/2003/12/23/slide.html

翻譯自:O'REILLY
sliding into webdav
by andrew anderson

apache下面的jakarta項目提供了許多偉大的開源項目。其中一個很有名的子項目就是slide,slide由很

多不同的模塊組成,他們用webdav協議來連接。這些模塊實現了大量有用的特性,比如webdav客戶端庫

,webdav服務段庫,和一個基於webdav的cms.別的不說,首先這些模塊將給開發者提供可以訪問webdav

的客戶端。
  這篇文章將介紹如何在java應用中用slide客戶端庫來訪問 webdav服務。文章將首先介紹webdav的協

議,接着介紹slide項目,最後,我們將着手來寫幾個用slide客戶端的例子。

WebDAV
WebDAV 代表了“Web-based Distributed Authoring and Versioning”。webdav是一套http協議的擴展

--允許用戶來協作編輯和管理在遠程服務器上的文件。因爲這個協議擴展本身很簡單而且很容易使用,

所以他的能量是很強大的。效果上,webdav使http 服務器增強爲一個文件系統。大家知道類似ftp的協

議提供類似的協議很多年了,webdav's的特性比這些ftp協議更好,而且因此允許開發者使用webdav來創

建更強大的系統。

 因爲不同的webdav服務器實現提供不同層次上的協議支持,下列的特性是最基本的而且可以使webdav區

別於ftp
 http-base:允許http的所有優點。(文件權限,快速轉換,https支持,等等)
 put:可以上傳資源到服務器
 lock:可以設置/取消 連接依賴,long-duration exclusive 和共享鎖。
 Porperties:可以存儲資源的任意元數據。
 Namespace manipulations:可以移動文件,拷貝文件,創建目錄和列表目錄。
這些特性允許開發所有不同類別的有趣應用,包括分佈web-page authoring/editing 應用,版本控制應

用,郵件服務器,和分佈式日曆應用,還有很多。當開發者把webdav和“一次編寫,到處運行”的java

聯合時,編寫多處理平臺的分佈客戶端應用變得十分簡單了。
WebDAV Tools and Resources
  和http一樣,webdav需要服務段和客戶端組件。除了slide項目之外--既提供了服務段又提供了客戶端

,還有許多可用的 webdav 組件:
 1,apache的模塊mod_dav(已經在apache2中包括了)
 2,microsoft的iis包含了webdav服務支持。
 3,mas os x允許mount一個webdav服務器作爲一個網絡磁盤。
   4,Apple's提供的iDisk.
更多的信息可以查看www.webdav.org
The Slide Project
 如前所述,slide項目的首頁描述它爲“a project composed of multiple modules tied together

using WebDAV”。這些多模塊包括:
 1,一個CMS和她的Java API
 2,一個在cms之上用servlet實現的webdav協議。
 3,一個java版的webdav和http客戶端庫
 4,一個webdav命令行客戶端
 5,一個訪問webdav的swing組件(還沒實現)
和其他的jakarta項目一樣,slide提供了源文件和二進制文件。用戶可以自己去下載。
如果已經下載並解壓了他的安裝文件,打開client/lib。這個目錄包含了在本文例子中需要用到的jar文

件,包含了slide webdav的客戶端庫和許多額外包。doc/clientjavadoc下面有它的相關文檔。
Using Slide
現在,我們來關注業務:應用SLIDE WEBDAV客戶端庫來連接webdav服務器。slide客戶端封裝了所有的功

能。我們需要通過WebdavResource 來訪問WebDAV 服務器。訪問一個WebDAV 服務器涉及到下面的3個基

本的步驟:
 1,打開一個到WebDAV服務器的連接
 2,發佈協議請求並接受來自服務器的應答
 3,關閉連接。
打開WebDAV 服務器的連接可以通過WebdavResource的構造函數。有許多途徑來處理;最直接的就是給構

造函數傳遞一個org.apache.util.HttpURL 對象--包含服務器的url和用戶信息。
連接一旦建立,我們就可以發佈我們的請求。這些協議請求被WebdavResource的很多函數處理。特別如


 1,aclfindMethod:用來查找access control lists;很多webdav服務器沒有實現。
 2,aclMethod:用來設置acl,很多webdav服務器沒有實現。
 3,copyMethod:複製一個資源從服務器上的一個位置到另一個位置
 4,deleteMethod 刪除服務器上的一個資源。
 5,getMethod:獲得一個服務器上的一個資源(和http的get方法一樣)
 6,headMethod獲得服務器資源的頭文件(和http的head的命令一樣)
 7,list:列出服務器當前目錄下的資源
 8,lockMethod:鎖定服務器上的一個資源
 9,mkcolMethod:在服務器上創建一個集合
 10,moveMethod:在服務器上移動資源
 11,optionsMethod:返回服務器支持的選項。(getDavCapabilities方法和

getAllowedMethods方法也提供這種功能)
  12,postMethod:獲得服務器上的資源,通過http post(和http post命令一樣)
 13,propFindMethod:返回一個資源的屬性。
 14,propPatchMethod:設置或者獲得一個資源的屬性。
 15,putMethod:上傳一個資源到服務器(類似ftp的put命令)
 16,setPath:設置服務期上的當前目錄
 17,unlockMethod解鎖服務器的資源
注意:有些slide的文檔很弱。這片文章將會覆蓋這裏的部分方法,我們不會每個都涉及到。很多我們沒

有涉及到的方法都沒有好的文檔。
WebdavResource 有很多其他的方法,提供了衆多的功能;更多細節,請察看官方文檔。
 一旦,你已經發布了協議請求,你需要關閉webdav的連接。這個用WebdavResource 的close()方法來做


A Simple Example
一個簡單slide webdav例子,做了如下工作:
 打開連接,獲得文件,關閉連接。
 當然,這個例子很簡單,這個例子會用到java.net包。
代碼如下:

//  Slide Simple WebDAV client example
import  java.io.File;
import  java.io.IOException;
import  java.net.MalformedURLException;

import  org.apache.commons.httpclient.HttpException;
import  org.apache.util.HttpURL;
import  org.apache.webdav.lib.WebdavResource;

public   class  SlideTest  {

    
public   static   void  main (String args[]) 
    
{
        
try
        
{
            HttpURL hrl 
=
                
new  HttpURL( " http://webdav-server " );
            hrl.setUserInfo(
" user " , " pass " );
            WebdavResource wdr 
=
                
new  WebdavResource(hrl);
            File fn 
=   new  File( " remote-file " );
            wdr.getMethod(fn);
            wdr.close();
        }

        
catch (MalformedURLException mue)
        
{
        }

        
catch (HttpException he)
        
{
        }

        
catch (IOException ioe)
        
{
        }
 
    }

}


你或許猜到了,真正的工作都在try-catch塊中完成。最開始的2行建立了一個HttpURL 對象--飽含了連

接信息。然後我們通過HttpURL 創建了WebdavResource 。接着,我們創建了一個File對象來代表我們將

要下在的文件。 getMethod方法獲得了這個文件,close方法關閉了連接。(注意,這裏僅僅是一個例子

,你需要做更爲謹慎的異常處理)

你看到了,我們用WebdavResource 很直接的處理不同端口的協議。把這個例子改造爲上傳文件很直接,

我們只需要改變少許幾行,如下:
File fn = new File("local-file");
wdr.putMethod(fn);
 當然,這裏還可以對文件重新命名。
這個例子很簡單,但是演示了怎樣來使用WebdavResource 來訪問webdav服務器。在下一部分,我們將發

掘更多複雜的例子來演示如何用webdav來鎖定和解鎖文件。
More Complex Examples

可能有這樣的場景,我們有一個web站點,這個站點被2個彼此分開的團隊來維護。每個團隊都有責任來

編輯html資源,但是站點管理員希望迴避衝突。換句話說,我們都能上傳,下在,鎖定和解鎖文件。我

們都想鎖定文件來工作。
 來完成這一進程,我們需要如下的處理:
 1,打開連接。
 2,列出文件
 3,鎖定文件
 4,下在文件
 5,上傳文件
 6,解鎖文件
 7,關閉連接
我們已經知道如何來打開連接,關閉連接,上傳文件和下載文件。所以我們需要做的就是來處理鎖定/解

鎖文件和列出文件。我們假設已經有WebdavResource 對象和當前路徑了。
首先,我們想要鎖定文件。我們用lockMethod來實現,其他的代碼用作錯誤處理。你將注意到我們設置

了WebdavResource的路徑給文件--我們並沒有非要用get和put方法。這是因爲某些方法,包括

isCollection,getPath和setPath僅僅支持文件的當前目錄。其他的方法,比如getMethod (不時

getMethodData 和getMethodDataAsString)並不支持這些接口。恩,有點亂。。
下面是鎖定文件的代碼:

public   boolean  lockFile(String filename)
    
throws  Exception
{
    
//  check to make sure current path is a
    
//  directory not a file make sure your initial
    
//  path contains a trailing "/" or else it is
    
//  considered a file!!

    
if  ( ! wdr.isCollection())
        
throw   new  Exception( " Path is currently a file " );

    String currentPath 
=  wdr.getPath();
    wdr.setPath(currentPath 
+   " / "   +  filename);
    
    
if  (wdr.isLocked())
    
{
        
return   false ;
    }

    
    
boolean  returnVal  =  wdr.lockMethod();
    wdr.setPath(currentPath);
    
return  returnVal;
}


方法unlockFile是一樣的,我們同樣是在WebdavResource對象上調用。
 列出當前目錄下的文件,我們用listFiles方法來處理。注意在這個例子中,我們對是否是目錄作了檢

查。

public  String[] listFiles ()  throws  Exception
{
    
if ( ! wdr.isCollection())
        
throw   new  Exception ( " Path is currently a file " );
    
return  wdr.list();
}


 最終觀點
Jakarta's Slide項目是連接webdav客戶端功能和java應用的紐帶。這個庫是開源的,很容易使用,也很

容易集成到所有的系統中。儘管slide遺留了一些需要繼續解決的問題,但是,他是實現webdav客戶端最

成功的方案。

[譯者按]:原文下面有很多精彩的q&a.也值得一看。

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