本站首页    管理页面    写新日志    退出

The Neurotic Fishbowl

[/*Java*/][转]Portal实现原理
nybon 发表于 2005/3/6 18:44:30

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(); 下面我们换成这种写法。 java代码:  <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> 进一步改进MyPage.jsp。 java代码:  <% 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> 其中的fileNames的内容可以各种各样,只要RequestDispatcher能够处理。 比如Velocity,fileNames = {“1.vm”, “3.vm”, “7.vm”}; 比如URL,fileNames = {“/portlet1.do”, “/portlet3.do”, “/portlet4.do”}; 我们可以看到,如果我们从用户配置中读取fileNames的内容,这就是一个简单的Portal实现。 java代码:  <% 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> 2.2 Portlet Interface 下面我们来扩展这个例子。 假设每个Portlet都规定实现一个Portlet接口。 java代码:  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);   } }; 上述代码是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当中。   相关摘要 (一蓑烟雨任平生)Portal Server的机制与一般的Web Framework是独立的,Portal Server有自己的容器或者引擎来对Portlet进行处理,每个Portlet类似于Servlet。 Portlet现在有两种标准,一种是以Jetspeed为主的老版本,IBM的Websphere Portal Server原先的核心API也采用Jetspeed的API,另一种是目前JCP组织制订的JSR 168标准,BEA和IBM都在自己的产品里实现了该标准,但还没有成熟。IBM的WSAD开发工具里对Portal有两种项目类型,分别支持这两种标准。 可以将Portal做为表现层的一种类型集成到你的Web Framework中。 (一蓑烟雨任平生)Jetspeed是一个门户的应用管理系统,应用程序是构建在Turbine这个Web Framework上面的,可以认为Jetspeed是个用Turbine Framework开发的一个应用程序。 (whitehorse)portal 包括 portal server 和 portlet container ;JSR-168定义了portlet 通用api ,portlet container 的提供商需要遵循这个API,这样开发出的portlet 可以在任何一个实现jsr-168规范的portlet container下顺利移植。 portal server 是各个开发商自行提供的,用来接受用户用求转发给相应的portlet,调整portal page 布局,单点登录等等; portlet container就是在servlet container上又包装了一层,portlet 类似于servlet; portal server 的实现一般采用 web framework 技术来构建; 比如liferay采用了struts + tiles;exo poral 采用了 jsf 等等。 portlet开发在遵循规范的基础上可以采用web framework . (kingkii)free portal server: Jetspeed, liferay, Jportal, etc (flyisland) baichenhong 写道: 我觉的Portal的作用就是整合,故名意思 门户 嘛就是把所有的集成起来放到一起,你有oa,erp,crm 但是你觉得分开使用很不方便,那么好我可以把他们整合到一起,只要你登陆一次就可以使用所有的系统,这应该是一个很有用的东西你短短一句话包含的东西可是超级多。 所谓集成分为很多层次的,Portal关注的是用户集成,包括访问界面、访问手段等。访问界面的集成并不要求应用程序一定要部署在一起。 至于“只要你登陆一次就可以使用所有的系统”,一般称之为单点登陆“Single Sign-on”。Portal服务器基本都提供了认证框架,在此框架下开发的新应用实现SSO是很简单的;但如果对异构的系统进行SSO,这又是一个复杂而庞大的话题了。 (tommy_kin)拖放布局不是Portal的核心技术,只是一个personalize的功能而已,Portal功能在于应用的集成。所谓一站式访问。 参考资料: javaeye论坛内关于Portal讨论的连接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=5159&highlight=Portal 主流企业门户应用性能评测 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,39156*043,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 远程门户网站 Web 服务(WSRP)http://www-900.ibm.com/developerWorks/cn/webservices/ws-wsrp/index.shtml Portlet技术发展的思考http://www.blogbus.com/blogbus/blog/diary.php?diaryid=204304 WSRP实践&想法http://www.blogbus.com/blogbus/blog/diary.php?diaryid=117666 Portal展现机制研究http://www.blogbus.com/blogbus/blog/diary.php?diaryid=357938 Enterprise Portals Suites Portal Power http://www.networkcomputing.com/shared/article/printFullArticle.jhtml?articleID=18900467

阅读全文(3196) | 回复(0) | 编辑 | 精华

 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
 



The Neurotic Fishbowl

.: 公告

This blog focuses on:

Semantic Web && Java Technology


Bloginess

«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31

.: 我的分类(专题)

首页(171)
/*SemanticWeb*/(34)
/*Java*/(74)
/*FreeComments*/(59)
/*Agent*/(4)


In the Bowl

.: 最新日志

The End
使用Google Trends进行选型
怎样才能称为一次新的版本发行?
如何防止RSS信息过载
使用Excel作为用户接口
如何有效地报告Bug
sourceforge再次被封
趣文两篇
编写Firefox扩展
Jetspeed心得随笔


.: 最新回复

回复:Google API与yahoo 
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:Jbpm和Shark比较的feat
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:[转]批判性地看待一种可行的表示技
回复:JIRA破解


The Fishkeeper
blog名称:SW Portal
日志总数:171
评论数量:219
留言数量:8
访问次数:1044173
建立时间:2004年10月30日



Text Me

.: 留言板

签写新留言

路过
路过
页脚问题
RE:请问一下你的主页的下面部分是怎么关
请问一下你的主页的下面部分是怎么关闭的?
我是做Mobile Agent的
Gmail
不错
不错啊小倪同学


Other Fish in the Sea

.: 链接





站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.219 second(s), page refreshed 144761565 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号