`
xgbjmxn
  • 浏览: 271750 次
  • 性别: 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当中。


----------------------
http://forum.iteye.com/viewtopic.php?t=5506&highlight=Portal
http://forum.iteye.com/viewtopic.php?t=4413&highlight=Portal
http://forum.iteye.com/viewtopic.php?t=4413&highlight=Portal
http://forum.iteye.com/viewtopic.php?t=5159&highlight=Portal

欢迎应用、研究、实现Portal的程序员一起讨论研究Portal实现的原理,Patteren, Best Practice.
---------------------------------------
主流企业门户应用性能评测
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
--------------------------------------------
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

------------------------------------------
Sayor应该是用Oracle 10G开发Portal吧。
我前面给出的连接。

Enterprise Portals Suites
Portal Power
http://www.networkcomputing.com/shared/article/printFullArticle.jhtml?articleID=18900467

这个评测根据该组织自己的使用经验,把Oracle Portal排在第一位。易用性,速度都不错。美中不足的是一些Portlet是用PL SQL写的。

----------------------------------
分享到:
评论

相关推荐

    liferay-portal-sql-6.1.1-ce-ga2-20120731132656558

    标题 "liferay-portal-sql-6.1.1-ce-ga2-20120731132656558" 暗示了这是一个关于Liferay Portal 6.1.1社区版(CE GA2)的SQL相关资源,发布日期为2012年7月31日。Liferay Portal是一个开源的企业级内容管理平台,它...

    project-xczx2-portal-vue-ts.zip

    标题 "project-xczx2-portal-vue-ts.zip" 暗示这是一个使用 Vue.js 框架,并结合 TypeScript 开发的项目。Vue.js 是一个轻量级的前端JavaScript框架,以其灵活性、易用性和高性能著称。TypeScript是JavaScript的一个...

    juddi-portal-bundle-3.1.2

    **标题"juddi-portal-bundle-3.1.2"** 指的是JUDDI的3.1.2版本的门户捆绑包。这个版本可能包含了对前一版本的改进和新功能的添加,旨在提高服务注册和发现的效率和可靠性。"门户"在这里可能指的是JUDDI提供的用户...

    apollo-portal-1.4.0-github.zip

    `apollo-portal-1.4.0-sources.jar`包含了Apollo Portal的源代码,对于开发者来说,这是一个宝贵的资源,可以帮助理解其内部实现逻辑,进行定制化开发或排查问题。 `scripts`目录包含了启动和停止Apollo Portal的...

    apollo-portal-1.7.1-github.zip

    如果需要对Apollo Portal进行二次开发,可以查阅apollo-portal-1.7.1-sources.jar中的源代码,了解其工作原理。 阿波罗配置中心的核心特性包括: - **集中式管理**:所有服务的配置都集中在配置中心,方便统一管理...

    apollo-portal-1.6.1-github.zip

    在这个场景中,我们关注的是Apollo-Portal的1.6.1 release版本,它可以从github上获取,压缩包名为"apollo-portal-1.6.1-github.zip"。 1. **Apollo简介** Apollo由携程开源,其设计目标是提供一个高效、稳定、...

    liferay-portal-src-6.0.6-20110225.part2

    liferay-portal-src-6.0.6-20110225.part2

    Portal-for-ArcGIS-10.5安装配置(详细说明)

    Portal-for-ArcGIS-10.5 安装配置 Portal-for-ArcGIS-10.5 安装配置是 ArcGIS 10.5 版本中的一部分,涉及到环境配置、设置 IIS 服务器等详细操作。以下是安装配置的详细说明: 一、环境准备 在安装 Portal for ...

    PyPI 官网下载 | portal-openapi-client-0.2.1.tar.gz

    标题中的"PyPI 官网下载 | portal-openapi-client-0.2.1.tar.gz"表明这是一个在Python Package Index(PyPI)上发布的开源软件包,名为`portal-openapi-client`,版本为0.2.1,且其打包格式是tar.gz。PyPI是Python...

    基于php实现的Intechnic In-portal platform v1.0.7-in-portal107

    基于php实现的Intechnic In-portal platform v1.0.7_in-portal107基于php实现的Intechnic In-portal platform v1.0.7_in-portal107基于php实现的Intechnic In-portal platform v1.0.7_in-portal107基于php实现的...

    apollo-portal-1.7.0-github.zip

    - **apollo-portal-1.7.0-sources.jar**:这个文件包含了源代码,开发者可以查阅源代码来理解Apollo Portal的工作原理或进行二次开发。 - **config**:可能包含了一些默认的配置文件或模板,用于初始化或示例。 - **...

    juddi-portal-bundle-3.1.0.zip

    总结,Juddi-portal-bundle-3.1.0是实现UDDI v3规范的重要工具,结合Tomcat的集成,为开发者提供了高效、灵活的服务注册和发现平台。通过深入理解和运用,开发者能够更好地构建和管理他们的Web服务生态系统。

    TIA-Portal-Options-V19-orderlist订货号

    TIA-Portal-Options-V19-orderlist订货号

    liferay-portal-tomcat-5.5-5.1.1.part4.rar

    liferay-portal-tomcat-5.5-5.1.1.part4.rar

    liferay-portal-tomcat-5.5-5.1.1.part1.rar

    liferay-portal-tomcat-5.5-5.1.1.part1.rar

    liferay-portal-tomcat-5.5-5.1.1.part2.rar

    liferay-portal-tomcat-5.5-5.1.1.part2.rar

    liferay-portal-tomcat-5.5-5.1.1.part3.rar

    liferay-portal-tomcat-5.5-5.1.1.part3.rar

    liferay-portal-src-6.0.6-20110225.part1

    liferay-portal-src-6.0.6-20110225.part1

Global site tag (gtag.js) - Google Analytics