我正在编写一个可以多次添加到容器的JSR-168 portlet。每个容器(Liferay,JBoss等)都有自己的内部方法来区分同一个portlet的多个实例。
但是,我希望在doView()
方法本身内唯一标识我的portlet实例。
是否有任何标准的JSR-168机制来检索一些对我的portlet的每个实例都不同的唯一标识符?我已经看到了各种解决方案,其中人randomly generate个唯一ID并将其保存在会话中,但我更喜欢标准机制(如果存在)。
答案 0 :(得分:3)
Portlet 1.0(168)提供RenderResponse.getNamespace()方法,每个portlet实例应该是唯一的。
来自规范: PLT.12.3.4命名空间编码:
getNamespace方法必须提供 具有机制的portlet 确保返回的唯一性 整个门户页面中的字符串。对于 例如,getNamespace方法会 返回一个可能的唯一字符串 以JavaScript变量名称为前缀 在由...生成的内容中 portlet,确保其独特性 整个页面。 getNamespace 如果方法必须返回相同的值 在渲染中多次调用 请求。
如果您想在 processAction 中访问它,您可能希望将其存储在会话中或作为 actionURL 参数。
如果升级是一个选项,Portlet 2.0(286)更改基础 PortletResponse 接口以提供 getNamespace()方法,并添加 PortletRequest.getWindowID ()方法可能对你有用。
答案 1 :(得分:0)
不,实例没有通用ID。我自己实现了一个portlet容器,在public api中没有每个实例id - 容器有一个,原因。 portlet会话(javax.portlet.PortletRequest#getPortletSession()
)对于一个portlet(portlet.xml
中的标记定义)和一个用户(javax.servlet.http.HttpSession
)是唯一的,这对你来说还不够。
因此,生成的id(也可以是portletl类中的简单(sync)计数器)并存储在portlet会话中是唯一可移植的方式。 1}}通常在实例之间共享,因此portlet类本身也是无用的。
为什么需要它?
答案 2 :(得分:0)
我很惊讶这个唯一的ID似乎不像Ame那样存在。实例ID可用于在我们自己的数据库中存储所有portlet首选项,而不是提供的容器。我们需要自己存储的原因之一是容器提供的首选项不支持特定于语言环境的首选项。
,即一个portlet实例可能在每个区域设置中具有不同的首选项。
我们正在尝试使用Liferay来满足我们的需求。