0

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

2 回答 2

2

当您@SessionScoped在 Portlet 应用程序中注释您的 bean 时,它被映射到“Portlet Instance Session”之类的东西。这意味着这个 bean 将存在于该 portlet 的会话中,并且每个 portlet 都有自己的会话。有一种叫做“全局会话”的东西,它是所有 portlet 之间共享的会话,但据我所知,JSF 中没有这样的注释。

于 2013-04-10T11:26:29.943 回答
0

JSR286 具有基于用户会话的作用域,但它取决于您的门户服务器是否将其实现为 JSF 的自定义作用域。

我确信 Websphere 门户 8.x 支持这一点。

在 Websphere 门户 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}"/>
于 2013-04-10T15:05:05.643 回答