BEA Weblogic Portal内容管理的几点开发经验
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管理的一部分,还可以对内容管理进行委托管理。可以说应用起来,是很方便的,但在企业级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<objectClasses.length; i++){
if(objectClasses[ i ].getName().equals( typeName )) break;
}
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) {
……
}
}
//删除目录
DirNode = nOps.getNode ( "/BEA Repository/ " + DirNodeName)
if (DirNode!= null ) {
try {
ID DirNodeID = DirNode.getId ( );
nOps.deleteNode (DirNodeID );
}
catch (Exception e) {
……
}
}
3.对较大文本内容的发布
在Bea Repository中,一般的文字内容都被存为String类型,不过String类型是有长度限制的,所以不能存储较长的内容。当然,我们可以把较长的内容先编辑成文件,再以Binary类型存入BEA Repository中进行发布。但是,如果用BEA提供的ShowBinaryServlet来显示这种Binary类型的数据,只能是在一个新打开的页面中显示,而不能在自定义页面中进行显示,这就造成了不能按自己的需要定制内容显示的界面。为解决这个问题,我们在在认真研究ShowBinarySeverlet的基础上,开发了自己的Java代码以读取这种Binary内容并在JSP中予以显示。
//"bContent"为存放文本文件的字段
Property property=node.getProperty("bContent");
// 将要用到Property的getPropertyBytes()方法,它必须以transaction的方式来执行
UserTransaction tx;
Context initCtx = new InitialContext();
tx = (UserTransaction)initCtx.lookup("java:comp/UserTransaction");
//通过getPropertyBytes()方法把二进制数据变成流文件
tx.begin();
RepositoryManager repositoryManager = RepositoryManagerFactory.connect();
NodeOps nodeOps = repositoryManager.getNodeOps();
InputStream is = null;
is = nodeOps.getPropertyBytes(node.getId(), property.getId());
tx.commit();
//把输入流中的数据读入缓冲区
InputStreamReader isr = new InputStreamReader(is);
StringBuffer buffer = new StringBuffer();
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
buffer.append((char)ch);
}
in.close();
is.close();
//把缓冲区的内容转换为字符串,为了支持中文还需作编码方式的转换
String str = buffer.toString();
String newStr = new String(str.getBytes(),"gb2312");
4.对中文乱码问题的处理
在开发BEA Portal 8.1内容管理的过程中,我们经常遇到在程序中不能正确对中文进行处理的情况。发生乱码时,中文字符就变成了一个个问号或怪字符(例如图3中的情况),确实比较令人着急。当然,这并不是BEA Portal的问题,因为java中出现中文乱码问题一般都是由于对程序中的编码/解码方式(如:UNICODE编码和其它本地的编码)使用不当所造成,而这些问题本身都是可以通过合理途径加以解决的。
图3 页面中出现了中文乱码
要解决这些问题,首先要搞清楚的是一些常见的字符集编码方式。ISO8859系列是8位的西文字符集(如:ISO8859-1, ISO8859-2等),0~0x7F仍与ASCII字符集保持兼容,大于0x7F的是各种拉丁字符或欧洲字符的扩展;GB2312是简体中文编码方式,BIG5是繁体中文的编码方式,它们表示西文字符时用单字节,表示中文用两个字节,而GBK可以看成是GB2312的扩展;Java中为了便于国际化,它的字符数据都是16位无符号型数据??UNICODE集;而在以英文为主要信息的互联网时代,UNICODE对任何字符都采用双字节表示的方式极其浪费空间,所以在此基础上出现了UTF-8,在UTF-8中,属于US-ASCII中的字符,仍用一个字节表示,且和US-ASCII兼容,其他的字符,则用1(大于0x7F部分)到3个字节。Windows (简体中文版)一般采用GBK字符集,而BEA Weblogic Portal 8.1默认采用UTF-8字符集。
编码(Encode)和解码(Decode)是两个相反的动作。编码是把字符按照某种映射标准(字符集),转换成字节,这时我们把执行编码动作时所采用的标准叫编码(encoding)。而解码则是将字节序列按照某种字符标准(解码,decoding),转换成字符串。如果解码的标准和编码标准不兼容,得出的字符串就是乱码。
当出现java的中文乱码问题时,需要根据具体情况来分析解决。在开发Portal内容管理程序中我们遇到了以下几种出现中文乱码的情况:页面内的中文字符、提交到数据库中的内容、在页面中显示的从数据库中读出的内容和页面之间通过URL传递的中文参数。通过实践和总结,有下面一种比较通用的简单解决方案,即在任何地方都使用GB2312字符集进行编码和解码,可以解决绝大多数中文乱码问题。
1. 在startweblogic.cmd 文件中添加如下代码(使程序编译时按gb2312编码):
%JAVA_OPTIONS% -Dfile.encoding=gb2312;
2. 修改weblogic.xml文件(使页面向服务器发送的内容按gb2312编码):
……
<jsp-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</jsp-param>
……
3. 修改web.xml文件(使页面之间通过URL方式传递的中文参数以gb2312进行编码):
……
<context-param>
<param-name>weblogic.httpd.inputCharset./*</param-name>
<param-value>gb2312</param-value>
</context-param>
……
4. 修改 .portal文件(使portal运行时采用gb2312字符集):
<portal:directive.page contentType="text/html;charset=gb2312"/>
5. 每个jsp的文件头里面都写上如下的语句(使每个页面都采用gb2312字符集):
<%@ page language="java" contentType="text/html;charset=gb2312"%>
6. 如果仍然出现乱码,可再对该乱码字符串使用如下方法进行一次编码方式的转换:
NewString = new String( OldString.getBytes(), "gb2312" );
分享到:
相关推荐
各种应用开发、部署所有关键性的任务,无论是集成各种系统和数据库,还是提交服务、跨 Internet 协作,起始点都是 BEA WebLogic Server。由于 BEA WebLogic Server 具有全面的功能、对开放标准的遵从性、多层架构、...
该技术白皮书详细阐述了WebLogic Portal的核心功能、架构以及开发和管理门户的应用流程。 **技术白皮书** 技术白皮书是一种技术文档,它通常包含对特定技术或产品的深入解释、功能概述、架构分析、实施策略和最佳...
【富国银行部署BEA WebLogic Portal】这篇文章讲述了富国银行如何通过采用BEA的WebLogic Portal技术,改进其IT基础设施,以提升客户服务并优化业务流程。BEA WebLogic Portal是一个关键组件,它构建在SOA(面向服务...
借助其统一的运行时框架、业务服务和生命周期管理技术,WebLogic Portal能够快速响应市场变化,支持数以万计用户的并发访问,并适应不断变化的业务需求和内容更新。 #### Portal性能管理挑战 - **性能考量**:选择...
《BEA WebLogic Server 管理指南》是一本针对BEA公司开发的企业级Java应用服务器WebLogic Server的详尽管理手册。WebLogic Server是业界广泛使用的中间件平台,为企业的应用程序提供部署、管理和监控服务。该指南...
BEA WebLogic Server 管理指南
BEA WebLogic Workshop 8.1 是一个统一、简化、可扩展的开发环境,使所有开发人员都能在 BEA WebLogic Enterprise Platform 8.1 之上构建基于标准的企业级应用,从而提高了开发部门的生产力水平。该产品利用可视化的...
以上内容仅是BEA WebLogic服务器管理的一部分,实际的管理工作中还涉及到集群配置、安全设置、性能调优、故障转移、监控和报警等多方面。理解并熟练掌握这些概念和操作对于有效管理WebLogic环境至关重要。
【BEA WebLogic Portal 10】是一款专为企业构建、管理和优化门户的解决方案,它集成了Web 2.0技术,以提供丰富的交互式用户体验。该产品的主要目标是简化服务导向的定制化门户的生产和管理,帮助企业高效地创造业务...
**BEA WebLogic Server**是Oracle公司之前BEA Systems开发的一款企业级Java应用程序服务器,它提供了全面的Java EE(现在称为Jakarta EE)支持,用于构建、部署和管理分布式网络应用。这本书“BEA WebLogic Server...
IBM WebSphere更适合那些需要全面解决方案,重视管理工具和企业级服务的大型企业,而BEA WebLogic则以其高性能和易用性吸引了许多注重开发效率和运行效率的用户。在进行产品比较时,企业应综合考虑功能、性能、易用...
无论是WebLogic的初学者,还是有经验的开发人员,都能从书中获益。 作者简介 译者:谢俊 编者:(美国)约克姆(Yochem Angela) (美国)卡尔森(Carlson David) (美国)斯蒂芬(Stephens Tad)
本书是WebLogic开发人员的权威参考手册,书中深入探讨了WebLogic Server所提供的功能,并列举了一些最佳开发实践。本书全面介绍了WebLogic在J2EE应用程序的各个方面所完成的任务:从使用servlet、JSP和EJB,到管理...
BEA WebLogic Server 是一款强大的Java EE (J2EE) 应用服务器,它为企业提供了一个可靠的平台来开发、部署和管理分布式应用程序。这篇文档主要针对使用WebLogic Server 6.1版本的开发者,详细介绍了如何在该平台上...
BEAWebLogicServer管理指南
WebLogic Server是BEA(现已被Oracle收购)开发的一款企业级Java EE(Java Platform, Enterprise Edition)应用服务器,它为构建、部署和管理分布式网络应用程序提供了全面的平台。 在WebLogic Server 8.1版本中,...
在"J2EE 应用与 BEA WebLogic Server"这一主题中,我们将深入探讨以下几个核心知识点: 1. **J2EE架构**:理解J2EE的分层架构,包括表示层(Web层)、业务逻辑层(EJB层)和数据访问层(JDBC、JPA)。这三层模型有...
为了帮助管理员维护企业Portal的性能和可靠性,一个有效的管理工具应该监测不仅仅是每个Portal组件和工作流处理,还应监测Portal的运行环境,包含数据库连接,事务服务器,主机系统和其他后端系统。