Sliding into WebDAV

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.也值得一看。

你可能感兴趣的:(Sliding into WebDAV)