当前位置: 首页 > 编程日记 > 正文

什么是JAVA内容仓库(Java Content Repository)(3)

开发我们的例子程序
jackrabbit已经配置好了,现在让我们来创建我们的示例程序。这个例子程序将调用JCR-170 API。很显然,我们需要做两件事情:一个是作为后台的对数据进行增删改查(持久层),另一个是开发相对应的UI界面(WEB 层)。首先,让我们定义一个DAO接口。这个接口BlogEntryDAO.java 如下:
public interface BlogEntryDAO {
    
public void insertBlogEntry(BlogEntryDTO blogEntryDTO)
        
throws BlogApplicationException;
    
public void updateBlogEntry(BlogEntryDTO blogEntryDTO)
        
throws BlogApplicationException;
    
public ArrayList getBlogList()
        
throws BlogApplicationException;
    
public BlogEntryDTO getBlogEntry(String blogTitle)
        
throws BlogApplicationException;
    
public void removeBlogEntry(String blogTitle)
        
throws BlogApplicationException;
    
public ArrayList searchBlogList(String userName)
        
throws BlogApplicationException;
    
public void attachFileToBlogEntry(String blogTitle, InputStream uploadInputStream)
        
throws BlogApplicationException;
    
public InputStream getAttachedFile(String blogTitle)
        
throws BlogApplicationException;
}

正如你看到的,这个接口提供了增删改查的方法,同时还提供了两个方法来处理附件。接下来,我们需要一个DTO对象用来在两个层之间传递数据。
public class BlogEntryDTO {

    
private String userName;
    
private String title;
    
private String blogContent;
    
private Calendar creationTime;

    
//Getter and setter methods for each of these properties        
}

这里我们将仅仅讨论持久层。

连接jackrabbit
现在,第一件事情是开发一个组件,获得一个到jackrabbit内容仓库的连接。为了简单,我们将在程序启动的时候获得这个连接,然后在程序停止的时候释放这个连接。这里我们使用了Struts ,所以我们需要开发一个PlugIn 类。如下:
public class JackrabbitPlugin implements PlugIn{
    
public static Session session;
    
public void destroy() {
        session.logout();
    }
    
public void init(ActionServlet actionServlet, ModuleConfig moduleConfig) 
    
throws ServletException {
        
try {
            System.setProperty(
"org.apache.jackrabbit.repository.home",
                
"c:/temp/Blogging");
            Repository repository 
= new TransientRepository();
            session 
= repository.login(new SimpleCredentials("username",
                    
"password".toCharArray()));
        } 
catch (LoginException e) {
            
throw new ServletException(e);
        } 
catch (IOException e) {
            
throw new ServletException(e);
        } 
catch (RepositoryException e) {
            
throw new ServletException(e);            
        }
    }
    
public static Session getSession() {
        
return session;
    }
}

init()方法将会在程序启动的时候调用,destroy()将会在程序停止的时候调用。我们在init()方法里获得了到jackrabbit内容仓库的连接。看看代码,我们做的第一件事是设定了org.apache.jackrabbit.repository.home这个系统属性,在上篇文章里提到,这个属性是用来指向我们的内容仓库主目录。这里我们设定它为c:/temp/blogging。接下来,我们创建了TransientRepository的一个实例。这是jackrabbit提供的类,它提供了一个到内容仓库的代理。它在第一个session 打开的时候自动启动内容仓库,在最后一个session 关闭的时候自动关闭内容仓库。
一旦我们获得了一个内容仓库对象,我们就可以调用它的login() 方法来打开一个连接。login() 方法需要一个Credential 对象作为参数。如果Credential 对象是NULL,jackrabbit会认为其他的机制做了这个验证(比如JAAS)。login() 方法还可以传入一个workspace名字作为参数,如果不传入这个参数,jackrabbit会返回一个session对象指向默认的workspace。注意workspace和session是一对一的,即一个session仅对应一个workspace。(注:如果不传入Credential对象,返回的session对workspace是只读的)

