kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks
          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>
           10 <% request.getRequestDispatcher(7.jsp).include(request, response); />
           11 </td></tr>
           12 </table>
           13 


          進一步改進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 %>
           10 </table>
           11 


          其中的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[i]; %>
            <tr><td>
            <% request.getRequestDispatcher(fileName).include(request, response); />
            </td></tr>
            <% } // end for %>
           10 </table>
           11 


          2.2 Portlet Interface
          下面我們來擴展這個例子。
          假設每個Portlet都規定實現一個Portlet接口。
          java代碼: 

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


          上述代碼是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當中。
           
           
          參考資料:

           

          posted on 2005-03-22 16:45 笨笨 閱讀(724) 評論(0)  編輯  收藏 所屬分類: ALLWeblogic Portal
          主站蜘蛛池模板: 当涂县| 邵阳县| 邹城市| 丰原市| 靖江市| 通江县| 德阳市| 星座| 广德县| 长顺县| 海林市| 三门县| 阜宁县| 安远县| 永泰县| 本溪市| 涿鹿县| 米脂县| 日土县| 盐津县| 广德县| 大庆市| 志丹县| 瑞安市| 竹北市| 龙口市| 芒康县| 永胜县| 二连浩特市| 赤壁市| 汤原县| 隆回县| 阿坝| 桐柏县| 乃东县| 壶关县| 桐乡市| 文登市| 寿光市| 汝州市| 华宁县|