<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 笨笨 閱讀(722) 評論(0)  編輯  收藏 所屬分類: ALLWeblogic Portal
    主站蜘蛛池模板: 最好免费观看韩国+日本| 国产成人综合亚洲亚洲国产第一页| 青娱分类视频精品免费2| 精品久久洲久久久久护士免费 | 亚洲人成无码www久久久| 亚洲色图古典武侠| 黄色一级视频免费| 无码国产精品一区二区免费| 亚洲福利秒拍一区二区| 国产精品成人免费观看| 国内自产少妇自拍区免费| 亚洲成色www久久网站夜月| 久久亚洲精品11p| 亚洲精品视频在线免费| 亚洲日韩精品一区二区三区 | 114级毛片免费观看| 亚洲日本视频在线观看| 中文字幕乱码免费看电影| 国产无遮挡裸体免费视频| 在线免费观看亚洲| 国产人在线成免费视频| 亚洲AV无码成人网站在线观看| 国产成人免费福利网站| 精品一区二区三区高清免费观看 | 亚洲午夜理论片在线观看| 中文字幕免费在线| 亚洲乱亚洲乱妇无码麻豆| 午夜精品射精入后重之免费观看| 久久久亚洲精品蜜桃臀| 亚洲av日韩av永久在线观看 | 久久精品乱子伦免费| 国产亚洲精品无码拍拍拍色欲| 久久久国产精品福利免费| 亚洲尤码不卡AV麻豆| 99久久久国产精品免费蜜臀| 亚洲av午夜成人片精品网站 | 免费无码午夜福利片| 国产gav成人免费播放视频| 亚洲乱理伦片在线观看中字| 一个人在线观看视频免费| 亚洲五月综合网色九月色|