10个基于java的cms网站内容管理系统(关键词:Java内容仓库被设计为一套标准API来解决)
优采云 发布时间: 2021-09-09 00:1410个基于java的cms网站内容管理系统(关键词:Java内容仓库被设计为一套标准API来解决)
-1- JAVA 内容仓库及其在cms1 中的应用 程敏,薛胜军,武汉理工大学计算机科学与技术系,武汉 (430063)Abstract:Java 内容仓库被设计成一套标准API 解决内容管理系统(cms)领域内容仓库无法统一的问题,位于应用系统和底层存储层之间,采用树状存储模型提供内容访问、版本控制、事件、检索和过滤等内容服务,实现了内容访问和存储仓库的解耦,提供了更高的灵活性和交换能力。总结了java内容仓库的概念、原理和结构,并简要介绍了其开放的源码实现项目Apache JackRabbit,结合一个新闻发布系统的应用实例,说明了它在cms中的应用,最后说说它的优缺点讨论了java内容仓库技术,以及它的未来前景。 关键词:java内容仓库,JSR-170,内容管理系统,Apache Jackrabbit 1.介绍我们日常对各种信息内容仓库的存储主要是基于以下几种方式:关系型数据库、文件系统、xml。数据库处理标准数据类型非常好,但是在处理图像、文档等二进制数据时就不太好用了。文件系统可以弥补这一点,但它们既不提供用于搜索信息的查询语言,也不提供表示关系或事务的概念。 XML 存储在海量数据和安全控制方面也存在缺陷。
不同的特性决定了各种内容仓库无法统一,但随着各厂商内容仓库数量的快速增加,人们越来越需要一套通用的编程接口来使用这些内容仓库。 Content Repository for Java Technology API(JSR-170)旨在提供这样一个接口。它提供了一套标准的内容存储库API,即无论底层资源是什么,最终的数据存储都可以是一个文件系统、WebDAV 仓库、支持 XML 的系统,甚至是 SQL 数据库),API 将是相同的。它适用于任何与 JSR-170 规范兼容的内容仓库。它是一组符合 Java Community Process 的内容仓库。该规范于 2005 年 6 月制定并完成 [1]。该规范在名称空间下提供了统一的 API,允许人们以供应商中立的方式访问任何符合规范的仓库实现。提供Access粒度控制、版本控制、内容事件、全文搜索过滤等数据存储服务。内容管理系统(cms)是一个非常广泛的概念:从商业门户网站的新闻系统到个人博客的一切都可以称为内容管理系统。如果您曾经开发过内容管理系统,那么您将非常清楚在实施内容系统时遇到的固有困难。这个领域缺乏统一的标准,很多厂商都有自己的私有仓库引擎。
这些困难加剧了此类系统的复杂性和可维护性,增强了供应商锁定,并增加了企业市场对传统系统的长期支持的需求。随着企业博客和电子企业文档管理的日益普及,cms 行业对标准化内容仓库接口的需求比以往任何时候都更加重要。因此,使用java内容仓库技术开发cms将成为一种趋势。 2.java内容仓库模型的原理和存储结构下图描述了使用JSR-170模型的原理。 Java 内容存储库位于cms(或入口应用程序)和底层内容存储工具(如 RDBMS、文件系统、LDAP 服务器、XML 或其他数据存储机制)之间。从API的角度来看,JCR的功能类似于RDBMS中的JDBC。 1 本项目由国家自然科学基金资助(基金号:60572015)。-2- 内容仓库1 具体API CR1 内容仓库3 具体API CR3 内容仓库2(JSR-170)cms应用系统文件系统数据库XML 图1 JSR-170的原理模型当应用系统运行时,它可以操作Content Repository 1、2、3中的任何一个。
我们在开发这个应用系统时,不必关心数据是如何存储的。它可以存储在关系数据库、文件系统、xml 甚至远程内容仓库中——只要运行的内容仓库支持(或需要 JSR-170 驱动程序间接支持)JSR-170。目前只有文件系统可以直接支持JSR-170,其他内容仓库需要JCR连接桥来支持[1]。 Java 内容仓库存储结构 Java 内容仓库使用“树结构”来存储信息。树由节点和属性组成。如图 2 所示,圆圈代表节点,方块代表属性。一个节点只有一个父节点、任意数量的子节点(子节点)和任意数量的属性。一个属性只有一个父节点(它也是一个节点),它没有子节点,并且由一个名称和一个或多个值组成。属性值类型可以是:Boolean、Date、Double、Long、String 或 Stream。只有属性可用于存储信息,节点用于在树内创建“路径”。在某种程度上,这棵树类似于文件系统的结构,节点作为目录,属性作为实际文件[2]。节点属性名称值节点节点属性属性1n1n11 1n111n nnn1 图2 java内容存储库的存储模型——在实际应用中,这种“树状结构”可以概括所有存储类型。
这种树状的存储结构非常适合cms的后台存储、全文索引、搜索等操作。每个节点具有一种且只有一种主节点类型(primary node type)。主节点类型定义了节点的特征,例如允许节点具有的属性和子节点。除了主节点类型,节点还可能有一种或多种mixin类型。 mixin 类型很像装饰器,为节点提供附加功能。具体来说,JCR 实现可以提供三种预定义的混合类型: • mix:versionable,它允许节点支持版本控制。 • mix:lockable,为节点启用锁定功能。 • mix:referenceable,它提供自动创建的jcr:uuid 属性,该属性为节点提供唯一的、可引用的标识符。 (1)Java内容仓库的功能层次划分Java内容仓库的功能分为几个层次,每个层次提供了一组具体的特性: 表1 Java内容仓库的功能划分[3] java的功能划分内容存储库级别功能特性级别 1 提供对存储库的读取访问权限、对节点和属性的读取访问权限。对属性值的读取访问权限。
输出到 XML/SAX。支持XPATH语法的查询服务。 Level 2 在Level 1 的基础上提供写功能,增加和删除节点和属性。对属性值的写操作。从 XML/SAX 输入数据。可选级别 基于级别 2 定义五个附加功能 版本控制 事务支持 SQL 查询 内容锁定和监控 Apache Jackrabbit 是 JSR-170 的开源参考实现,提供级别 1、2 和可选功能。 Apache Jackrabbit 完全实现了 JCR API 的内容库。 Jackrabbit 发布的当前版本是,被认为足够稳定,可以在生产环境中使用。除了实现 JSR-170 中定义的所有功能外,JackRabbit 还添加了附加功能(例如 SessionListeners 或 CustomNode 注册),以及一个项目套件,其中包括:JCA 连接器、taglib、WebDAV 接口、虚拟文件系统和 JDBC 后端。 3、基于JSR-170的新闻发布系统开发。系统内容仓库模型 下图描述了新闻发布系统的内容仓库模型。根节点的每个子节点代表一个新闻实体。与此新闻实体相关的数据存储在新闻实体节点的属性中。属性类型包括文本内容和二进制文件(图片、视频等)。
-4- 属性节点 rootNodenewsEntry2newsEntry1title=...content=...author=...photos=... title=...content=...author=...vedios=... 图 3新闻发布系统存储模型图 内容仓库配置 JackRabbit 需要两个参数来配置内容仓库实例:内容仓库主目录和内容仓库配置文件。这两个参数可以通过两种方式设置,一种是在创建仓库实例时直接传递给Jackrabbit,另一种是通过设置JNDI对象工厂来间接设置。系统实现 下面简单介绍在内容仓库已经建立的前提下,基于JSR-170实现新闻发布系统的内容访问、搜索、数据导入导出、添加二进制内容、版本管理等一些基本功能。配置。 (1)初始化内容仓库JSR-170使用TransientRepository获取仓库、工作空间和根节点://初始化内容仓库Repository r1 = new TransientRepository(); Session session = (new SimpleCredentials("userid", "" .toCharArray( ))); //从会话中获取根节点 Workspace w1 = (); Node root = (); (2) 添加和删除新闻内容 添加一个内容,我们需要添加一个内容节点到仓库。
比如我们要添加一个名为news的节点,它收录title、author、content等属性: Node news = ("news"); ("title", new StringValue("今日头条")); ( "author", new StringValue("chengmin")); ("内容",newTextValue("xxx……yyy")); ();-5- 上面代码片段中的最后一行代码将保存会话。添加和设置节点和节点属性只能修改临时会话存储层。要将这些更改保存到仓库,您必须使用 () 保存会话。您可以在目标节点上调用 () 来删除内容节点。 (3)新闻内容访问JSR-170提供了两种访问内容的方式:遍历访问和直接访问。遍历访问包括用相对路径遍历内容树,直接访问允许绝对路径。直接跳转到节点。如果该节点是可引用的,使用jcr:uuid直接跳转到该节点。(4)新闻内容搜索JCR的XPath搜索工具提供了一个更好的方式来获取具体的内容项。从树状结构看,工作空间模型非常类似于XML 文档,因此 XPath 是查找节点的理想语法。
XPath 查询是通过 QueryManager 对象执行的。查询过程类似于通过JDBC 访问记录的过程。 (5) 用 XML 导入和导出新闻内容为了保证跨 JCR 实现的可移植性,我们可以使用 JSR-170 提供的标准 XML 导入和导出工具。通过使用这些工具,满足规范可以很方便的转移到另一个合规的供应商仓库使用XML进行序列化的另一个好处是导出的仓库可以用传统的XML解析工具进行操作例如我们只需要下面三行代码就可以执行导出: File outputFile = new File(""); FileOutputStream out = new FileOutputStream(outputFile); ("/root", out, false, false); 然后就可以将生成的 XML 文件导入到另一个新的仓库中: File inputFile = new File(""); FileInputStream in = new FileInputStream(inputFile); ("/",in,_UUID_CREATE_NEW); (); (6)Add Binary Attachment [4] 除了支持常见的数据类型如字符、布尔和长除整数类型,也支持其他类型,包括二进制图像等流类型。
在下面的代码中,我们在新闻节点的子节点的文件节点中添加了一个图片文件。文件数据本身保存为 pic 节点。实际的图像文件数据收录在 jcr:data 属性中。 File file = new File(""); MimeT 能够 mt = (); //确定内容类型 String mimeType = (()); if(mimeType==null)-6- mimeType = "application/octet-stream"; //添加文件节点 Node fileNode = ((), "file"); //添加图片节点 Node picNode = ("jcr:content", "pic"); //设置内容类型("jcr:mimeType", mimeType ); //设置内容编码方式("jcr:encoding", ""); //用FileInputStream加载文件("jcr:data", new FileInputStream(file)); (7)系统版本管理 JSR-170 支持多种可选功能,包括访问控制、事务、锁定和版本管理。
这些特性本身就可以是一个完整的话题,所以我必须简要总结一下,只介绍其中最流行的一个:版本管理。在最简单的情况下,只需将 mix:versionable 混合类型添加到任何节点即可进行版本管理 [2]。在节点上,可以使用一组类似于CVS操作的方法来实现版本管理: ();//version checkout();//version save();//version check-in JCR 其他操作包括:update,合并和恢复以前的版本等,这里就省略了。 4.cmsdevelopment中java内容仓库的策略分析。使用java内容仓库的好处从系统架构来看,Java内容仓库在系统中的实际作用类似于JDBC在数据库系统中的作用。区别在于JDBC是基于数据库的,而java内容仓库是基于内容仓库的,这个内容仓库可以是RDBMS、文件系统、LDAP服务器、XML或者其他数据存储机制。使用Java内容仓库技术开发cms将带来以下好处:(1)提供统一接口解决cmsfield内容仓库API不兼容问题 JSR-170提供了一套统一接口,打破传统cms字段的技术分离,降低了cms系统的复杂度,增强了可维护性,使用JSR-170,对于开发者来说,无需了解厂商仓库特有的API,只需要仓库兼容JSR- 170 可以通过 JSR-170 访问。
(2)提供了更高的灵活性和交换能力,解决了分布式集成问题。由于提供了一个抽象层,JCR具有更高层次的cms产品和内容存储工具的混合和匹配。灵活性和交换能力此外,它还可以简化分布式应用程序不同部分之间的集成,即一个简单的仓库可以服务多个客户端(前提是它们使用 API),反过来,单个应用程序也可以更轻松地访问不同的仓库。企业使用cms,无需花钱在不同类型的cms内容仓库之间进行转换[1]。-7-(3)实现将内容访问与存储仓库解耦,延长cms的生命周期cmssystem 存储解决方案 内容访问和存储内容分离后,应用的某些部分或内容存储机制的变化不会影响其他部分。这样,JCR 可以减少购买cms相关产品的风险:当过时或性能不佳的软件被禁止时,底层内容仓库几乎没有变化。此外,如果您可以为 Legacy 应用程序构建或购买 JCR 桥接器,那么原创(legacy)存储解决方案的生命周期将会延长。对于cms厂商来说,不需要自己开发内容仓库,而是专注于cms应用的开发。当然,JCR 技术普及的局限性使 JCR 成为一个项目。开发过程中的技术在现阶段在cms领域普及时有一定的局限性:(1)JCR现阶段在cms市场很难实现。因为市场上的内容仓库缺乏统一的 API,JCP 要求要想在市场上站稳脚跟,必须采取两个重要步骤:必须重写cms 应用程序以通过 API 请求或提交内容;必须使用通用的企业内容存储技术建立连接器或扩展。
当然,上述目标不是一蹴而就的,因为直到人们认同JCR是一项关键技术,cms市场和内容存储公司才会投资JCR。 (2)JCR实施带来的风险cms采用JCR的厂商也可能面临微软在转换为XML格式时遇到的问题:如果微软开放自己的格式,公司必须提前升级周期,让客户满意内容管理系统(cms)摆脱过去单一专利模式的必然趋势,朝着更加灵活和可互操作的模式迈进。实现cmsstack不同层的互操作,JCR是这个过程中的重要一步,这有利于每个公司建立自己的cms方案,有利于开发者在上面的操作。另外,虽然有些公司在前进的道路上会遇到困难,但对cms行业整体是有利的。5.JSR-170的应用前景虽然JSR-170在2005年5月就已经在工作了Java 内容仓库不会终止。 JSR-283 是 JSR-170 的继任者,它将侧重于功能增强,例如远程支持、客户端/服务器协议映射和扩展内容模型的能力。同时,还有一些JSR之外的想法和项目:绑定/映射框架,可以将java类转换成JCR树,反之亦然(类似于ORM,后端使用Java内容仓库而不是数据库),建立在 JCR 服务器等之上的 WebDAV
针对不同产品的 JSR-170 连接桥已经出现,例如 Alfresco、BEA Portal Server 和 IBM Domino[3]。显然,JCR的应用前景一片光明。 6.总结本文分析了java内容仓库的存储模型和原理结构,结合一个新闻发布系统的例子来说明它在cms领域的应用,分析了该技术的优势和局限性以及前景它的前景。 -8- 参考文献 [1] Sunil Patil,什么是 Java 内容存储库,