如何在portlet中使用HTTP会话作用域



在我的应用程序中,有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}"/>

相关内容

  • 没有找到相关文章

最新更新