Portal Page的呈現
先看一下在JSR168中提到的Portal page,可以了解一個Portal Page上大概有哪些element:
OK...進入本次主題
PSML:
PSML的全名是Portal Structure Markup Language。J2用PSML來定義Portal內的各種resource,包括Page、Folder、Link、Security、Menus等等,有關J2的PSML詳細介紹在此http://portals.apache.org/jetspeed-2/guides/guide-psml.html。
這裡要特別提一下PSML Page。在J2中,一個PSML Page就代表一個Portal page,其根元素為<page>,裡面指定了這個Portal page所包含的portlet及排列方式(ex: 2行或3行)、這個Portal page所使用的樣板(稍後會提到的layout)還有這個Portal page的外觀(稍後會提到的decoration)等等。
另外一個要特別說明的是在PSML Page中所使用的<fragment>這個tag。fragment有portlet和layout二種,用type這個屬性來區別;<fragment type="portlet">代表一個portlet,<fragment type="layout">代表這個page所用的layout;然而不管是哪一種fragment,name屬性的值都應該依照"portlet-app-id::portlet-id"的格式。
以之前範例中的Sample.psml為例,根元素是<page>,所以這是一個PSML Page;第一個<fragment>是layout fragment,指定了這個page所使用的layout,name屬性的值為"jetspeed-layouts::VelocityTwoColumns"。第二個<fragment>就是範例的echo portlet,name屬性的值為"sample::EchoPortlet",就符合之前所描述的格式。
事實上,layout fragment其實也是portlet。看一下C:\tomcat\webapps\jetspeed\WEB-INF\apps\裡有一個jetspeed-layouts目錄,就是J2內部的一個Portlet application。因此"jetspeed-layouts::VelocityTwoColumns"會對到這個目錄下portlet-id為VelocityTwoColumns的portlet。總之,J2的layout也是portlet,如果再研究一下,其實還是個Velocity Bridge的portlet.
layout:
J2中的layout指的是用來排列Portal page中各個portlet的樣板。預設的情況下,J2用Velocity來實現layout。
decoration:
J2中的decoration是用來裝飾Portal page和portlet使其美觀,分為layout-decoration和portlet-decoration兩種。layout-decoration負責一整個Portal page(因此叫page-decoration),而portlet-decoration負責每一個Portlet fragment。預設的情況下,J2用Velocity和CSS來實現decoration。當J2在呈現一Portal page時,會依照這個Portal page指定的layout來排列這個page上的各個portlet,並且使用這個page所指定的layout-decoration和portlet-decoration來美化這個page和所有的portlet。有關decoration的細節可參考http://portals.apache.org/jetspeed-2/guides/guide-decorators.html
Aggregator:
在J2中,一個Portal page的request最後通常會傳給一個Aggregator,然後由Aggregator負責跟Portal page內包含的所有portlet溝通並聚合各個portlet fragment以產生整個Portal page。以之前舉例的jetspeed-pipeline來說(C:\tomcat\webapps\jetspeed\WEB-INF\assembly\pipelines.xml),可以看到aggregatorValve這個bean被注入了org.apache.jetspeed.aggregator.PageAggregator這個Aggregator;再參考C:\tomcat\webapps\jetspeed\WEB-INF\assembly\aggregation.xml中,可已知道這個bean的實作是org.apache.jetspeed.aggregator.impl.PageAggregatorImpl。
來看一下這個PageAggregatorImpl的中用來產生Portal page的方法(部份省略修改):
1 |
public void build( RequestContext context ){
|
首先要注意一下傳入的是一個J2的RequestContext物件,基本上可以視為是用來存放這次request相關資訊的一個context;此外,可以把ContentFragement物件視為portlet。而其中第6行取得root fragment,實際上就是取得前面所說的layout fragment,也就是"jetspeed-layouts::VelocityTwoColumns"這個portlet。
接著再看一下第9行的aggregateAndRender()方法(部份省略修改):
1 |
protected void aggregateAndRender( ContentFragment f, RequestContext context, ContentPage page ){
|
由上面的code,可以了解到J2先把整個page上所有的portlet由外到內串起來,再由內到外一個一個做render的動作,而每render完一個portlet,就加上對應的decoration,直到做完整個page。
在第12行中,render的動作實際上是renderer透過Pluto來呼叫portlet(實際上是ContentFragment物件被包成portlet window)的render方法。PortletRendererImpl.render()這個方法裡使用了常見的Worker Thread和Observer樣式,以達到render多個portlet的功能,有興趣的不妨研究一下。
那如果想要新加外觀呢??最簡單的方式,就是先參考J2的layout portlet寫自已的layout,然後加入decoration。講起來容易,不過layout可是不太容易寫的,因為牽扯到的技術還蠻多,而且對J2也要有一定了解;但是如果能做出來,安裝就不會太麻煩。也許等以後J2紅起來以後,會有各式各樣的外觀可以玩吧...
其他參考資料:
Portal Design Doc : http://portals.apache.org/jetspeed-2/guides/guide-portal-design.html
簡介J2中有關Portal Page的一些概念
Jetspeed Power Tool (JPT) : http://portals.apache.org/jetspeed-2/guides/guide-jpt.html
開發layout和decoration時會用到
Portal Page的呈現的更多相关文章
- portal、portlet、portlet容器三个概念
什么是portal Portlet规范中是这样定义portal的: A portal is a web based application that –commonly- provides perso ...
- Step-by-Step Guide to Portal Development for Microsoft Dynamics CRM - 摘自网络
The Challenge Oftentimes in the world of Dynamics CRM, the need arises for non-CRM users to gain acc ...
- [转]How to mouse hover using Blue prism on a web page
本文转自:https://stackoverflow.com/questions/53126436/how-to-mouse-hover-using-blue-prism-on-a-web-page/ ...
- Asp.net attributes collection
<?xml version="1.0" encoding="utf-8"?><root> <ContralNames> ...
- facebook api介绍
转自(http://sls.weco.net/node/10773) 一.Facebook API 基礎概念 Facebook API 概論 : API 最大的好處在於可以讓程式開發人員只需要根據 A ...
- ASP.NET MVC 5 實作 GridView 分頁
本文用 ASP.NET MVC 5 實作一個 GridView,功能包括: 分頁(paging).關鍵字過濾(filtering).排序(sorting).AJAX 非同步執行,外觀上亦支援 Resp ...
- [R] [Johns Hopkins] R Programming 作業 Week 2 - Air Pollution
Introduction For this first programming assignment you will write three functions that are meant to ...
- ScriptManager的几个属性和方法
ScriptManager的几个属性和方法 一.EnablePageMethods ScriptManager的EnablePageMethods属性用于设定客户端javascript直接调用服务 ...
- SVG开发包, 20 个有用的 SVG 工具,提供更好的图像处理
20 个有用的 SVG 工具,提供更好的图像处理 SVG 现正在 Web 设计领域变得越发流行, 你可以使用 Illustrator 或者 Inkscape 来创建 SVG 图像. 但当进行 Web ...
随机推荐
- sqlserver 视图能否有变量
不能,sqlserver 视图一般不能有变量,也不能带存储过程
- SQL Server 视图修改后有错怎么办?
sp_refreshview 视图名:刷新指定视图 spsqlrefreshallviews:刷新全部视图
- 前端面试题(html篇)
前端面试题(html篇)
- LeetCode Flip Game II
原题链接在这里:https://leetcode.com/problems/flip-game-ii/ 题目: You are playing the following Flip Game with ...
- 计算机管理打不开的解决方法,直接cmd修改reg
复制命令即可: reg add HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\she ...
- 关闭不安全的HTTP方法
关闭不安全的HTTP方法 在项目或tomcat下的web.xml中,添加如下配置: <!-- 关闭不安全的HTTP方法 --> <security-constraint> &l ...
- ios runtime swizzle
ios runtime swizzle @implementation NSObject(Extension) + (void)swizzleClassMethod:(Class)class orig ...
- android中actionbar的title居中
1.配置 activity的主题: android:theme="@style/AppThemeBB" 2. 通过Menu.xml文件布局 添加菜单item menu/menu.x ...
- [MVCSharp]MVC# Overview概述
MVC# Overview概述 Abstract: This article gives an overview of MVC# - a Model-View-Presenter framework ...
- 解决:打开OleView报错 dllregisterserver in iviewers failed
用管理员权限运行OleView.exe即可(Visual Studio Tools\VS20XX开发人员命令提示 -> 用管理员权限运行 -> 输入OleView) http://stac ...