afunms

          My Software,My Dream—Forge a more perfect NMS product.

          研究portal的實(shí)現(xiàn)

          研究Java來(lái)實(shí)現(xiàn)Portal。


          1) Dynamic Include
          首先,我們采用最簡(jiǎn)單的思路,我們用100個(gè)JSP文件(1.jsp, 2.jsp, 3.jsp, … 100.jsp等),代表100個(gè)Portlet。
          用戶頁(yè)面MyPage.jsp包含用戶選定的多個(gè)Portlet。
          現(xiàn)在,假設(shè)用戶選取的Portlet為1.jsp, 3.jsp, 7.jsp等3個(gè)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文件名,不能動(dòng)態(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> 

          <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>

          進(jìn)一步改進(jìn)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)容,這就是一個(gè)簡(jiǎn)單的Portal實(shí)現(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) Portlet Interface
          下面我們來(lái)擴(kuò)展這個(gè)例子。
          假設(shè)每個(gè)Portlet都規(guī)定實(shí)現(xiàn)一個(gè)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);  
            }  
          }; 

          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的核心流程的一個(gè)簡(jiǎn)化版本。
          JSR168 Portlet規(guī)范里面定義了真正的Portlet接口定義。

          posted on 2011-08-28 12:29 afunms 閱讀(212) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          My Links

          News

          留言簿(18)

          隨筆檔案

          相冊(cè)

          搜索

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 曲松县| 广饶县| 昭通市| 荔波县| 新平| 浦江县| 阳城县| 丰宁| 沂源县| 剑河县| 山西省| 蓝山县| 崇州市| 永兴县| 德庆县| 仙游县| 泰宁县| 通榆县| 安吉县| 茂名市| 黄山市| 酉阳| 庆城县| 万源市| 利津县| 靖远县| 田林县| 东乡县| 时尚| 梅州市| 南投县| 栾川县| 涞水县| 罗江县| 特克斯县| 舞阳县| 贺州市| 青海省| 唐山市| 华安县| 孝昌县|