1

我正在编写一个可以多次添加到容器中的 JSR-168 portlet。每个容器(Liferay、JBoss 等)都有自己的内部方法来区分同一 portlet 的多个实例。

但是,我想在doView()方法本身中唯一标识我的 portlet 实例。

是否有任何标准的 JSR-168 机制来检索对于我的 portlet 的每个实例都不同的唯一标识符?我见过各种解决方案,人们随机 生成唯一 ID 并将它们保存在会话中,但如果存在标准机制,我更喜欢标准机制。

4

3 回答 3

3

Portlet 1.0 (168) 提供了RenderResponse.getNamespace()方法,每个 portlet 实例应该是唯一的。

来自规范:PLT.12.3.4 命名空间编码

getNamespace 方法必须为portlet 提供一种机制,以确保返回的字符串在整个门户页面中的唯一性。例如,getNamespace 方法将返回一个唯一的字符串,该字符串可以作为 portlet 生成的内容中的 JavaScript 变量名的前缀,从而确保其在整个页面中的 5 唯一性。如果在渲染请求中多次调用 getNamespace 方法,则必须返回相同的值。

如果您想在processAction中访问它,您可能希望将其存储在会话中或作为actionURL参数。

如果可以选择升级,Portlet 2.0 (286) 会更改底层PortletResponse接口以提供getNamespace()方法,并添加可能对您有用的PortletRequest.getWindowID()方法。

于 2008-12-23T12:52:26.297 回答
0

不,实例没有通用 ID。我自己实现了一个 portlet 容器,公共 api 中没有每个实例的 id - 容器有一个,原因。portlet 会话 ( javax.portlet.PortletRequest#getPortletSession()) 对于一个 portlet(由标记 in 定义portlet.xml)和一个用户 ( ) 是唯一的javax.servlet.http.HttpSession,这对您来说是不够的。

所以恕我直言,生成的 id(也可以是 portletl 类中的简单(同步)计数器)并存储在 portlet 会话中是唯一可移植的方式。portlet 类本身通常在实例之间共享,因此java.lang.System#identityHashCode(Object x)它也是无用的。

你为什么需要它?

于 2008-12-23T08:41:38.160 回答
0

我很惊讶按照 Ame 似乎不存在这个唯一 ID。实例 ID 可用于将所有 portlet 首选项存储在我们自己的数据库中,而不是容器提供的数据库中。我们需要自己存储它的原因之一是容器提供的首选项不支持特定于区域设置的首选项。

即,一个portlet 实例可能对每个语言环境有不同的偏好。

我们正在尝试使用 Liferay 来满足我们的需求。

于 2010-11-12T17:55:20.020 回答