開發我們的例子程式
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 榮浩原創,非常感謝!