开发我们的例子E序
jackrabbit已经配置好了Q现在让我们来创建我们的CZE序。这个例子程序将调用JCR-170 API。很昄Q我们需要做两g事情Q一个是作ؓ后台的对数据q行增删ҎQ持久层Q,另一个是开发相对应的UI界面QWEB 层)。首先,让我们定义一个DAO接口。这个接口BlogEntryDAO.java 如下Q?br />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;
}
正如你看到的Q这个接口提供了增删Ҏ的方法,同时q提供了两个Ҏ来处理附件。接下来Q我们需要一个DTO对象用来在两个层之间传递数据?br />public class BlogEntryDTO {
private String userName;
private String title;
private String blogContent;
private Calendar creationTime;
//Getter and setter methods for each of these properties
}
q里我们仅仅讨论持久层?br />
q接jackrabbit
现在Q第一件事情是开发一个组Ӟ获得一个到jackrabbit内容仓库的连接。ؓ了简单,我们在E序启动的时候获得这个连接,然后在程序停止的时候释放这个连接。这里我们用了Struts Q所以我们需要开发一个PlugIn cR如下:
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内容仓库的连接。看看代码,我们做的W一件事是设定了org.apache.jackrabbit.repository.homeq个pȝ属性,在上文章里提到Q这个属性是用来指向我们的内容仓库主目录。这里我们设定它为c:/temp/blogging。接下来Q我们创ZTransientRepository的一个实例。这是jackrabbit提供的类Q它提供了一个到内容仓库的代理。它在第一个session 打开的时候自动启动内容仓库,在最后一个session 关闭的时候自动关闭内容仓库?br />一旦我们获得了一个内容仓库对象,我们可以调用它的login() Ҏ来打开一个连接。login() Ҏ需要一个Credential 对象作ؓ参数。如果Credential 对象是NULLQjackrabbit会认为其他的机制做了q个验证Q比如JAASQ。login() Ҏq可以传入一个workspace名字作ؓ参数Q如果不传入q个参数Qjackrabbit会返回一个session对象指向默认的workspace。注意workspace和session是一对一的,即一个session仅对应一个workspace。(注:如果不传入Credential对象Q返回的session对workspace是只ȝQ?br />
增加内容
q接已经建立h了,下面让我们实现BlogEntryDAOq个接口。第一个我们想实现的方法是插入数据 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 对象Q即到内容仓库特定workspace的连接。然后,我们在这个session 对象上调用getRootNode() ҎQ获得这个workspace的根节点Q这个根节点的\径是Q?/"Q?一旦我们获得这个根节点Q我们就可以通过addNode()Ҏ在这个根节点下增加新的子节点。新节点的名字是blogEntry. 通过setProperty() Ҏ我们把数据存储到节点的property里。正如我们先前说明的Q真实的数据是存储在property元素里,property元素是叶子?br />注意session.save() q行代码。这个方法是必须调用的,q个Ҏ调用之前QQ?Node,Property的改变都被保存在q个session的一个时区域里Q其他的和该sessionq接到相同workspace的session都看不到q些改变。当q个Ҏ被调用ƈ被成功执行后Q这些Node,Property的改变才会被持久化到q个session兌的workspace里,同时所有与q个workspace兌的session才可见这些变化。相对应的,Session.refresh(false)会丢弃所有这些改变。item.save()和Item.refresh(false)作用怼Q只是媄响范围限定在单个Item上(注意Q包括它的子节点Q?img src ="http://www.aygfsteel.com/RongHao/aggbug/96065.html" width = "1" height = "1" />
]]>