壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11996|回复: 3

Portal实现原理(转载)

[复制链接]
发表于 2010/7/1 12:14:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
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; %>  
  • <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; %>  
  • <tr><td>  
  • <% request.getRequestDispatcher(fileName).include(request, response); />  
  • </td></tr>  
  • <% } // end for %>
  • </table>  


2.2 Portlet Interface

下面我们来扩展这个例子。

假设每个Portlet都规定实现一个Portlet接口。

Java代码 <embed width="14" height="15" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" allowscriptaccess="always" quality="high" flashvars="clipboard=interface%20Portlet%20%7B%0A%20%20void%20render(request%2C%20response)%3B%0A%7D%3B%0A%0AMyPage.jsp%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%0A%3C%25%20String%5B%5D%20portletClassNames%20%3D%20(String%5B%5D)session.getAttribute(%E2%80%9Cportlets.config%E2%80%9D)%3B%20%25%3E%0A%3Ctable%3E%0A%3C%25%20for(int%20i%20%3D%200%3B%20i%20%3C%20portletClassNames.length%3B%20i%2B%2B)%20%7B%0A%20%20String%20className%20%3D%20portletClassNames%5Bi%5D%3B%0A%20%20Portlet%20portlet%20%3D%20(Portlet)Class.forName(className).newInstance()%3B%20%25%3E%0A%3Ctr%3E%3Ctd%3E%0A%3C%25%20portlet.%20render%20(request%2C%20response)%3B%20%2F%3E%0A%3C%2Ftd%3E%3C%2Ftr%3E%0A%3C%25%20%7D%20%2F%2F%20end%20for%20%25%3E%0A%3C%2Ftable%3E%0A%0APortlet%E7%B1%BB%E7%9A%84%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81%E5%A6%82%E4%B8%8B%EF%BC%9A%0Apublic%20class%20Portlet7%7B%0A%20%20public%20void%20render(request%2C%20response)%7B%0A%20%20%20%20request.getRequestDispatcher(%E2%80%9C7.jsp%E2%80%9D).include(request%2C%20response)%3B%0A%20%20%7D%0A%7D%3B%0A" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf">

  • 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;  
  •    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当中。
 楼主| 发表于 2010/7/1 12:15:29 | 显示全部楼层
更多关于liferay的合作信息,请登录:www.aukcell.com
 楼主| 发表于 2010/7/1 12:18:34 | 显示全部楼层
更多关于liferay的技术支持,二次开发,企业版,培训等信息,请登录:www.aukcell.com

                                                                                                                        遨豪科技
发表于 2010/8/17 15:57:07 | 显示全部楼层
Liferay门户是世界领先的开源企业门户解决方案,采用最新的Java,J2EE和Web 2.0技术。

运行在任何Java EE应用服务器,servlet容器,数据库和操作系统
现成的组件可用性---60多个portlet可供选择
内建有内容管理系统和协作套件
现成的开发工具盒
基于AJAX用户界面的获奖支持
本地化为22种语言,现成的组件
完全LDAP同步
使用logicLibray的logiscan门户平台套件的最安全门户平台
商用友好的MIT授权协

中国大连Liferay服务

QQ:1417153858 (Liferay支持)
QQ:1410151582 (Liferay培训)
QQ:1492270185 (Liferay企业版)

联系电话:
0411-8489 8263 (总机)
86-15601156692 (咨询)

Liferay中国服务大连QQ群: 49845872

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 06:34 , Processed in 0.015227 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表