什麼是JAVA內容倉庫(Java Content Repository)(3) – JAVA編程語言程序開發技術文章

 
開發我們的例子程序
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上(註意,包括它的子節點)
 

發佈留言