在我的应用程序中,有5个portlet访问同一个bean类,它位于会话范围内。我的问题是,每当我打开一个portlet时,托管bean都会初始化。托管bean应该在会话中初始化一次。在我的情况下bean初始化5次。谁能告诉我这个问题的根本原因是什么?
这是我的豆子:
@ManagedBean(name="userManagementBean")
@SessionScoped
public class UserManagementBean {
public UserManagementBean() {
System.out.println("In getter setter bean");
sName=userManagementHelper.findScreenName();
directReport=new DualListModel<String>();
addUserToGroupDual=new DualListModel<String>();
addUserToGroupDual.getSource().clear();
addUserToGroupDual.getTarget().clear();
............
答案 0 :(得分:2)
当您在Portlet应用程序中使用@SessionScoped
注释bean时,它将映射到“Portlet实例会话”。这意味着该bean将存在于该portlet的会话中,并且每个portlet都有自己的会话。有一种称为“全局会话”的东西是在所有portlet中共享的会话,但据我所知,JSF中没有这样的注释。
答案 1 :(得分:0)
JSR286具有基于用户会话的范围,但如果它具有作为JSF的自定义范围的实现,它将依赖于您的门户服务器。
我确信Websphere portal 8.x支持此功能。
在Websphere portal 8.x中,您可以指定托管bean,例如
@ManagedBean(name="userManagementBean")
@CustomScoped("#{portletApplicationSessionScope}")
public class UserManagementBean {
...
}
查看门户网站服务器文档,了解它是否支持。
您可以使用 Apache JSF portlet bridge ,因为您已经更新了使用liferay,
它会将应用程序会话范围公开为EL,
将其添加到portlet A中的应用程序范围
PortletSession session = request.getPortletSession();
session.setAttribute("name",name.getValue().toString(),PortletSession.APPLICATION_SCOPE);
并在portlet B中使用
PortletSession session = request.getPortletSession();
String value = session.getAttribute("name", PortletSession.APPLICATION_SCOPE).toString();
你的xhtml,
<h:inputText id="itName"
required="true"
value="#{httpSessionScope.name}"/>