如何在portlet中使用HTTP会话范围?

时间:2013-04-10 11:12:20

标签: jsf jsf-2

在我的应用程序中,有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();
            ............

2 个答案:

答案 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}"/>