增加内容
连接已经建立起来了,下面让我们实现BlogEntryDAO这个接口。第一个我们想实现的方法是插入数据 insertBlogEntry()
public void insertBlogEntry(BlogEntryDTO blogEntryDTO)
            
throws BlogApplicationException {
        Session session 
= JackrabbitPlugin.getSession();
        Node rootNode 
= session.getRootNode();
        Node blogEntry 
= rootNode.addNode("blogEntry");
        blogEntry.setProperty(
"title", blogEntryDTO.getTitle());
        blogEntry.setProperty(
"blogContent", blogEntryDTO.getBlogContent());
        blogEntry.setProperty(
"creationTime", blogEntryDTO.getCreationTime());
        blogEntry.setProperty(
"userName", blogEntryDTO.getUserName());            
        session.save();
}

首先获得session 对象,即到内容仓库特定workspace的连接。然后,我们在这个session 对象上调用getRootNode() 方法,获得这个workspace的根节点,这个根节点的路径是("/").一旦我们获得这个根节点,我们就可以通过addNode()方法在这个根节点下增加新的子节点。新节点的名字是blogEntry. 通过setProperty() 方法我们把数据存储到节点的property里。正如我们先前说明的,真实的数据是存储在property元素里,property元素是叶子。
注意session.save() 这行代码。这个方法是必须调用的,这个方法调用之前,任何 Node,Property的改变都被保存在这个session的一个临时区域里,其他的和该session连接到相同workspace的session都看不到这些改变。当这个方法被调用并被成功执行后,这些Node,Property的改变才会被持久化到这个session关联的workspace里,同时所有与这个workspace关联的session才可见这些变化。相对应的,Session.refresh(false)将会丢弃所有这些改变。item.save()和Item.refresh(false)作用相似,只是影响范围限定在单个Item上(注意,包括它的子节点)

http://www.blogjava.net/ronghao 荣浩原创,非常感谢!

转载于:https://www.cnblogs.com/SingleCat/archive/2008/09/26/1299720.html

相关文章:

Cygwin-添加到右键菜单脚本--一键安装、卸载

平时习惯用一些linux命令来完成工作,在Windows上有cygwin和gitbash两个选择。这两个我都装了。 相对来说cygwin支持的功能更多一些,但是它没有默认绑定到右键菜单。为此,我想到用万能的注册表解决这个事情。网上搜索了一下,把我眼…

在博客园安家了

终于找到自己的网上家园了。。哈哈。。 虽然早就注册了博客园,不过一直都在忙。没有时间整理。以后我会把自己学到的东西慢慢的发表到网上,和大家交流。 也会把一些自我感觉经典的东西放在园子中,方便大家学习。 总之,我以后会加油…

***WindowsXP常用的七种方法

第一招、屏幕保护 在Windows中启用了屏幕保护之后,只要我们离开计算机(或者不操作计算机)的时间达到预设的时间,系统就会自动启动屏幕保护程序,而当用户移动鼠标或敲击键盘想返回正常工作状态时,系统就会打开一个密码确认框&#…

小程序全局状态管理,在页面中获取globalData和使用globalSetData

GitHub: https://github.com/WozHuang/mp-extend 主要目标 微信小程序官方没有提供类似vuex、redux全局状态管理的解决方案,但是在一个完整的项目中各组件的数据一致性是必须要保证,因此需要开发一个能够实现小程序全局状态管理的解决方案。 设计思路 参…

谈 三层结构与MVC模式的区别

谈 三层结构与MVC模式的区别 在CSDN和园子里有朋友谈到三层与MVC的区别,以前也有人抛出这个问题,本人对来公司面试的朋友也偶乐会提这方面的问题。 那么我也来讲讲我对这两者的理解吧。 首先对这个题目,本身是存在问题的,…

