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" );
分享到:
相关推荐
- **BEA WebLogic Portal™**:提供了一套完整的门户解决方案,便于定制和管理企业门户,支持个性化内容和统一的用户界面设计。 - **BEA WebLogic Workshop™**:一个集成开发环境,专为WebLogic平台上的应用程序...
- **BEA Systems 的 WebLogic 产品系列**:用于集成到 BEA 的 WebLogic Portal 等环境中。 以上内容涵盖了 Actuate iServer 系统的主要方面,包括系统架构、安装配置、报表设计、性能调优及第三方集成等方面的知识...
计算机硬件控制_驱动级键盘鼠标同步_PS2接口UDP协议多机协同_基于rabirdwinio和pynput的跨设备输入共享系统_实现多台Windows电脑的键盘鼠标同步操作_支持
嵌入式八股文面试题库资料知识宝典-TCPIP协议栈.zip
少儿编程scratch项目源代码文件案例素材-开膛手杰克.zip
基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现
内容概要:本文详细探讨了电力弹簧技术在主动配电网规划及运行优化调度中的应用。首先介绍了电力弹簧技术作为智能电网调控手段的优势,如自适应性强、响应速度快、节能环保等。接着阐述了主动配电网规划的目标和策略,包括优化电网结构、提高能源利用效率和降低故障风险。随后讨论了运行优化调度的原则和方法,强调了实时监测、智能调度策略以及优化调度模型的重要性。最后通过实际案例分析展示了电力弹簧技术在提升电网稳定性、可靠性和能效方面的显著效果,展望了其广阔的应用前景。 适合人群:从事电力系统规划、运行管理的研究人员和技术人员,以及对智能电网感兴趣的学者和学生。 使用场景及目标:适用于希望深入了解电力弹簧技术及其在主动配电网规划和运行优化调度中具体应用的专业人士。目标是掌握电力弹簧技术的工作原理、优势及其在实际项目中的实施方法。 其他说明:本文不仅提供了理论分析,还有具体的案例支持,有助于读者全面理解电力弹簧技术的实际应用价值。
嵌入式八股文面试题库资料知识宝典-C语言思维导图.zip
电路教学与科研案例的结合—以最大功率传输定理为例.pdf
内容概要:本文深入介绍了HarmonyOS文件系统及其在万物互联时代的重要性。HarmonyOS自2019年发布以来,逐步覆盖多种智能设备,构建了庞大的鸿蒙生态。文件系统作为其中的“数字管家”,不仅管理存储资源,还实现多设备间的数据协同。文章详细介绍了常见的文件系统类型,如FAT、NTFS、UFS、EXT3和ReiserFS,各自特点和适用场景。特别强调了HarmonyOS的分布式文件系统(hmdfs),它通过分布式软总线技术,打破了设备界限,实现了跨设备文件的无缝访问。此外,文章对比了HarmonyOS与Android、iOS文件系统的差异,突出了其在架构、跨设备能力和安全性方面的优势。最后,从开发者视角讲解了开发工具、关键API及注意事项,并展望了未来的技术发展趋势和对鸿蒙生态的影响。 适合人群:对操作系统底层技术感兴趣的开发者和技术爱好者,尤其是关注物联网和多设备协同的用户。 使用场景及目标:①理解HarmonyOS文件系统的工作原理及其在多设备协同中的作用;②掌握不同文件系统的特性和应用场景;③学习如何利用HarmonyOS文件系统进行应用开发,提升跨设备协同和数据安全。 阅读建议:本文内容详实,涵盖了从基础概念到高级开发技巧的多个层次,建议读者结合自身需求,重点关注感兴趣的部分,并通过实践加深理解。特别是开发者可参考提供的API示例和开发技巧,尝试构建基于HarmonyOS的应用。
嵌入式八股文面试题库资料知识宝典-海康嵌入式笔试题.zip
内容概要:本文详细介绍了基于瞬时无功功率理论的三电平有源电力滤波器(APF)仿真研究。主要内容涵盖并联型APF的工作原理、三相三电平NPC结构、谐波检测方法(ipiq)、双闭环控制策略(电压外环+电流内环PI控制)以及SVPWM矢量调制技术。仿真结果显示,在APF投入前后,电网电流THD从21.9%降至3.77%,显著提高了电能质量。 适用人群:从事电力系统研究、电力电子技术开发的专业人士,尤其是对有源电力滤波器及其仿真感兴趣的工程师和技术人员。 使用场景及目标:适用于需要解决电力系统中谐波污染和无功补偿问题的研究项目。目标是通过仿真验证APF的有效性和可行性,优化电力系统的电能质量。 其他说明:文中提到的仿真模型涉及多个关键模块,如三相交流电压模块、非线性负载、信号采集模块、LC滤波器模块等,这些模块的设计和协同工作对于实现良好的谐波抑制和无功补偿至关重要。
基于环比增长的销售统计分析——2019年中青杯全国数学建模竞赛C题.pdf
嵌入式八股文面试题库资料知识宝典-linux面试题.zip
嵌入式八股文面试题库资料知识宝典-linux常见面试题.zip
内容概要:本文探讨了小电流接地系统在配电网络中的应用,特别是在单相故障情况下的仿真分析。文中介绍了小电流接地系统的背景和发展现状,重点讨论了两种常见的接地方式——中性点不接地和中性点经消弧线圈接地。利用Matlab作为仿真工具,作者构建了详细的电路模型,模拟了单相故障的发生过程,并通过多个结果图表展示了故障电流、电压波形及系统运行状态。此外,文章还包括了详细的设计说明书和PPT介绍,帮助读者全面理解仿真过程和技术细节。 适合人群:从事电力系统研究、维护的技术人员,尤其是关注配电网络安全和稳定的工程师。 使用场景及目标:适用于希望深入了解小电流接地系统的工作原理和故障处理机制的专业人士。通过本研究,读者可以掌握如何使用Matlab进行电力系统仿真,评估不同接地方式的效果,优化配电网络的安全性能。 其他说明:随文附带完整的仿真工程文件、结果图、设计说明书及PPT介绍,便于读者进一步探索和实践。
少儿编程scratch项目源代码文件案例素材-激烈的殴斗.zip
嵌入式八股文面试题库资料知识宝典-小米嵌入式软件工程师笔试题目解析.zip