研究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) 編輯 收藏