JCR实战篇-JackRabbit

本文介绍了Apache JackRabbit,一个JCR(JSR-170)规范的开源实现,提供了三种部署模式:应用程序内、容器级和服务器模式。详细解析了JackRabbit的配置文件结构,包括FileSystem、Security、Workspaces等元素,并展示了如何使用Java代码进行节点操作。同时,文章还讨论了Spring与JackRabbit的整合,通过RepositoryFactoryBean、JcrSessionFactory和JcrTemplate简化开发。
摘要由CSDN通过智能技术生成

Apache Jakarta 提供了一个JCR 参考实现,称作“Jackrabbit”Jackrabbit 实现了规范的所有级别的所有功能,尽管没有包含访问控制,添加这个功能也是相当容易。Java Content Repository APIJSR-170 )试图建立一套标准的API 去访问内容仓库。Jackrabbit :内容仓库API 标准(Content Repository for Java Technology API ,即 JSR-170 )的一个开源实现项目。

部署 JackRabbit 有三种模式 —— 其它实现可能会不同,但 JackRabbit 的模式比较全。

第一种模式最简单:将 JackRabbit 作为应用程序的一部分,就像使用 Lucene commons-dbcp 一样。这意味着将所有 jar 包放入应用程序 classpath

第二种模式将 JackRabbit 建立为容器级,对容器内所有应用程序可用,通过 JNDI 访问,就像一个数据库连接池。在这种模式下,应用程序仅需使用 JCR API

第三种模式运行一个 JackRabbit 服务器实例,客户端程序通过网络与服务器通信( SOAP DAV RMI ,或其它协议)。

这些模式由简单到复杂:第一种模式最简单,但扩展性最差:仅有一个应用程序能链接到内容仓库(除非你使用多用户存储机制,并且配置为多用户访问), JackRabbit API 必须为每个应用重复部署。第二种模式为容器的所有程序提供 JCR ,因为 JackRabbit 被建立为容器资源;为 JCR 客户提供所有事务管理和其它功能。多数程序员喜欢,因为仅需配置一次 JCR

内容仓库配置文件:一个典型的配置文件如下:

<?xml version="1.0" encoding="ISO-8859-1"?>

<Repository>

    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">

        <param name="path" value="${rep.home}/repository"/>

    </FileSystem>

    <Security appName="Jackrabbit">

        <AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager"/>

              <LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule"/>

       </Security>

    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default" />

    <Workspace name="${wsp.name}">

        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">

            <param name="path" value="${wsp.home}"/>

        </FileSystem>

        <PersistenceManager class="org.apache.jackrabbit.core.state.xml.XMLPersistenceManager" />

    </Workspace>

    <Versioning rootPath="${rep.home}/versions">

        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">

            <param name="path" value="${rep.home}/versions"/>

        </FileSystem>

        <PersistenceManager class="org.apache.jackrabbit.core.state.xml.XMLPersistenceManager" />

    </Versioning>

</Repository>

<Repository> 元素是根元素,包含以下这些元素:

a <FileSystem>: 该元素配置了内容仓库的全局数据存储位置,这些全局数据包括已注册的命名空间,定制的节点类型等等。 JackRabbit 提供了几种选择,一种是像上面例子里配置的存储在本地文件里是 LocalFileSystem 。如果你想把它们存储在数据库里,可以使用 DbFileSystem

b <Security>: 内容仓库的安全配置,它有两个子元素: <AccessManager> <LoginModule> <AccessManager> 配置的类用来判断用户有没有权限来对特定数据执行特定的操作。

c <Workspaces>: 这个元素的配置对所有的 workspace 都通用。它的 rootPath 属性是所有 workspace 文件夹的根目录; defaultWorkspace 属性则包含了 workspace 的默认名。

d <Workspace>: 这个元素是所有 workspace 的默认配置模板。去每个 workspace 文件夹下你都会发现一个 workspace.xml 文件,这个文件和这个元素的配置一模一样。三个子元素: <FileSystem> ,和这个 workspace 相关数据的存储位置; <PersistenceManager> ,这个 workspace 内容节点存储策略; <SearchIndex> ,可选,用于全文检索。

e <Versioning>: 配置一个版本相关的对象。其实 JackRabbit 也是把它作为节点来处理的。

这两个参数可以通过两种方式设置,一种是在仓库实例创建时直接传到 Jackrabbit 里去,一种是间接的通过设置 JNDI object factory

可以设置 org.apache.jackrabbit.repository.home 这个系统属性的值来指定你的内容仓库主目录;也可以设置 org.apache.jackrabbit.repository.conf 这个系统属性的值来指定你的内容仓库配置文件 repository.xml 。如果你不设定这两个参数, Jackrabbit 会把当前目录作为内容仓库主目录,同时,它有一个默认的内容仓库配置文件。

例子一:(添加节点的例子)

package cn.com.jcr;

 

import javax.jcr.Node;

import javax.jcr.Repository;

import javax.jcr.Session;

import javax.jcr.SimpleCredentials;

 

import org.apache.jackrabbit.core.TransientRepository;

 

public class HopFirst {

       public static void main(String[] args) {

              // 创建一个仓库

              Repository repository = null;

              Session session = null;

              try {

                     repository = new TransientRepository();

                     // 创建一个 session

                     session = repository.login(new SimpleCredentials("username",

                                   "password".toCharArray()));

                     // 得到根节点 ( 发现 root 变量, root ,一般树结构的顶层节点叫做 root)

                     Node root = session.getRootNode();

                     // 添加节点数据(仔细看 hello 节点和 world 节点的组织方式,可以发现它是一颗树形结构)

                     Node hello = roo

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值