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包。 代码如下:
你或许猜到了,真正的工作都在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)并不支持这些接口。恩,有点乱。。 下面是锁定文件的代码:
方法unlockFile是一样的,我们同样是在WebdavResource对象上调用。 列出当前目录下的文件,我们用listFiles方法来处理。注意在这个例子中,我们对是否是目录作了检
查。
最终观点 Jakarta's Slide项目是连接webdav客户端功能和java应用的纽带。这个库是开源的,很容易使用,也很
容易集成到所有的系统中。尽管slide遗留了一些需要继续解决的问题,但是,他是实现webdav客户端最
成功的方案。
[译者按]:原文下面有很多精彩的q&a.也值得一看。