BEA Weblogic Portal內容管理的幾點開發經驗 原文轉自:http://www.anti-gravitydesign.com
1.BEA Weblogic Portal 8.1內容管理概述
BEA Weblogic Platform 8.1將所有在門戶中顯示的內容包括文本、HTML、圖形以及多媒體文件等都統一存儲在內容庫中,稱為BEA虛擬內容庫(BEA VCR)。所有的內容組織成層次結構,虛擬內容庫(VCR)是內容管理系統的頂層節點,接下來是內容庫,這些內容庫可以是多個BEA內容庫、第三方內容庫以及用戶自定義的內容庫。再下面就是層次節點(相當于文件夾)和內容節點(相當于文件)。如下圖:
圖1 BEA虛擬內容庫的層次結構圖
BEA內容庫在數據庫中由CM_開頭的5個表組成,其E/R圖如下:
圖2 BEA內容存儲數據庫的E/R圖
CM_NODE表存儲的是各個節點(包括層次節點和內容節點)的信息及其在整個內容庫中的位置。CM_OBJECT_CLASS表示的是各個節點的模式,也就是不同內容類型的定義。各種類型的內容又是由一系列屬性來表示的,CM_PROPERTIY_DEFINITION 存儲的就是所有內容類型的各種屬性的定義。CM_PROPERTY存儲的是每一個具體節點所有屬性的值。
BEA Repository是與某個特定的服務器域(Server Domain)相對應的,在配置domain時,BEA Weblogic的服務器域模板就會自動在數據庫中生成內容庫的各種數據表。通過Workshop開發Portal應用時會自動生成Portal管理程序,通過該管理程序可以直接完成內容類型定義,內容節點的創建、修改以及刪除等基本的內容創建和管理功能。而且作為Portal管理的一部分,還可以對內容管理進行委托管理??梢哉f應用起來,是很方便的,但在企業級Portal的開發中,這些基本的內容管理功能是不夠的。BEA還在com.bea.conten.*中提供了一系列API,這些API不僅是BEA實現內容管理的核心,也是用戶二次開發的基礎。但遺憾的是BEA在這方面的文檔相當少,同時Platform 8.1發布時間又不長,因此本文作者在開發國家電子政務試點示范項目綿陽市電子政務門戶系統的過程中,通過摸索和實踐,積累了幾點開發經驗,現整理出來,希望能對BEA Platform 8.1開發的同好有所幫助。
2.通過Java類或JSP直接進行內容管理
在我們的項目中,內容管理是用戶使用較頻繁的一部分。雖然Workshop為Portal應用自動生成的Portal管理程序中已具有內容管理模塊,但是我們發現它卻不能很好地滿足最終用戶的需求,他們需要更加直觀和操作便捷、功能簡練而又能最大限度地滿足日常內容管理要求的Portal內容管理界面。于是,我們按照用戶的實際情況對BEA的內容管理進行二次開發,現摘出其主要的開發過程與大家探討。
在程序中操作Repository概括起來有以下幾個步驟:首先,構造一個RepositoryManager類的實例;接下來,通過分別調用getObjectClassOps()方法和getNodeOps() 方法得到該實例的ObjectClassOps接口和NodeOps接口;然后即可使用接口中相應的方法實現對ObjectClass (類型)或Node(節點)的操作了。
BEA Repository中的目錄和內容條目都是以節點的形式來組織的,若是目錄管理就調用操作目錄節點的方法,若是內容條目管理就調用操作內容節點的方法。下面列舉部分程序代碼:
//得到ObjectClassOps接口和NodeOps接口
Try {
RepositoryManager rMgr = RepositoryManagerFactory.connect ( );
ObjectClassOps ocOps = rMgr.getObjectClassOps();
NodeOps nOps = rMgr.getNodeOps ( );
}
catch (Exception e) {
……
}
//以’BEA Repository’為根目錄,創建自己的子目錄
ID RootID = new ID ( "BEA Repository", "" );
String DirNodeName = “dir1”;
Node DirNode = nOps.getNode ( "/BEA Repository/ " + DirNodeName );
if (DirNode == null ){
Try {
DirNode = nOps.createHierarchyNode ( RootID, DirNodeName);
}
catch (Exception e) {
……
}
}
//先取得要添加內容所屬Type的ObjectClassID
//假設該Type的名稱為”type1”
String typeName = " type1";
ObjectClass[] objectClasses = null;
String CurObjectClassID = null;
try{
objectClasses = ocOps.getObjectClasses();
}
catch(Exception e){
……
}
int i;
for (i=0; i
}
if(i < objectClasses.length){
CurObjectClassID = objectClasses[ i ].getId().toString();
}
else{
//該類型不存在,另做處理并退出,return
}
//在目錄下添加內容條目
/*
*假設 type1共有2個Property, 分別是:
* -----------------“title”(String)
* -----------------“content”(String)
*/
String ContentNodeName = “內容條目1”;
ID DirNodeID = DirNode.getId ( ); //取得父節點的ID
Property [ ] prp = new Property[2];
Value TitileValue = new Value ( “標題” );
Value ContentValue = new Value ( “內容” );
prp [0] = new Property ( “title”, TitleValue );
prp [1] = new Property ( “content”, ContentValue )
try{
nOps.createContentNode (DirNodeID, ContentNodeName, CurObjectClassID, prp );
}
carch(Exception e){
……
}
//刪除內容條目
Node ContentNode = nOps.getNode ( "/BEA Repository/ " + ContentNodeName)
if (ContentNode != null ) {
try {
ID ContentNodeID = ContentNode.getId ( );
nOps.deleteNode (ContentNodeID );
}
catch (Exception e) {
……
}
}