JFoxPortal(JFox门户)开发计划
斜和硕
2023-12-01
(
by huihoo.org JFox项目组)
初稿:Jacky Li (jianhua23@163.com)
1.概述
JSR-168 规范说明:
JSR-168 (Enterprise Portlet Specification 1.0 Final Draft 发表于2003-09-03,将于2003-10-06 Final Approval Ballot)是用于portlet级别开发的新Java portlet标准。依循于 JSR-168的Portlet可以移植于其他的Portal Container上。 JSR-168规范的站点: http://www.jcp.org/en/jsr/detail?id=168
Portlet 说明:
在满足门户可定制性的需求上,引入了门户组件概念Portlet,Portlet是一个可插拔的组件,关于Portlet有各种定义, JetSpeed在提交的JSR-168 portlet API specifications对Portlet的定义如下:
Portlet是一个Web组件,可以被容器管理,可以产生动态内容。 Portlet可以很容易地被插入并且运行于一个Web应用中,Portlet是被设计成聚合大量内容的组合页面,举例:同样一个Portlet,根据不 同的用户,可以产生不同的实例,这些实例中是根据用户设置包含不同的内容,也就是满足用户的可定制性。
2.第一阶段:需求分析及相关文档收集阶段
当前一些 OpenSource Enterprise Portal 分析
JetSpeed
JetSpeed是Apache (http://jakarta.apache.org/jetspeed) 组织的一个开源项目,IBM的WebSphere Portal Server正是基于 JetSpeed进行二次开发。
为了实现门户内容的有效管理和监控,JetSpeed的重要内容组件Slide引入了Domain和Namespace方面的概念,对所有资源进行树形 结构的控制,在Slide中,Domain是一系列Namespace的聚合,它类似文件系统中的"/"根目录, domain 可以控制在其中登记的 Namespace的访问权限以及执行Namespace的初始化和连接等管理工作。
Namespace是个自我独立的有实体内容的容器,它不能包含指向或连接到其它namespace,每个应用系统可以是一个NameSpace, Namespace包含独立的数据和这些数据的安全访问机制。
JetSpeed虽然提供了丰富的Portal技术功能,但是其可定制性比较差,其重要的内容组件Slide也比较难以让人理解,它的安全控制 框架与通用的J2EE使用JAAS不相融合,所有这些都造成了在其基础上进行二次开发的难度。
Liferay
Liferay (http://www.liferay.com) 代表了完整的J2EE应用,使用了Web、EJB以及JMS等技术,特别是其前台界面部分使用Struts 框架技术,基于XML的portlet配置文件可以自由地动态扩展,使用了Web Services来支持一些远程信息的获取,使用 Apahce Lucene实现全文检索功能。
Liferay的缺点是它缺乏一个简单清晰可拓展的架构设计,portlet设计显得比较凌乱,进行二次开发有一定的难度。
JPortal
JPortal (http://jportal.sourceforge.net) 是目前最为符合JSR-168 Spec的Portal实现。他使用了拦截器技术和 Dynamic Proxy来实现Portlet的可插入设计。他目前只是一个原型的实现并且之关注于实现 Portal Container, 并没有过多的 Portlet实现和设计。
优点在于其的架构清晰,易于扩展,但在Portal的工业强度上需求的差距是比较大的,没有分布式的概念是他目前架构的一个致命的 地方。
3.第二阶段:技术选型阶段
目标: 努力克服 Liferay 结构性混乱的问题,实现 Portlet 组件 jar HotSpot 特性。完全符合JSR-168规范。具有工业强度的Portal Container设计。Portal的难点和要点都是将动态功能最大化以及界面的最大可选择性。
MVC层和表述层的技术选型:
Jarkarta Struts 1.1 : http://jakarta.apache.org/struts
说明: MVC B/S 构架实现
Jarkarta Velocity 1.3.1 : http://jakarta.apache.org/velocity
说明: 替代JSP的表述层方案
逻辑层的技术选型:
EJB (Enterprise Java Bean) : 符合 EJB 2.1规范。
说明: 使用EJB的SessionBean和MessageDrivenBean机制,以实现分布式的功能需求。
EJB 服务器 : JBoss Enterprise Server 3.2.x
说明: 开源的J2EE应用服务器,系统会通过XDoclet来实现不同J2EE应用服务器的实现。
数据持久层的技术选型:
Hibernate 2.0.1 : http://www.hibernate.org
说明: 符合JDO 2.0规范的数据持久性技术的实现方案,使用了O/R Mapping技术。
Portlet 实现的技术选型:
JMX (Java Management Extension) 1.3 : http://java.sun.com/products/JavaManagement/
说明: Java管理扩展,是一个为应用程序、设备、系统等植入管理功能的框架。
Jakarta Commons Modeler : http://jakarta.apache.org/commons/modeler.html
说明: 配置组件的模型MBean元信息,还利用一种算法为复杂资源类提供MBean类的基本实现。
日志技术选型:
Jakarta Log4j : http://jakarta.apache.org/log4j
说明: 系统日志的纪录包。
Jakarta Commons Logging : http://jakarta.apache.org/commons/logging.html
说明: 增强系统日志的记录包工具。
测试框架选型:
Junit : http://www.junit.org
说明: 系统代码测试工具。
Jakarta Cactus 1.6 Dev : http://jakarta.apache.org/cactus
说明: J2EE测试框架,测试服务器端的代码。
Web Service 技术选型:
Apache Soap : http://ws.apache.org/soap
说明: Web Service Soap的开源实现,系统基于他来实现相应的Web Service功能。
Apache Axis : http://ws.apache.org/axis
说明: Web Service 框架,是Soap的进一步实现。
其他技术选型:
XDoclet 1.2 Beta 2 : http://xdoclet.sourceforge.net/
说明: AOP(Attribute Oriented Programming)面向属性编程来简化组件之间的连续集成。通过生成部署描述符和支持代码,大大地减少开发时间,是开发人员把重点放在应用程序逻辑代码上。
Ant 1.5.4 : http://ant.apache.org
说明: 源代码批量编译工具。
JDom Beta 9 : http://www.jdom.org
说明: XML 解析工具。
Lucene 1.2 : http://jakarta.apache.org/lucene
说明: 全文本搜索工具包,具有的索引机制。
4.第三阶段:Portal Container 架构设计
异地 Caching 机制构架:
由于Portal技术非常多的依赖于Web Service,而Web Service的网络开销是非常大的。如果每个request都进行网络通讯,无疑性能是很低的。我们需要将一些经常反复使用的状态数据一直保存在内存 中,在有效期内供客户端不断反复访问。使用HashMap保存对象是实现的最基本思路,但是这只能实现单机系统的缓冲机制,一旦Portal的数据量级达 到一定的程度就必须实现多台服务器的"集群"Caching机制。
One Point Login(单点登陆)和权限管理:
单点登陆是Portal的重要技术,权限管理的粒度问题。
5.第四阶段:Portlet 功能性设计
JFox Enterprise Portal Architect Analysis
1.总体结构分析
Portal 是基于 Web 的应用,一般来说,提供个人化、单点登陆、不同来源的内容集合和挂接信息系统的表述层。集合是指在一个Web 页面中集成不同来源的内容的动作。一个Portal必须提供成熟的个人化特性来为用户提供客户化的内容。Portal 也可以有不同类型的portlet来为不同得用户创建相关内容。
2.Portal Container实现分析
Portal 容器运行相应的Portal并提供给他们必须的运行期环境。一个Portlet容器承载Portlet并管理他们的运行期,它同样为Portlet引用提供持久性储存。Portlet容器从Portal获得相应的请求并在Portlet中执行它的请求。
3.良好的EJB设计构架
考虑方面:
JNDI 效率的考量。
4.Portlet 实现分析
基于动态代理技术(Dynamic Proxy)来实现相应的Portlet插入技术。
5.Portal Caching 实现
核心类是org.noah.cache.model.cache,通过构造一个new cache(Object obj),将需要cache的对象赋值进去,就能达到cache的目的,以后通过cache.getObject()可以得到这个对象。为了达到分布式 cache目的,多态Server能共享同样的Cache,使用了数据库来持久化这些cache。
6.考虑做一个Service Framework来提供系统所需要的各种不同的服务,类似于Turbine的Service Framework。