afunms

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

研究portal的实现

研究Java来实现Portal。


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

进一步改进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的内容可以各种各样,只要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 %>  
</table> 


2) Portlet Interface
下面我们来扩展这个例子。
假设每个Portlet都规定实现一个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的核心流程的一个简化版本。
JSR168 Portlet规范里面定义了真正的Portlet接口定义。

posted on 2011-08-28 12:29 afunms 阅读(201) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

My Links

News

留言簿(18)

随笔档案

相册

搜索

最新评论

阅读排行榜