学习自定义组件

React入门介绍-ReactDOM.render() 蚂蚁设计-组件 React入门-ReactDOM.render()介绍 node.js和npm的关系

如何焊接电路板

今天主要想给大家分享一下焊接电路板的经验,作为一个电子工程师,焊接电路板是一个基本活,要不你很多东西都要麻烦到别人,这样就不好了,而今天要分享的是如何焊接贴片,在焊接从多的电路板中,我想…

加入新e时代建站网后,我可以做什么

加入原动力建站网后,您便开始了自由而浪漫的原动力建站网生活。您可以:选择自由的时间学习,跟您的上级交流,请教;选择自由的时间工作;自由的发展,整个互联网任您自由发挥;从实践中学…

[BZOJ2502]清理雪道 有上下界网络流(最小流)

2502: 清理雪道 Time Limit: 10 Sec Memory Limit: 128 MBDescription 滑雪场坐落在FJ省西北部的若干座山上。从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。你的…

学习API网关遇到的名词

VPC浅谈 VPC全称“虚拟私有云”,是一个公共云计算资源的动态配置池。虚拟私有云在概念上类似于虚拟专用网,需要使用加密协议、隧道协议和其他安全程序,在民营企业和云服务提供商之间传输数据。一个虚拟专用网可以被用来在公共网,…

RXJAVA之变换操作

RXJAVA提供了以下变换操作&#xff0c;对Observable的消息进行变换操作&#xff1a; 1.window 定期将来自Observable的数据分拆成一些Observable窗口&#xff0c;然后发射这些窗口&#xff0c;而不是每次发射一项。 Observable<String> observable Observable.just(&quo…

java中xxe漏洞修复方法

java中禁止外部实体引用的设置方法不止一种&#xff0c;这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的&#xff01;最早是有朋友在群里发了如下一个pdf&#xff0c; 而当时已经是2019年1月末了&#xff0c;应该不是2018年7月份那个引起较大轰动的…

模式6--ReadWriteLock

来至《java多线程设计模式》 自己提供一个逻辑锁代替JDK的物理锁synchronized 优点&#xff1a;1.对read操作不进行共享互斥&#xff0c;可以进行多个read操作&#xff0c;提高系统性能 2.适合read》write的情况 package Sample;public final class ReadWriteLock {private int…

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。...

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 无法显示 XML 页。 使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 ----------------------------------------------------------------…

JDK的安装与系统环境变量的配置

一、下载JDK 用户进入到Java SE的下载网页后&#xff0c;根据自己所用的操作系统&#xff08;Windows、Linux&#xff09;和位数&#xff08;32位、64位&#xff09;选择不同的链接进行下载。本例是在Windows系统的32位机器上开发的&#xff0c;所以下载的是jdk-8u161-windows-…

docker redis 多个实例

Docker运维笔记-Docker端口映射 - 恶性佛 - CSDN博客https://blog.csdn.net/qq_29994609/article/details/51730640 利用 Docker 在一台机器上部署多个 Redis 实例 - HeatDeath的博客 - CSDN博客https://blog.csdn.net/HeatDeath/article/details/80364340 Docker命令详解 - iV…

Dojo QuickStart 快速入门教程 (1) Why Dojo

Dojo 是一个用来构建 Web 应用的 JavaScript 工具包&#xff0c;当然是开源的。它的目标是通过提供一组特别构造的 API 和一系列辅助工具&#xff0c;使你能在较短的时间里把想法变为实现&#xff0c;同时改善你的日常 Web 开发体验。它是快速的(lightning fast)、健壮的(light…

css3-transform

转载于:https://www.cnblogs.com/cyany/p/7594143.html

C#操作注册表

