【问题标题】:Uniquely identify an instance of a JSR-168 portlet唯一标识 JSR-168 portlet 的实例
【发布时间】:2008-12-23 08:16:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: java portlet


    【解决方案1】:

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

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

    getNamespace 方法必须提供 具有一种机制的 portlet 保证返回的唯一性 整个门户页面中的字符串。为了 例如,getNamespace 方法将 返回一个唯一的字符串,可能是 以 JavaScript 变量名为前缀 在生成的内容中 portlet,确保其 5 唯一性 整个页面。获取命名空间 方法必须返回相同的值,如果 在渲染中多次调用 请求。

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

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

    【讨论】:

    • 有趣!我相信我看过 getNamespace() 并且它在 JBoss 下并不是唯一的,但现在我需要再看一遍。
    • 是的!我将 portlet 上下文名称与命名空间混淆了。命名空间确实足够了。我想知道为什么我以前没有注意到它。谢谢!
    【解决方案2】:

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

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

    你为什么需要它?

    【讨论】:

    • 我在我的 portlet 中托管了一个 Opensocial 小工具,并且需要一个唯一的实例 ID 来区分小工具以实现安全性和持久性。看起来像同步计数器!
    【解决方案3】:

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

    即一个 portlet 实例可能对每个区域有不同的偏好。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多