最近在做WebDav,感觉这篇文章不错,不过可惜的是,在apache项目中,slide项目已经关闭。
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包。
代码如下:
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)并不支持这些接口。恩,有点乱。
下面是锁定文件的代码:
???? 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方法来处理。注意在这个例子中,我们对是否是目录作了检
查。
{
???? if ( ! wdr.isCollection())
???????? throw new Exception ( " Path is currently a file " );
???? return wdr.list();
}
最终观点
Jakarta's Slide项目是连接webdav客户端功能和java应用的纽带。这个库是开源的,很容易使用,也很
容易集成到所有的系统中。尽管slide遗留了一些需要继续解决的问题,但是,他是实现webdav客户端最
成功的方案。
[译者按]:原文下面有很多精彩的q&a.也值得一看。