`
xgbjmxn
  • 浏览: 260371 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

Portal实现原理

阅读更多
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代码  收藏代码

   1. <table> 
   2. <tr><td> 
   3. <% request.getRequestDispatcher(”1.jsp”).include(request, response); /> 
   4. </td></tr> 
   5. <tr><td> 
   6. <% request.getRequestDispatcher(”3.jsp”).include(request, response); /> 
   7. </td></tr> 
   8. <tr><td> 
   9. <% request.getRequestDispatcher(”7.jsp”).include(request, response); /> 
  10. </td></tr> 
  11. </table> 

<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代码  收藏代码

   1. <% String[] fileNames = {“1.jsp”, “3.jsp”, “7.jsp”}; %> 
   2. <table> 
   3. <% for(int i = 0; i < fileNames.length; i++) { 
   4.   String fileName = fileName s[i]; %> 
   5. <tr><td> 
   6. <% request.getRequestDispatcher(fileName).include(request, response); /> 
   7. </td></tr> 
   8. <% } // end for %> 
   9. </table> 

<% 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代码  收藏代码

   1. <% String[] fileNames = (String[])session.getAttribute(“portlets.config”); %> 
   2. <table> 
   3. <% for(int i = 0; i < fileNames.length; i++) { 
   4.   String fileName = fileNames[i]; %> 
   5. <tr><td> 
   6. <% request.getRequestDispatcher(fileName).include(request, response); /> 
   7. </td></tr> 
   8. <% } // end for %> 
   9. </table> 

<% 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代码  收藏代码

   1. interface Portlet { 
   2.   void render(request, response); 
   3. }; 
   4.  
   5. MyPage.jsp如下: 
   6.  
   7. <% String[] portletClassNames = (String[])session.getAttribute(“portlets.config”); %> 
   8. <table> 
   9. <% for(int i = 0; i < portletClassNames.length; i++) { 
  10.   String className = portletClassNames[i]; 
  11.   Portlet portlet = (Portlet)Class.forName(className).newInstance(); %> 
  12. <tr><td> 
  13. <% portlet. render (request, response); /> 
  14. </td></tr> 
  15. <% } // end for %> 
  16. </table> 
  17.  
  18. Portlet类的示例代码如下: 
  19. public class Portlet7{ 
  20.   public void render(request, response){ 
  21.     request.getRequestDispatcher(“7.jsp”).include(request, response); 
  22.   } 
  23. }; 

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当中。
分享到:
评论
1 楼 zhuchao_ko 2011-12-10  

相关推荐

    GridPortal的原理和实现

    GridPortal的原理和实现 GridPortal的原理和实现 GridPortal的原理和实现 GridPortal的原理和实现

    Portal培訓教材之第7章_常见SSO原理及其实现_FromIBM(7)

    IBM Porlet 门户 企业级开发 内部培训 Portal培訓教材_FromIBM(7)

    元器件布局原理

    利用portal 99 实现元器件布局原理,要求和方法。

    华为HCNP-Security LVC公开课培训视频教程汇总集【共3科84集】.rar

    4.2_服务器负载均衡_服务器负载均衡实现原理 4.3_服务器负载均衡_服务器负载均衡配置部署 5.1_防火墙可靠性_IP-Link技术 5.2_防火墙可靠性_BFD技术 5.3_防火墙可靠性_双机热备技术 5.4_防火墙可靠性_Link-Group...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.2.2. 工作原理........................................................................................................................................................... 26 1.3. Seam 中的可点击列表:...

    轻量级单点登录系统源码.rar

    实现原理: 使用使用 形式远程调用单点登录系统上的脚本,获取加密后的用户登录票据信息,自动绑定到当前页表单的相应字段,并自动提交到后台。后台解密前台提交的用户登录票据信息,判定用户是否已在单点登录系统...

    新闻博客系统毕业论文

    [Keywords] the portal system, press releases modules, user management blog 目 录 第1章 绪论 1 1.1 引言 1 1.2 文本的组织 1 1.3 本人做的主要工作 1 第2章 系统开发相关技术概述 3 2.1 B/S开发模式 3 2.2 ...

    轻量级单点登录系统源码

    实现原理: 使用使用&lt;script type="text/javascript" src="http://localhost:7771/SSOSite/SSOContext.aspx?app=portal"&gt; 形式远程调用单点登录系统上的脚本,获取加密后的用户登录票据信息,自动绑定到当前页表单...

    tokenbridge:双向以太坊RSK令牌桥实现

    通过使用联盟将事件从一个合约发送到另一个合约来实现这种互操作性,一旦另一条链上的网桥从联盟接收到该事件,它将在镜像ERC20合约上铸造令牌。 请参阅以了解有关其工作原理的更多信息! 每个合同上的网桥都是可...

    SD大会精品讲座:多核计算中的分布式数据结构

    多核编程专家、CSDN著名博客周伟明先生在本课程中将结合他对多核编程技术的多年研究心得,为您详细分析阐述多核计算中的分布式数据结构原理、实现模式及特点,并对多核编程和单核多任务编程进行了全方位多角度的对比...

    自动化控制技术在无人值守煤炭联合制样系统中的应用

    结合目前煤炭制样的现状,提出可采用以PLC控制为核心的煤炭联合制样机系统,介绍了HMZZX环保型无人值守煤炭联合制样机控制系统的组成、控制原理、工作流程、控制方式和控制要求,并从管理控制一体化、上位机系统、来样...

    H3C 新IT服务《根叔的种子》第三季视频汇总集【华三TAC中心出品】【共40集】.rar

    目录:网盘文件永久链接 ...第36集 Simplivity集群的HA实现与配置 第37集 H3Cloud OS云主机镜像制作指导 第38集 DRNI技术介绍及配置 第39集 服务器的SNMP运维指导 第40集 ADCampus无线业务部署指导

    freeipa-community-portal:[已取消] FreeIPA社区门户扩展

    可以在找到社区门户的基本原理和体系结构的完整概述。 当前状态 该项目目前被放弃。 现在,关于如何实现此功能还有其他想法。 如果您对此功能感兴趣并想继续前进,请在指出您的兴趣,我们可以讨论下一步。

    普联架构设计技术方案.pptx

    二、软件开发平台方案 普联软件开发平台概念 数据存储原理 业务模型及业务搭建原理 指标模型及指标搭建原理 分析模型及分析方法 业务流程管理 BIS平台及开发平台外延 普联架构设计技术方案全文共28页,当前为第2页...

    轻量级单点登录系统

    轻量级单点登录系统源码,实现原理:使用使用 形式远程调用单点登录系统上的脚本,获取加密后的用户登录票据信息,自动绑定到当前页表单的相应字段,并自动提交到后台。后台解密前台提交的用户登录票据信息,判定...

    PLC1200实验报告.docx

    实验目的:掌握s7-1200中定时器计数器的应用并完成相应程序 实验设备:同上 实验原理: 使用定时器指令可创建编程的时间延迟,S7-1200 PLC有4种定时器: TP: 脉冲定时器可生成具有预设宽度时间的脉冲。 TON:接通...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 06.jsonp原理.avi │ 07.发布商品分类查询服务-分析.avi │ 08.发布商品分类查询服务-Service.avi │ 09.发布商品分类查询服务-完成.avi │ 10.跨域调用taotao-rest服务.avi │ 打开必读.txt │ 淘淘商城第五天...

Global site tag (gtag.js) - Google Analytics