Slide的体系结构是一个模块的矩阵,从高层服务到底层服务通过不同的方面来划分不同的功能模块(结构、安全、锁、版本控制)
高层的接口意味着提供一个简单、标准的方法来处理命名空间。在其下层,底层服务接口展示出清晰为插件结构。
现存的一些紧耦合服务出现的原因是需要向客户段提供锁定、安全等API。
外部体系架构:
内部体系结构:
事务管理:
![]()
新的事务模型的目的是逐渐使最终用户能够用标准化的和常见的软件管理、检索和操作存储的多媒体资源–例如相片、视频和行情资料。在利用现有的内部技术来降低成本和产生利润的时候,现有的媒体业务还用来实现访问它们的多媒体资源的标准化值。尽管在过去几年中存储量、处理能力和软件都有重大的发展,但是管理数字媒体资源仍然是一件代价相当高的事情。一些研究表明,大多数的多媒体文件是非结构化的资源;只有很少一部分存在于关系数据库和现有的应用程序中。结构化的缺乏使有效地访问和重新利用数字资源变得非常困难。
中间件平台–特别是应用程序服务器–总是处理数据资源的操作。在创建多媒体增强应用程序的过程中使用应用服务器好像是对这种技术固有强度的一种自然延伸。然而,和数字资源相关的大小、结构和元数据的基本的差异使你需要采用与J2EE平台创建的关系数据库和已有资源不同的方式来操作。本文将从现在可用的和正在开发这两个角度来探讨创建多媒体应用程序所需要的标准和技术。我还将讨论在存储、索引、访问和检索多媒体资源的过程中J2EE所起到的作用,以期把这个平台的领域扩展到数字资源领域。最后,我还将探讨J2EE平台必须解决的问题,以使用户可以最优化地使用多媒体资源。
三个特性区分和定义了一个多媒体资源。在多媒体资源和已有的相关数据之间最大的基本差别是媒体文件的大小。虽然压缩技术正在不断地改善,但是复杂的视频或者音频数据流仍然动辄以千兆字节计。虽然现在已经有了存储和管理极大数据流的数字内容管理系统,但是没有用于访问这些保存的资源的标准化应用程序编程接口或者机制。
还可以从结构上来区分多媒体资源和其他数据。一般来说,你可以把传统资源作为单独的组件来访问和使用。但是多媒体资源可能包含若干个元素,例如视频流、音频流、相关的字幕信息和其他数据集。维护这个结构是数字资源管理系统的一个基本要求。
最后,多媒体文件通常由二进制信息组成。因此,传统的查询、索引和检索文件的方法不适用于多媒体领域。为了应用程序能够成功地管理、检索并且操作一个多媒体组件,你必须维护数字资源和描述这种资源特征的元数据信息之间的关系。
诸如JDBC和JCA这样的现有的J2EE平台规范阐明了用于数据访问的协议,你可以遵循这些协议创建一个基于标准方法的程序来检索多媒体资源。新的标准还必须进一步增强定义的J2EE组件模型的多媒体能力。
获得多媒体和中间件平台之间最佳组合的方法主要在于你如何定义一个用于访问数字资源的存储抽象层。为了保持应用程序移植性,你必须利用或者扩展现有的标准来解决数字媒体存储特性,比如插入、更新或者查询资源。
图⒈定义一个存储抽象
WebDAV规范是一个对HTTP进行扩展的协议,用于解决数字媒体存储大小、结构和元数据这三个方面(见图1)。它提供了跨 Internet协议的分布式编辑和版本控制的能力,可以和现有的HTTP客户端交互操作。WebDAV被使用在网络存储解决方案和Web服务器、许多编辑工具(包括微软公司出品的Internet Explorer浏览器、Apache Slide客户端、Apple OS X Finder、Microsoft Office、和Adobe应用程序)和大部分的操作系统中。许多解决多媒体存储的内容管理产品支持WebDAV。例如Apache Slide体系机构使用WebDAV作为客户端访问协议。Slide提供一个抽象层,允许对机制类型的选择用于所有它的存储,包括内容和元数据。这把内存存储、数据库存储、基于XML的存储等考虑进去。
惠普多媒体平台和Apache Slide工程利用WebDAV协议和所提供的关联的客户机和服务器应用程序编程接口来创建数字存储抽象功能。这种解决方案提供一个使用规格化、标准化和简单方式访问多后端内容管理程序的方法。这些平台提供了像WebDAV servlet这样的Web组件让开发者和任何WebDAV服务器接口,把许多WebDAV服务器整合到一个联合内容服务器中,或者创建基于请求信息的自定义解决方案。你可以使用HP WebDAV servlet和可以截取WebDAV请求和在存储和检索操作期间执行数据处理的servlet过滤器同时使用。有用的操作包括元数据和内容的提取、变换或者索引。
通过利用标准化J2EE组件,你可以创建一个可伸缩和容错的基于中间件的内容管理系统。例如,你可以联合WebDAV servlet、相关的处理过滤器和Apache Slide来生成一个内容服务器,能够存储文件、这些文件附属的元数据属性和基于元数据属性的文件的搜索。这样一个系统在J2EE应用程序体系结构平台上执行,并且可以使用平台的性能、可伸缩性、安全和可移植性等特性。
客户端的存储器接口还可以利用J2SE和 J2EE这两个版本的属性和设备。因为URL设置被构建进J2SE平台中,你可以在Java虚拟机中安装一个WebDAV协议处理程序来简化到WebDAV内容管理系统的客户接口。J2EE组件可以潜在地利用JCA连接器实现来创建存储企业组件和应用程序。例如HP多媒体平台的WebDAV连接器访问遵从WebDAV协议的服务器作为企业资源:
| ConnectionSpec spec; ConnectionFactory factory; WebDAVConnection conn; factory =(ConnectionFactory)ctx.lookup("java:comp/env/webdav/local" ); spec = new WebDAVConnectionSpec("/", "username", "password" ); conn = (WebDAVConnection)connectionFactory.getConnection ( spec ); |
发现和访问
一旦你已经创建一个基于标准Java的机制来用于存储和检索多媒体资源,你需要一个查询和发现存储的文件的方法来创建增强的多媒体应用程序。元数据的关键用途是改善信息的查询和检索。元数据实质上是关于信息的信息;它提供或者访问关于另一个信息资源的信息。在多媒体的上下文中,元数据简化了发现的访问数字内容的过程。
各种元数据标准分别在某些信息领域解决不同的问题。Dublin Core元数据标准被开发来提供一个描述文档,象HTML文档、PDF文件和图像这样的资源的标准方法。它已经被扩展,现在库、档案和联机内容的发行者使用Dublin Core作为一种通用的元数据标准。
Dublin Core标准描述了适用于在很宽的资源范围内的描述性元素的小集合。这些元素包括象标题、创建者、主题、日期、格式和语言等属性。即使还没有元数据表达机制被普遍接受,但是Dublin Core项目已经采用了资源描述框架( RDF)。RDF提供了一个描述和交换元数据的方法。这那些框架支持元数据与支持用于语义、语法和结构的标准协定机制的互操作性。RDF不强制用于不同资源描述共同体的语义。取而代之的是,它提供了用于这些团体来根据需要定义新的元数据元素的方法。RDF通常使用XML作为一种元数据交换和处理的机制。XML的使用促进了元数据元素集合之间的互操作性,以及在完全不同的团体之间的扩展名和元数据的再使用。此外,RDF简化了词汇的发布,不仅能使词汇被人阅读而且可以很容易地被应用程序处理。
列表1:
| <?xml version=’1.0′?> <rdf:RDF xmlns:rdf=’http://www.w3.org/1999/ 02/22-rdf-syntax-ns#’ xmlns:rdfs= ‘http://www.w3.org/2000/01/ rdf-schema#’ xmlns:hp=’http://www.hpmiddleware.com/xml/ namespaces/metadata-java-1.0#’> <rdf:Property rdf:about="http:// www.hpmiddleware.com/rdf/maiden/1.0#name"> <rdfs:isDefinedBy rdf:resource="http:// www.hpmiddleware.com/rdf/maiden/1.0#" /> <hp:datatype>java.lang.String</hp:datatype> </rdf:Property> <rdf:Property rdf:about="http:// www.hpmiddleware.com/rdf/maiden/1.0#title"> <rdfs:isDefinedBy rdf:resource="http:// www.hpmiddleware.com/rdf/maiden/1.0#" /> <hp:datatype>java.lang.String</hp:datatype> </rdf:Property> </rdf:RDF> |
列表1是描述两个元数据属性的RDF文档示例:name和title。<rdf:Property>节点定义了元数据资源。rdf:about属性标识了元数据资源。(你总是通过一个URI描述一种资源。)<rdfs:isDefinedBy>元素指出定义了相关元数据资源的资源。这两个元素共同描述了元数据资源的语义。在列表1中?maiden/1.0#域名空间定义了name元数据属性。<hp:datatype>元素定义了元数据资源的本地Java类型。在列表1中,name元数据资源的本地Java类型是java.lang.String。
许多容器模型已经被提出来用于访问各种可能存在的用于描述日益不同的资源的元数据集合。这样一个提议是Warwick Framework。Warwick Framework提出了一个容器体系机构的概念模型,在其中你可以部署多个元数据集合,例如你已经习惯于用于创建企业应用程序来使用地现有的应用程序组件。这个框架的特定实现必须提供一个用于处理容器和它的元数据包的实际方法。
图2、实现Warwick Framework容器
图2显示了Warwick Framework容器的典型的Java实现。这个框架使用了一种普通的方法描述了元数据集合中的属性之间的关系,这样你就可以部署你可以在不同平台上实现的不同容器的描述。此外,你使用一种本地类型绑定描述(特别是对于一种程序设计语言)来生成实现绑定的代码。一个存储绑定允许在多个元数据集合中的属性来映射到存储的单一值(canonical属性)。存储绑定的一部分定义了所需的代码转换来转换存储中编码的属性值为用于指定的元数据集合的固有的编码。
发现和访问
一旦你已经创建一个基于标准Java的机制来用于存储和检索多媒体资源,你需要一个查询和发现存储的文件的方法来创建增强的多媒体应用程序。元数据的关键用途是改善信息的查询和检索。元数据实质上是关于信息的信息;它提供或者访问关于另一个信息资源的信息。在多媒体的上下文中,元数据简化了发现的访问数字内容的过程。
各种元数据标准分别在某些信息领域解决不同的问题。Dublin Core元数据标准被开发来提供一个描述文档,象HTML文档、PDF文件和图像这样的资源的标准方法。它已经被扩展,现在库、档案和联机内容的发行者使用Dublin Core作为一种通用的元数据标准。
Dublin Core标准描述了适用于在很宽的资源范围内的描述性元素的小集合。这些元素包括象标题、创建者、主题、日期、格式和语言等属性。即使还没有元数据表达机制被普遍接受,但是Dublin Core项目已经采用了资源描述框架( RDF)。RDF提供了一个描述和交换元数据的方法。这那些框架支持元数据与支持用于语义、语法和结构的标准协定机制的互操作性。RDF不强制用于不同资源描述共同体的语义。取而代之的是,它提供了用于这些团体来根据需要定义新的元数据元素的方法。RDF通常使用XML作为一种元数据交换和处理的机制。XML的使用促进了元数据元素集合之间的互操作性,以及在完全不同的团体之间的扩展名和元数据的再使用。此外,RDF简化了词汇的发布,不仅能使词汇被人阅读而且可以很容易地被应用程序处理。
列表1:
| <?xml version=’1.0′?> <rdf:RDF xmlns:rdf=’http://www.w3.org/1999/ 02/22-rdf-syntax-ns#’ xmlns:rdfs= ‘http://www.w3.org/2000/01/ rdf-schema#’ xmlns:hp=’http://www.hpmiddleware.com/xml/ namespaces/metadata-java-1.0#’> <rdf:Property rdf:about="http:// www.hpmiddleware.com/rdf/maiden/1.0#name"> <rdfs:isDefinedBy rdf:resource="http:// www.hpmiddleware.com/rdf/maiden/1.0#" /> <hp:datatype>java.lang.String</hp:datatype> </rdf:Property> <rdf:Property rdf:about="http:// www.hpmiddleware.com/rdf/maiden/1.0#title"> <rdfs:isDefinedBy rdf:resource="http:// www.hpmiddleware.com/rdf/maiden/1.0#" /> <hp:datatype>java.lang.String</hp:datatype> </rdf:Property> </rdf:RDF> |
列表1是描述两个元数据属性的RDF文档示例:name和title。<rdf:Property>节点定义了元数据资源。rdf:about属性标识了元数据资源。(你总是通过一个URI描述一种资源。)<rdfs:isDefinedBy>元素指出定义了相关元数据资源的资源。这两个元素共同描述了元数据资源的语义。在列表1中?maiden/1.0#域名空间定义了name元数据属性。<hp:datatype>元素定义了元数据资源的本地Java类型。在列表1中,name元数据资源的本地Java类型是java.lang.String。
许多容器模型已经被提出来用于访问各种可能存在的用于描述日益不同的资源的元数据集合。这样一个提议是Warwick Framework。Warwick Framework提出了一个容器体系机构的概念模型,在其中你可以部署多个元数据集合,例如你已经习惯于用于创建企业应用程序来使用地现有的应用程序组件。这个框架的特定实现必须提供一个用于处理容器和它的元数据包的实际方法。
图2、实现Warwick Framework容器
图2显示了Warwick Framework容器的典型的Java实现。这个框架使用了一种普通的方法描述了元数据集合中的属性之间的关系,这样你就可以部署你可以在不同平台上实现的不同容器的描述。此外,你使用一种本地类型绑定描述(特别是对于一种程序设计语言)来生成实现绑定的代码。一个存储绑定允许在多个元数据集合中的属性来映射到存储的单一值(canonical属性)。存储绑定的一部分定义了所需的代码转换来转换存储中编码的属性值为用于指定的元数据集合的固有的编码。
一个客户应用程序使用Warwick Framework实现来调用容器自己、保存属性值的对象和部署到容器上的任何元数据集合。一个Java名称和目录接口( JNDI)查找可以获得到容器的引用。一个配置的存储驱动程序管理属性值的持续性。一个低级的存储层提供了元数据属性的本体类型绑定。面向客户端的元数据集合应用编程接口不仅使用合适的本地类型而且使用用于元数据集合的合适的编码来传递属性值。
列表2:
| package metadataset; import com.hp.mw.richmedia.metadata.*; import com.hp.mw.richmedia.metadata.spi.TranscodingMetadataProperty; public interface MaidenAppSample extends com.hp.mw.richmedia.metadata.MetadataSet { public static final TranscodingMetadataProperty NAME_METADATA_PROPERTY = new TranscodingMetadataProperty("http://www.hpmiddleware.com/rdf/maiden/1.0#name" ); public static final TranscodingMetadataProperty TITLE_METADATA_PROPERTY = new TranscodingMetadataProperty("http://www.hpmiddleware.com/rdf/maiden/1.0#title" ); public void addName( java.lang.String name ) throws MetadataException; public PropertyValueCollection getNameCollection() throws MetadataException; public void setName( java.lang.String name ) throws CardinalityConstraintException, MetadataException; public java.lang.String getFirstName() throws MetadataException; public void addTitle( java.lang.String title ) throws MetadataException; public PropertyValueCollection getTitleCollection() throws MetadataException; public void setTitle( java.lang.String title ) throws CardinalityConstraintException, MetadataException; public java.lang.String getFirstTitle() throws MetadataException; } |
列表2说明了一个Warwick Framework生成的面向客户端的应用编程接口的示例。列表3中的JSP代码说明了你如何通过JNDI查找、检索元数据集合对象和查询用于name元数据属性的值的对象来访问Warwick Framework。
列表3:
| <%@ page ?> <% Hashtable env = new Hashtable(); env.put( Context.URL_PKG_PREFIXES, "com.hp.mw.richmedia" ); InitialContext ctx = new InitialContext( env ); MetadataContainer container = ( MetadataContainer ) ctx.lookup( "metadata:/metadata-container.xml" ); MetadataQuery query = container.createQuery( new URIQuerySpec( "http:// www.hpmiddleware.com/maiden/1.0/ testresource" ) ); Collection c = container.query( query ); Iterator itor = c.iterator(); MetaObject mo = ( MetaObject ) itor.next(); MaidenAppSample sampleMetadataSet = ( MaidenAppSample ) container.getMetadataSet( mo, "http://www.hpmiddleware.com/rdf/ maidenapp/sample/1.0#" ); PropertyValueCollection pvc = sampleMetadataSet.getNameCollection(); out.println( "<br><h3>Values for the name property?</h3><br>" ); itor = pvc.iterator(); while ( itor.hasNext() ) out.println( ( String ) itor.next() + "<br>" ); %> |
我已经细节说明的存储组件和元数据组件简化了基于标准、多媒体增强的应用程序的创建。这些组件提供了使用你熟悉J2EE开发机制来存储、查询和检索多媒体元素的能力。因此,你不仅可以把现有的和新的J2EE应用程序中的上下文的多媒体内容提供给最终用户,而且可以利用这个平台来创建支持新媒体组件的生成的应用程序。
例如,你可以通过集合媒体组件到同步多媒体集成语言( Synchronized Multimedia Integration Language,SMIL)来组装一个促进媒体表现得交互创建的基于Web的应用程序。( SMIL是一个提供根据时间线计划音频、视频、文本和图形文件的标注语言。)另一个例子是一个简化提取、审查和最终发布多媒体内容的门户。这两个应用程序可以通过利用标准J2EE组件,例如JSP、servlets和Enterprise Java Beans来在多媒体生命周期中确定关键阶段。
图⒊EMB组件和从属物
除了利用现有的组件之外,Java开发者团体还在探索如何扩展现有的Java平台的范围来在多媒体资源生成中担任一个更重要的角色。JCP的许多创新能解决现有的Java平台中的一些多媒体处理的不足。
Enterprise Media Bean
Enterprise Media Bean ( EMB) Java规范请求解决了多媒体数据的操作和应用。EMB规范工作推出了一个基于组件的体系机构,用于把多媒体数据无缝集成到基于J2EE程序设计模型的应用程序中。(参见图3)。这个规范提出了两个组件类型。第一个组件Media Foundation Bean提供了一些基本的服务(比如头标的提取)来提供一个标准和轻量级方法来在J2EE应用程序中包含基本的多媒体相关特性。相反,第二组件Media Entity Bean依靠EJB实体bean并且因此用于基于EJB体系结构的应用程序。这些Media Entity Bean基本上是持久的、远程的和易变的模型数据的实体bean。因此,它们扩展了标准EJB事务和安全模型到媒体数据中,提供了一个服务器端协议处理程序(例如流服务器)的抽象。
此外,JCP调查访问内容存储的标准方法。现在,客户应用程序必须使用一个供应商的专有的应用编程接口来与特定的内容容器相互作用。Content Repository for Java Technology应用编程接口将集中于事务读/写访问二进制内容(流操作)、文本内容、全文搜索、过滤、监视、版本控制和处理结构化内容。
除现有的JCP创新来扩展J2EE平台之外,补充的扩展被要求允许平台在创建多媒体数据的过程中担任更基本的角色。为了J2EE应用程序能够参与图像处理,应该定义辅助容器,允许部署的组件访问当前不可用于EJBs或者servlets的工具。例如,图像过程组件需要大量产生多线程的能力来处理各种并发数据流,并且最终合并结果。一个允许创建这种类型处理组的容器将允许J2EE平台来在多媒体领域中扮演一个更重要的角色。
开发者现在有与他们现在整合数据库和以前遗留信息所使用的大致相同的方式来寻找和包含多媒体资源的选择。因为这些技术已经成熟并且标准化,用于提高J2EE应用程序使用者的用户经验的潜在能力极大增强。Java团体和中间件供应商必须利用这些潜在能力使J2EE平台成为一个对于更有辨别能力的用户市场来说更可行的选择。
我这里不想详细介绍 WebDAV 的协议,感兴趣的可以在这里找到相关的资料:
http://www.webdav.org
其中首先应该看的是这份 WebDAV FAQ:
http://www.webdav.org/other/faq.html
WebDAV 本身是一个类似于 HTTP 的通信协议(IETF RFC 2518)。它与 HTTP 类似,需要实现服务器和客户端两部分软件。目前 WebDAV 已经有了大量相关的软件实现。
在这里是一些与 WebDAV 相关的软件项目:
http://www.webdav.org/projects/
在这些项目中,我们最感兴趣的当然是那些用 Java 实现的开源项目,Slide 是其中最重要的一个项目。Slide 是 Jakarta 项目的一个子项目(又是 Apache 山头的),提供了一套 WebDAV 的服务器端和客户端的开发库和 API,目前已经出到了 2.0 版。
http://jakarta.apache.org/slide/
在这里下载最新的 Slide 2.0 的 Binary 包。
http://jakarta.apache.org/site/binindex.cgi
Slide 分成服务器端和客户端两部分:
服务器端:
http://apache.linuxforum.net/dist/jakarta/slide/binaries/jakarta-slide-server-bin-2.0.zip
客户端:
http://apache.linuxforum.net/dist/jakarta/slide/binaries/jakarta-slide-webdavclient-bin-2.0.zip
我先讲讲服务器端如何配置:
解压缩,假设在 D:\tmp\jakarta-slide-server-2.0 下,你会在
D:\tmp\jakarta-slide-server-2.0\slide\webapp\
下找到两个 war 文件:
slide.war:Slide 服务器端配置,用 Servlet 实现。
slide-doc.war:Slide 文档。
把这两个 war 文件 copy 到你的 Web Container(Tomcat、Jetty、Resin、etc.) 的部署目录(一般是 webapps 目录)下,然后重新启动 Web Container。
在我现在写的这个文档中服务器端的配置就是这么简单。
再讲讲在客户端如何配置。
WebDAV 有非常多的客户端,用 Slide 客户端的库可以非常容易地写出一个 WebDAV 客户端程序。感兴趣的可以看看这篇文档:
http://www.onjava.com/lpt/a/4387
我主要讲讲如何用 Windows 2000/XP 自带的 Web Folder 功能来访问 Web 文件夹。
Windows 2000/XP 安装后已经具备访问基于 WebDAV 协议的 Web 文件夹的功能,而且可以把 Web 文件夹映射为一个本地文件夹,支持拖放、拷贝/粘贴等等功能,使用起来非常方便。
在 Windows 2000/XP 中添加 Web 文件夹的方法是:
打开“网上邻居”,添加网上邻居,在“请键入网上邻居的位置”中输入 Web 文件夹的 URL,例如我刚才用 Slide 配置好的 WebDAV 服务器在:
http://localhost:8000/slide/
然后按照向导的提示继续做就可以了,非常的简单。
配置好了以后你就可以把这个 Web 文件夹当作本地文件夹一样使用了。拖几个文件进去试试吧。关于上述 Web Folder 的配置可以参考这些文档:
http://chapters.marssociety.org/webdav/
(几个闲着没事孜孜不倦地研究人类如何移民火星的酷哥写的文档)
还有 M$ 网站上的相关文档:
http://www.microsoft.com/windowsxp/home/using/productdoc/en/default.asp?url=/windowsxp/home/using/productdoc/en/using_webfolders_for_file_transfer.asp
M$ 的很多产品都内置有 WebDAV 的支持。例如:Office 2000、IE 5/6、Exchange Server、Frontpage。我配置好 WebDAV 服务器后,当我访问这个 URL
http://localhost:8000/slide/files/23.doc
时,Word 2000 可以识别出 Web 服务器支持 WebDAV 协议。于是 Word 2000 可以直接编辑服务器上的这个文档,编辑完后可以直接保存在 Web 服务器上。这个是不是比你习惯的 download->modify->upload 要方便的多?
WebDAV 还有很多话题,比如 WebDAV 完全可以取代 FTP。WebDAV 至少在以下几个方面对 FTP 具有压倒性优势:
1、FTP 需要申请操作系统帐号。WebDAV 不需要申请任何操作系统帐号,它使用一套自己定义的安全完善的身份验证机制。
2、FTP 的所有数据(包括登录信息)全部使用明文传送,加密必须要自己来实现,例如:可以手工用 GPG 来做这件事,但是毕竟还是不方便。用 WebDAV 就可以使用 HTTPS 来传输数据,加密解密的操作完全是在低层自动完成的。
3、FTP 传输数据的传输效率比较低,每传送一个文件需要打开一个新的 TCP 连接,而 WebDAV 传输所有文件只需要一个 TCP 连接。
4、FTP 不象 HTTP 那样容易穿越防火墙,在广域网的应用范围比 HTTP 要小的多。而 WebDAV 因为是基于 HTTP 的,所以具有 HTTP 的所有优点。
5、FTP 客户端工具没有 WebDAV 客户端工具使用方便。你刚才已经看到 WebDAV 服务器配置好后,通过 Windows 2000/XP 的 Web Folder 方式访问 Web 文件夹就和访问本地文件夹没有多少区别。如果应用程序支持 WebDAV 协议(例如 Word 2000),就可以直接打开 Web 文件夹中的文件并且编辑,然后直接保存在原先的 Web 文件夹中。这个用起来简直就和 Samba 完全一样。你知道哪一个 FTP 客户端使用起来有这么方便吗?
http://localhost:8000/slide/
这样 IE 就直接打开了这个 Web 文件夹,你可以随便拖几个文件进去试试。如果是 Word 文件可以直接用 Word 打开并编辑,然后可以直接保存在 Web Server 上。这和上面在网上邻居中打开的效果是完全一样的。
你可以写 JS 来直接打开 Web 文件夹中的文件,例如:
<script language="javascript">
<!–
var word = new ActiveXObject("Word.Application");
word.Documents.Open("http://localhost:8000/slide/files/23.doc");
//word.Quit();
–>
</script>
Word 打开这个文件后可以直接编辑,然后可以直接保存在 Web Server 上面,省去了你 download->modify->upload 的步骤,用起来是不是更方便?
缺省情况下,WebDAV 服务器在客户端第一次打开一个文件时会为这个文件加一个排他的写锁,以后所有客户端打开这个文件都是只读的。只有在第一个客户端保存文件后才会释放这个锁,然后其他客户端才能修改这个文件。
Slide 可以把文件保存在文件系统中,也可以把文件保存在数据库中。Slide 提供了 API 使你可以写 plugin 将文件保存在其它类型的存储系统中。
Slide 使用基于角色的权限控制,角色的权限可以继承。这些内容聊起来就多了,感兴趣的可以看 Slide 的配置文档。文档中还有与版本控制有关的内容。
http://jakarta.apache.org/slide/config_file.html

