|
锁定老贴子 主题:Portal实现原理
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
时间:2004-08-22
Portal实现原理
1.Portal用例 读者可以在下面三个网站上注册自己的用户,体会Portal的功能。 http://my.msn.com http://my.yahoo.com http://my.liferay.com My MSN的功能最灵活强大,用户可以任意拖放操作栏目(column)和内容版块(content)的位置和个数。 My Liferay只能选择固定的栏目(column)布局,但可以在本栏目(column)内移动内容版块(content)的位置。 My Yahoo只能选择固定的栏目(column)布局,而且不能移动内容版块(content)的位置。 Portal的结构分为三层。 (1) Page (2) Column,或者称为Pane (3) Content,或者称为Portlet 我们来看看Portal的整个操作流程。 (1) 每个Column的下方都有一个[Add Content]按钮,让用户选择加入自己喜欢的内容。 从这里,我们知道,Portal系统里面有一个公用的Common Portlet Repository,供用户选用。 JSR168 Portlet规范里面定义了Portlet Deployment Discriptor。Common Portlet Repository以这个Portlet Deployment Discriptor的格式存放。 开源项目JetSpeed的XReg文件用来存放Common Portlet Repository的定义。 (2) 加入Content之后,用户的Page和Column里面就多了这个Content。下次用户登陆的时候,就会看到自己订制的Portal版面。 从这里,可以看出,Portal系统会纪录用户的个人Portal配置信息 – User Portal Config。 开源项目JetSpeed的PSML文件用来存放User Portal Config的定义。 ------- 综上。 Add Content的整个流程为: Common Portlet Repository --> Add Content --> Personal Portal Config Display Portal的整个流程为: 从Personal Portal Config读取用户配置的Portlet ID --> 根据Portlet ID,从Common Portlet Repository查找详细的Portlet定义 --> 根据这个详细的Portlet定义显示这个Portlet。 2.Portal实现 我们考虑如何用Java来实现Portal。 2.1 Dynamic Include 首先,我们采用最简单的思路,我们用100个JSP文件(1.jsp, 2.jsp, 3.jsp, … 100.jsp等),代表100个Portlet。 用户页面MyPage.jsp包含用户选定的多个Portlet。 现在,假设用户选取的Portlet为1.jsp, 3.jsp, 7.jsp等3个Portlet,那么我们如何在MyPage.jsp中显示这些Portlet?最直观的做法是,用jsp:include。比如: <table> <tr><td> <jsp:include page=”1.jsp” /> </td></tr> <tr><td> <jsp:include page=”3.jsp” /> </td></tr> <tr><td> <jsp:include page=”7.jsp” /> </td></tr> </table> 由于<jsp:include>只能指定固定的jsp文件名,不能动态指定jsp文件名。我们需要把<jsp:include>翻译为Java code – RequestDispatcher.include(); 下面我们换成这种写法。 [code:1] <table> <tr><td> <% request.getRequestDispatcher(”1.jsp”).include(request, response); /> </td></tr> <tr><td> <% request.getRequestDispatcher(”3.jsp”).include(request, response); /> </td></tr> <tr><td> <% request.getRequestDispatcher(”7.jsp”).include(request, response); /> </td></tr> </table> [/code:1] 进一步改进MyPage.jsp。 [code:1] <% String[] fileNames = {“1.jsp”, “3.jsp”, “7.jsp”}; %> <table> <% for(int i = 0; i < fileNames.length; i++) { String fileName = fileName s[i]; %> <tr><td> <% request.getRequestDispatcher(fileName).include(request, response); /> </td></tr> <% } // end for %> </table> [/code:1] 其中的fileNames的内容可以各种各样,只要RequestDispatcher能够处理。 比如Velocity,fileNames = {“1.vm”, “3.vm”, “7.vm”}; 比如URL,fileNames = {“/portlet1.do”, “/portlet3.do”, “/portlet4.do”}; 我们可以看到,如果我们从用户配置中读取fileNames的内容,这就是一个简单的Portal实现。 [code:1] <% String[] fileNames = (String[])session.getAttribute(“portlets.config”); %> <table> <% for(int i = 0; i < fileNames.length; i++) { String fileName = fileNames[i]; %> <tr><td> <% request.getRequestDispatcher(fileName).include(request, response); /> </td></tr> <% } // end for %> </table> [/code:1] 2.2 Portlet Interface 下面我们来扩展这个例子。 假设每个Portlet都规定实现一个Portlet接口。 [code:1] interface Portlet { void render(request, response); }; MyPage.jsp如下: <% String[] portletClassNames = (String[])session.getAttribute(“portlets.config”); %> <table> <% for(int i = 0; i < portletClassNames.length; i++) { String className = portletClassNames[i]; Portlet portlet = (Portlet)Class.forName(className).newInstance(); %> <tr><td> <% portlet. render (request, response); /> </td></tr> <% } // end for %> </table> Portlet类的示例代码如下: public class Portlet7{ public void render(request, response){ request.getRequestDispatcher(“7.jsp”).include(request, response); } }; [/code:1] 上述代码是Portal显示Portlet的核心流程的一个简化版本。 JSR168 Portlet规范里面定义了真正的Portlet接口定义。 2.3 Portlet Action Portlet的操作包括,最大化/最小化/恢复/关闭/编辑/帮助/上下移动,等等。 这些操作都有对应的Action类。 开源项目JetSpeed的module/actions/controls目录下面包含Maximize, Minimize, Close等Action类。 开源项目Liferay的portal/action目录下面包含Maximize, Minimize, Close等Action类。 Portal的操作不仅包括上述Portlet的操作,而且包括其它更高级别的操作。 比如,Add/Move Page, Add/Move Column, 换Layout, 换Skin,之类。 2.4 Portlet Cache 我们操作Portlet的时候,往往只操作某个特定的Portlet,或者只是变化Portlet的位置。这时候,页面中大多数的Porlet的内容是不变的,只有一小块Portlet变化。 我们需要把Portlet的内容缓存起来。Portlet接口有一个render(request, response)方法,我们可以订制定制response类,截获portlet的输出,保存到Portal系统的内容Cache当中。 比如,前面提到liferay开源项目,其StringServletResponse类把Portlet的输出保存到一个String当中。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2004-08-22
http://forum.javaeye.com/viewtopic.php?t=5506&highlight=Portal
http://forum.javaeye.com/viewtopic.php?t=4413&highlight=Portal http://forum.javaeye.com/viewtopic.php?t=4413&highlight=Portal http://forum.javaeye.com/viewtopic.php?t=5159&highlight=Portal 欢迎应用、研究、实现Portal的程序员一起讨论研究Portal实现的原理,Patteren, Best Practice. |
|
| 返回顶楼 | |
|
时间:2004-08-22
主流企业门户应用性能评测
http://www2.ccw.com.cn/04/0430/d/0430d31_1.asp 几种Portal技术的比较与评述 http://www.ccw.com.cn/cio/research/info/htm2004/20040813_13UNG.asp 4款EIP软件评测揭晓 http://www.zdnet.com.cn/bizstrategy/eb/tech/story/0,3800029745,39156043,00.htm How the portals scored http://www.infoworld.com/article/04/04/30/18FEportalbl_1.html Enterprise Portals Suites Portal Power http://www.networkcomputing.com/shared/article/printFullArticle.jhtml?articleID=18900467 |
|
| 返回顶楼 | |
|
时间:2004-08-24
呵呵,好像对Portal感兴趣的不是很多。
其实你提到的是Portal展现的这一部分,关于这一部分我的看法要更加复杂,等忙过这一阵子我也写写自己的看法。 |
|
| 返回顶楼 | |
|
时间:2004-08-24
最近,我们组也要做一个Portal相关的东西,有问题可以和你们讨论一下。
|
|
| 返回顶楼 | |
|
时间:2004-08-25
以前看过JetSpeed,因为JetSpeed综合了XSL, JSP, Velocity等多种Template。
现在看Liferay, 因为Liferay提供了一个my.liferay.com作为demo。不用自己搭建环境运行整个项目,非常方便。 过一段时间,需要研究Admin功能的时候,就需要自己搭建环境了。 一般来说,如非必要,我懒于在自己的计算机上配置运行项目,尤其是需要数据库配置的项目。 我没有找到My JetSpeed之类的Demo入口。 好像eXo也有自己的my eXo的Demo入口,但exo.org性能好象很差,很难进去。 综合比较的时候,这些项目的环境都要搭起来的。而且,Java Portal开源项目还有好多,值得配置运行、研究比较的项目还不少。事情还真挺多。 大家可以多交流交流各自的经验。 我把liferay的一个portlet块从html中摘取了出来,很长很复杂的html。 效果图和box.html在附件里,供大家参考。 这里我有一个问题和大家一起讨论。 JSR168 Portlet规范的目的是各Portal实现彼此兼容。 一个Portal Server上开发运行的Portlet应该能直接配置到另一个Portal Server中运行。 liferay遵守JSR168 Portlet规范。但我看到,liferay的portlet内容里面调用了特殊的URL形式。 [code:1] <a class="beta" href="http://demo.liferay.net/c/portal/layout?p_l_id=1&p_p_id=10&p_p_action=1&p_p_state=maximized&p_p_mode=view&_10_struts_action=%2Faddress_book%2Fedit_contact">Add Contact</a> [/code:1] 我们看到,这个URL明显是和Liferay Portal Server绑定在一起的。 (且不说/portal/layout这个URL片断,就是p_l_id,p_p_id,p_p_action等参数也是liferay自己定义的。) 只有Liferay Portal Server才知道这个URL的含义,其他的Portal Server根本无法处理这个URL。 我们假设这样的过程,Portal Server遇到不归自己解释的请求,就直接转发给自己管理的portlet,让portlet自己去处理这些请求。 我们可以看到,这种情况也无法通过。参数里面有p_p_state=maximized。 Portal Server需要知道这个最大化的请求,才能够正确地布局,隐藏其他Portlet,只显示着一个Portlet。这就要求Portal Server必须了解p_p_state=maximized的含义。 Portlet的通用性是如何定义和实现的?我看了几款商业Portal Platform的评估(前面的连接),Oracle, Sybase, Sun, IBM, BEA 等,好像Porlet可以在很多J2EE Portal Server之间通用,有些需要加入一定的代码,有些不需要。 |
|
| 返回顶楼 | |
|
时间:2004-08-25
flyisland 写道 呵呵,好像对Portal感兴趣的不是很多。
其实你提到的是Portal展现的这一部分,关于这一部分我的看法要更加复杂,等忙过这一阵子我也写写自己的看法。 http://www.blogbus.com/blogbus/blog/diary.php?diaryid=204304 http://www.blogbus.com/blogbus/blog/diary.php?diaryid=117666 http://www-900.ibm.com/developerWorks/cn/webservices/ws-wsrp/index.shtml thanks flyisland. :-) |
|
| 返回顶楼 | |
|
时间:2004-08-25
呵呵,不会少吧,现在Portal技术已经从前几年的迷糊中渐渐走入明朗
目前正在做门户产品前期的工作,Portal由于其涉及面非常的广,应用的技术也是杂多....... Portlet规范的推出自然使得Portlet部分的工作变得更为简单,但Portal本身的难点还是挺多,如权限设计,页面布局 在页面布局部分现在的考虑是做了一个View层解析框架,使得MVC的层次结构更为的清晰,也使得系统的可理解性增强,象Turbine的View层分层解析机制虽然做的也挺好,不过其具有一定的复杂性 Portal对于Portlet Container的衔接同样是Portal技术的重要一环 还有就是Portal的CMS部分、性能缓存部分、导航部分等等 |
|
| 返回顶楼 | |
|
时间:2004-08-25
BlueDavy 写道 呵呵,不会少吧,现在Portal技术已经从前几年的迷糊中渐渐走入明朗
目前正在做门户产品前期的工作,Portal由于其涉及面非常的广,应用的技术也是杂多....... Portlet规范的推出自然使得Portlet部分的工作变得更为简单,但Portal本身的难点还是挺多,如权限设计,页面布局 在页面布局部分现在的考虑是做了一个View层解析框架,使得MVC的层次结构更为的清晰,也使得系统的可理解性增强,象Turbine的View层分层解析机制虽然做的也挺好,不过其具有一定的复杂性 Portal对于Portlet Container的衔接同样是Portal技术的重要一环 还有就是Portal的CMS部分、性能缓存部分、导航部分等等 看了BlueDavy的Blog,你是使用Turbine控制页面布局吗? 我对Turbine只有一点了解,知道JetSpeed使用Turbine。 你提到了Portal的CMS部分,应该属于Portal的一个CMS Portlet吗? 我看了一些资料,很多Portal Platform提供了现成的Forum Portlet。 另外,导航部分是指哪部分? :-) 看来应用、研究、实现Portal的程序员还是大有人在的。 我想把本论坛中的一些想实现Portal或已经实现Portal的帖子引用在下面。 magicgod 写道 当然可以,我就做过一个,简单地jsp做的一个很简单实用的protal,页面单元的拖拉放,允许自定义栏目.
原来在netscape看过,不过它太复杂了,我总共就用了两个jsp,加上一个管理页面jsp,纯jsp实现,非常简单,曾经被省政府作为亮点,哈哈,看来技术不在复杂,而在应用啊. 但其余的帖子一时还搜不到,记得 冰云 在某个帖子里提到有实现这个大轮子的想法。 |
|
| 返回顶楼 | |
|
时间:2004-08-25
sayor 写道 最近,我们组也要做一个Portal相关的东西,有问题可以和你们讨论一下。
Sayor应该是用Oracle 10G开发Portal吧。 我前面给出的连接。 Enterprise Portals Suites Portal Power http://www.networkcomputing.com/shared/article/printFullArticle.jhtml?articleID=18900467 这个评测根据该组织自己的使用经验,把Oracle Portal排在第一位。易用性,速度都不错。美中不足的是一些Portlet是用PL SQL写的。 Sayor有了第一手应用的经验,多交流交流。 |
|
| 返回顶楼 | |