using Microsoft.Win32 ;以下从‘读’‘写’‘删除’‘判断’四个事例实现对注册表的简单操作 1.读取指定名称的注册表的值 private string GetRegistData(string name) { string registData; RegistryKey hkml Registry.LocalMachine; RegistryKey software hkml.OpenSubKey…

Red Hat Linux 安装教程

一、下载链接 链接&#xff1a;https://pan.baidu.com/s/1JShQmOrgGG5_uaqPUuaHLg 提取码&#xff1a;ture 二、安装步骤 1、打开虚拟机&#xff0c;单击“创建新的虚拟机”&#xff1b; 2、在出现的“新建虚拟机向导”窗口中&#xff0c;选择默认的“典型&#xff08;推荐&…

Spring中利用applicationContext.xml文件实例化对象和调用方法

Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘&#xff0c;链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q  提取码: shjd &#xff1b; 2.在eclipse中创建javaweb项目 1.第一次创建javaWEB项目操作步骤 1&#xff09;eclipse中运行javaWE…

图形文件元数据管理工具exiv2

图形文件元数据管理工具exiv2图形文件通常都包含多种元数据&#xff0c;如Exif、IPTC、XMP。这些信息往往是渗透人员收集的目标。为了便于管理这些信息&#xff0c;Kali Linux内置了专用工具exiv2。该工具支持24种文件格式&#xff0c;包括JPEG、TIFF、PNG、GIF、PSD、TGA、BMP…

什么是LAN(局域网)

一、局域网 局域网&#xff08;Local Area Network&#xff09;&#xff0c;简称LAN&#xff0c;是指在某一区域内由多台计算机互联成的计算机组。“某一区域”指的是同一办公室、同一建筑物、同一公司和同一学校等&#xff0c;一般是方圆几千米以内。局域网可以实现文件管理、…

网络编程-粘包

粘包问题的产生 TCP流式协议 基于数据流的协议 接收方产生粘包问题 1.接收方不清楚数据有多长只接收了数据的一部分 2.接收方多读取了数据 发送方产生的粘包问题 操作系统没有及时发送前一次的数据&#xff0c;导致两次数据粘在一起 粘包问题的根本原因是接收方不清楚数据的长度…

Linq基础知识小记二

书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法. 1、方法语法 方法语法就是通过扩展方法和Lambda表达式来创建查询 (1)、链式查询 这种查询方式很多语言都支持,通过一段实例,介绍Linq的链式查询.需求如下:找出字符串数组中含有字母e的字…

Linux查看文件内容的5种方式

目录 1. more指令 —— 分页显示文件内容 2. less指令 —— 可以向前或向后查看文件内容 3. head指令 —— 查看文件开头的内容 4. tail指令 —— 显示文件尾部的内容 5. cat指令 —— 显示文件内容 1. more指令 —— 分页显示文件内容 more指令会以一页一页的形式显示文…

通过病毒名称识病毒

很多时候大家已经用杀毒软件查出了自己的机子中了例如Backdoor. RmtBomb.12 、Trojan.Win32.SendIP.15 等等这些一串英文还带数字的病毒名&#xff0c;这时有些人就懵了&#xff0c;那么长一串的名字&#xff0c;我怎么知道是什么病毒啊&#xff1f; 其实只要我们掌握一些病…

MySQL相关命令

目录 1、MySQL登录命令 2、MySQL查看系统中有哪些数据库 3、查看当前使用的数据库 4、 更换&#xff08;或者使用&#xff09;指定的数据库 5、查看当前数据库中已经存在的表格 6、查看表结构 7、查看MySQL版本信息 8、创建数据库 9、删除数据库 10、选择数据库 11、…

[Linux] 010 权限管理命令 chmod

1. 权限管理命令&#xff1a;chmod 命令名称&#xff1a;chmod命令英文原意&#xff1a;change the permissions mode of a file命令所在路径&#xff1a;/bin/chmod执行权限&#xff1a;所有用户语法&#xff1a; chmod [{ugoa} {-} {rwx}] [文件或目录] [mode421] [文件或目录…