2012-06-22 63 views
8

我有要求使用portlet名稱獲取資源權限。如何在Liferay中使用Portlet名稱獲取Portlet ID?

我將使用portlet的名稱而不是Id。

資源Portlet的權限名稱是該Portlet的Id。我檢查了Portlet表,它只有Id和其他信息。 Portlet的其他屬性將保存在哪裏?

有沒有一種方法可以通過使用portlet的名稱來獲取portlet的Id。我有一個workaroud來獲取所有portlet並進行比較,但是如果我可以使用portlet的名稱直接獲取portlet的Id,那將會很有幫助。

它的迫切性,如果有人知道請回復,這將有很大的幫助。

由於提前

回答

11

如果你仔細觀察,以該組件的ID是如何根據portlet名稱生成,你會得到答案。

它是一個不變的模式,所以你可以像Liferay一樣構造Portlet ID,如果你有名字的話。 Liferay還通過portlet名稱的幫助來構建ID。

模式的portlet-id爲:<portletname in xml>_WAR_<servlet context name i.e. the war file without any special characters such as the hyphen>

例如: 如果您的portlet名稱在portlet.xml定義MyWork並在webapps文件夾中生成文件(如果你使用的是Tomcat)是MyWork-portlet然後將得到的ID將是MyWork_WAR_MyWorkportlet

現在,如果你有liferay源代碼,你可以看看PortletLocalServiceImplprivate _readPortletXML方法。

編輯:
如果你想找到某個特定頁面(考慮到頁面的friendly-url)上的portlet,那麼你可能會覺得這answer很有幫助。

+0

謝謝普拉卡什。但是,如果我部署了多個戰爭,我將如何知道作爲war文件名的servlet上下文名稱。我確實知道如何構建portlet id。我將有許多portlet部分不同的servlet上下文。 – Vijayalakshmi

+0

同一個實例上的同一個portlet的多次戰爭?還是與許多portlet打包過一場戰爭?如果您可以詳細說明環境,這將有所幫助 –

+0

一個包含多個實例的portlet的戰爭。我也觀察到,portlet id將添加實例信息。在這種情況下如何處理。如果我在不同的服務器上部署它,實例ID將會不同。 – Vijayalakshmi

1

你可以試試這個:

System.out.println("ID : " + themeDisplay.getPortletDisplay().getId()); 

System.out.println("InstanceID: " + themeDisplay.getPortletDisplay().getInstanceId()); 

System.out.println("Portlet Name: " + themeDisplay.getPortletDisplay().getPortletName()); 

不要忘記:

<% ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY); 
    themeDisplay.getUser().getScreenName(); %>