2011-08-01 52 views
19

我正嘗試在一個名爲view.jsp的JSP文件中創建portlet。我需要的是:創建liferay portlet - 如何將數據從Java類傳遞給view.jsp?

  1. 當portlet加載時,我想調用自定義Java類,我生成一個數組。我需要將該數組傳遞給view.jsp

如何做到這一點?

+0

只是澄清一下,你的意思是view.jsp?你需要頁面渲染後的值嗎?如果是這樣,爲什 –

+0

是的,我的意思是jsp。我想解析遠程xml並將所有數據放入數組,然後將此數組傳遞給view.jsp。我只是不想在jsp本身編寫代碼。我想用java類。 –

回答

38

您是否使用Liferay的create.sh腳本創建了portlet?在這種情況下,我們需要創建一個擴展MVCPortlet新的portlet類:

public class ArrayPortlet extends MVCPortlet { 

} 

此外,你將不得不改變WEB-INF/portlet.xml文件指向它的類。通過

<portlet-class>com.liferay.util.bridges.mvc.MVCPortlet</portlet-class> 

一個更換線下命名您的portlet類:

<portlet-class>br.com.seatecnologia.arrayportlet.ArrayPortlet</portlet-class> 

這僅僅是設置。現在,很酷的部分:代碼!您應該創建一個方法來處理portlet的視圖。該方法應該命名爲doView()並具有兩個參數:一個RenderRequest和一個RendertResponse。此外,它會拋出一些例外情況,並委託Portlet呈現給超類方法:

public void doView(RenderRequest renderRequest, RenderResponse renderResponse) 
throws IOException, PortletException { 
    super.doView(renderRequest, renderResponse); 
} 

呈現portlet之前,但是,我們創建數組:

String[] array = new String[] { "foo", "bar", "baz" }; 

,並把它放在接收爲RenderRequest參數。你應該給一個名字參數 - 在這種情況下,名稱是"my-array"

renderRequest.setAttribute("my-array", array); 

這是我們班的,完整的:

public class ArrayPortlet extends MVCPortlet { 
    @Override 
    public void doView(RenderRequest renderRequest, RenderResponse renderResponse) 
    throws IOException, PortletException { 
     String[] array = new String[] { "foo", "bar", "baz" }; 
     renderRequest.setAttribute("my-array", array); 
     super.doView(renderRequest, renderResponse); 
    } 
} 

正是通過我們值傳遞給RenderRequest對象JSP。現在,在JSP中,我們應該「導入」RenderRequest實例(以及其他對象),並將<portlet:defineObjects />標記添加到JSP的開頭。在此之後,我們可以通過其名稱獲得renderRequest對象的任何屬性。需要注意的是getAttribute()返回Object所以你應該返回值轉換爲正確類型的方法:

<portlet:defineObjects /> 
<% 
String[] anArrayFromMyPortlet = (String[])renderRequest.getAttribute("my-array"); 
%> 

現在,您只需使用您檢索的對象,如你所願:

<ul> 
<% for (String string : anArrayFromMyPortlet) { %> 
<li><%= string %></li> 
<% } %> 
</ul> 

這是結果這個代碼在我的機器:

enter image description here

+0

謝謝。這是我需要的! –

+0

使用JSTL Core或Core RT taglib可爲您提供JSP頁面上更優雅的解決方案。 – Jonny

+2

這是我所見過的關於它的任何主題中所見過的最好的liferay教程。他們應該聘請你寫文檔,教程,文章,維基,示範,書籍和一切。 – Nenotlep

3

您的問題很模糊,我建議您介紹一下Portlet開發,因爲它似乎是關於基礎結構/規範的基本理解。

試圖通過給一些指點回答你的問題 - 道歉,如果他們也太模糊了:

  • 的init()是portlet生命週期的一部分,將被調用一次,當portlet類加載。
  • 您可以通過值傳遞給您的視圖(例如)將請求屬性到您的RenderRequest中的doView()

當然這與你使用的portlet框架變化 - 上面提到的方法從底層Portlet規範(即JSR-286)

2

您可以通過幾種方式做到這一點:

1)您可以使用renderRequest.setAttribute("my-array", array);

2)你可以把你的數據到一個會話

request.getPortletSession().setAttribute("my-array", array);

在第二種情況下,不要忘了從會話刪除元素你的時候不再需要它了。

相關問題