在上一篇文章中,WebDavServlet关于锁定的doLock我们已经讲过了,针对于WebDav规范其它三类操作,资源属性操作,目录集合操作,资源移动拷贝操作,本文继续就WebDavServlet进行介绍。
1.doCopy/doMove
对于doCopy,调用的就是copyResource的方法,而对于doMove,其实是先copy资源再删除对应的资源,
我们主要关注copyResource和deleteResource这两个方法;
对于copyResource方法来说,基于WebDav规范,最重要的是从客户端获取Destination
之后对其Path路径做一系列的处理,如字符集,相对路径,然后通过WebSourceRoot去获取目标资源,如果目标资源存在的话,如果允许覆盖,直接delete掉对应的资源
下一步就是拷贝操作了,分为目录和文件两种模式:
这样doCopy方法就完成了;
删除资源的doDelete的时候,需要注意lock的问题,因为很多lock在对应的Resources的资源上进行lock等待,必须要等待所有的锁都解掉之后才可以删除:
因此,这块的代码和doLock实际上是一样的,先判断当前请求或者其它的请求是否在该资源上加锁,如果加锁了直接抛异常,不能删;
总结一下,doCopy和doMove实际就是基于WebDav规范的文件操作而已,除了删除资源的时候需要注意Lock,其余的没有什么新奇之处;
2.doMacol与集合操作
目录与集合操作,实际是在DefaultServlet中默认就提供了一些,如listings初始化参数,可以指示当请求到一个目录的时候,Tomcat中是否能列出目录,在DefaultServlet中甚至可以通过XSLT进行样式表的转换。
而在WebDavServlet中更进一步,不但可以查看目录,甚至可以通过domacol进行创建目录,如下:
实际上创建目录,也是通过WebResourceRoot的mkdir来做的,在创建之前,仍然需要判断,该资源位置处是否能够创建,是否有锁;
WebDav规范除此之外,对于文件和文件夹的doPut,doDelete等都支持了目录的操作,相当于更进一步完善了DefaultServlet;
3.doPropfind/doPropPatch
WebDav规范中定义了对资源属性的增删改查方法,在WebDavServlet中并没有提供对doPropPatch的支持:
所以说,WebDavServlet也不是完全WebDav规范都实现了;
doPropFind在WebDavServlet是实现了,主要也是基于WebDav规范中定义的请求内容,进行解析,然后遍历出需要查找的资源的属性名称,
WebDavServlet中使用了一个Vector<String>对资源属性进行存储,最后根据WebDav规范的response流对客户端将这些资源属性写出为xml:
4.WebDav规范的比FTP好在哪里?
分析到这里,我们可以看到,这不就是一个FTP类似的规范吗?
WebDav规范为什么要建立起来?好处在于哪里呢?
对于上述这几个优点来说,穿越防火墙,TCP链接复用,安全可靠这几个优势都是致命的;
但是,国内却对这个WebDav规范不是太感冒,笔者经历过的几个项目即使存在Tomcat,还要单独再引入一些FTP协议的实现,原因就不说了,或许是FTP名气太大了,或许是项目需求必须这么用?再或许就是架构师真是SB了,不解释;