如何在Liferay中通过Portlet名称获取Portlet Id?

10

我需要通过portlet名称获取资源权限。

我只有portlet的名称而没有ID。

一个portlet的资源权限名称就是它的ID。我查看了Portlet表,它只有ID和其他信息。那么portlet的其他属性将保存在哪里呢?

是否有一种方法可以通过portlet的名称获取其ID?我有一个解决方案,即获取所有的portlet并进行比较,但如果能直接使用portlet的名称获取其ID将会很有帮助。

这个问题很紧急,请知道答案的人回复,将是极大的帮助。

提前感谢您的回复。

2个回答

13
如果你仔细观察Portlet Id如何基于Portlet Name生成,你就能得到答案。
这是一个固定的模式,所以如果你有名称,就可以像liferay一样构建Portlet Id。Liferay也借助portlet名称构建ID。 portlet-id的模式:<xml中的portletname>_WAR_<servlet上下文名称,即没有特殊字符(如连字符)的war文件> 例如: 如果你的portlet名称在portlet.xml中定义为MyWork,并且在webapps文件夹中生成的文件(如果你使用tomcat)是MyWork-portlet,那么结果Id将是MyWork_WAR_MyWorkportlet
现在,如果您拥有liferay源代码,您可以查看PortletLocalServiceImplprivate _readPortletXML方法。 编辑:
如果您想要找到特定页面上的端口,(给出页面的friendly-url),那么您可能会发现这个answer很有帮助。

谢谢你,Prakash。但是如果我部署了多个 war 文件,我怎么知道 servlet 上下文名称是哪个 war 文件的名称?我知道 portlet id 是如何构建的。我会有很多不同 servlet 上下文中的门户组件。 - Vijayalakshmi
同一实例上的多个Portlet的多个WAR文件?还是一个WAR文件中打包了多个Portlet?如果您能详细说明环境,那将会很有帮助。 - Prakash K
一个包含多个可实例化的Portlets的战争。我还观察到Portlet ID将附加实例信息。在这种情况下如何处理。如果我在不同的服务器上部署它,实例ID将是不同的。 - Vijayalakshmi
@Vijayalakshmi:对于一个战争多个Portlets,我的答案是正确的。现在实例信息是完全不同的情况。由于实例信息与页面/布局相关,因此不存储在“Portlet”表中,而是存储在“Layout”表的“typeSettings”列中。您可以编辑您的问题以包括您想要的“实例”信息,这在您的问题中根本不清楚。 - Prakash K
2
连接到Liferay DB portlet表并检查portletid列以进行验证-SELECT * from portlet; 我发现在Liferay 6.1中它是<portletname without -._>WAR<deployed war file name - under webapps in tomcat , again withour -._>。 - Alex Punnen
显示剩余2条评论

5
你可以尝试这个方法:
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(); %>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接