国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Portal實現(xiàn)原理
Portal實現(xiàn)原理

1.Portal用例
讀者可以在下面三個網(wǎng)站上注冊自己的用戶,體會Portal的功能。
http://my.msn.com
http://my.yahoo.com
http://my.liferay.com

My MSN的功能最靈活強大,用戶可以任意拖放操作欄目(column)和內(nèi)容版塊(content)的位置和個數(shù)。
My Liferay只能選擇固定的欄目(column)布局,但可以在本欄目(column)內(nèi)移動內(nèi)容版塊(content)的位置。
My Yahoo只能選擇固定的欄目(column)布局,而且不能移動內(nèi)容版塊(content)的位置。

Portal的結構分為三層。
(1) Page
(2) Column,或者稱為Pane
(3) Content,或者稱為Portlet

我們來看看Portal的整個操作流程。
(1) 每個Column的下方都有一個[Add Content]按鈕,讓用戶選擇加入自己喜歡的內(nèi)容。
從這里,我們知道,Portal系統(tǒng)里面有一個公用的Common Portlet Repository,供用戶選用。

JSR168 Portlet規(guī)范里面定義了Portlet Deployment Discriptor。Common Portlet Repository以這個Portlet Deployment Discriptor的格式存放。

開源項目JetSpeed的XReg文件用來存放Common Portlet Repository的定義。

(2) 加入Content之后,用戶的Page和Column里面就多了這個Content。下次用戶登陸的時候,就會看到自己訂制的Portal版面。
從這里,可以看出,Portal系統(tǒng)會紀錄用戶的個人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 --> 根據(jù)Portlet ID,從Common Portlet Repository查找詳細的Portlet定義 --> 根據(jù)這個詳細的Portlet定義顯示這個Portlet。

2.Portal實現(xiàn)
我們考慮如何用Java來實現(xiàn)Portal。

2.1 Dynamic Include
首先,我們采用最簡單的思路,我們用100個JSP文件(1.jsp, 2.jsp, 3.jsp, … 100.jsp等),代表100個Portlet。
用戶頁面MyPage.jsp包含用戶選定的多個Portlet。
現(xiàn)在,假設用戶選取的Portlet為1.jsp, 3.jsp, 7.jsp等3個Portlet,那么我們?nèi)绾卧贛yPage.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文件名,不能動態(tài)指定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的內(nèi)容可以各種各樣,只要RequestDispatcher能夠處理。
比如Velocity,fileNames = {“1.vm”, “3.vm”, “7.vm”};
比如URL,fileNames = {“/portlet1.do”, “/portlet3.do”, “/portlet4.do”};
我們可以看到,如果我們從用戶配置中讀取fileNames的內(nèi)容,這就是一個簡單的Portal實現(xiàn)。
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都規(guī)定實現(xiàn)一個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規(guī)范里面定義了真正的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的位置。這時候,頁面中大多數(shù)的Porlet的內(nèi)容是不變的,只有一小塊Portlet變化。
我們需要把Portlet的內(nèi)容緩存起來。Portlet接口有一個render(request, response)方法,我們可以訂制定制response類,截獲portlet的輸出,保存到Portal系統(tǒng)的內(nèi)容Cache當中。
比如,前面提到liferay開源項目,其StringServletResponse類把Portlet的輸出保存到一個String當中。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
問題集錦:Servlets/JSP開發(fā)技術問答
JSP知識匯總
request的setAttribute()怎么用的?
JavaWeb學習篇之
基于 Struts 2 構建 WebSphere Portal 上的 Portlet 應用
liferay 配置文件說明
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服