在我的应用程序中,有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();
............
当您在Portlet应用程序中用@SessionScoped
注释bean时,它被映射为"Portlet实例会话"。这意味着该bean将驻留在该portlet的会话中,并且每个portlet都有自己的会话。有一种叫做"全局会话"的东西,它在所有portlet之间共享会话,但据我所知,JSF中没有这样的注释。
JSR286具有基于用户会话的作用域,但它取决于您的门户服务器是否将其实现作为JSF的自定义作用域。
我确信Websphere门户8。X支持这个
在Websphere门户8。您可以像
那样指定您的托管bean@ManagedBean(name="userManagementBean")
@CustomScoped("#{portletApplicationSessionScope}")
public class UserManagementBean {
...
}
查看您的门户服务器文档,看看它是否支持。
您可以使用Apache JSF portlet桥,因为您已经更新了您正在使用liferay,
将Application Session Scope公开为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}"/>