【问题标题】:EL session attribute and managed bean accessEL 会话属性和托管 bean 访问
【发布时间】:2013-04-07 06:51:16
【问题描述】:

我对表达式语言 2 bean-view 通信语法感到困惑。首先。是否可以再拥有一个名称相同但范围不同的托管 bean。如果通过表达式语言访问它们会怎样 另一方面; 考虑在会话中有一个名为 DemoBean 的属性,并且还有一个名为 DemoBean 的会话 Scobed 托管 bean, 如果我尝试像这样通过 EL 访问这个 bean #{DemoBean} // 引用 bean 或属性? 他们说 #{sessionScobe} 是访问会话属性的方式,但是
只是 #{sessionattributename} 有效吗?当我将一个对象放入会话映射时,它是被引用还是被复制?

【问题讨论】:

    标签: jsf-2 el


    【解决方案1】:

    JSF 的目的是为您管理会话属性本身。这意味着您应该忘记手动保留/恢复会话映射属性,因为您将能够使用 JSF 的机制来做到这一点。

    如果您想为整个应用程序保留一些信息,请在托管 bean 中使用 @ApplicationScoped 注释。您可以使用@SessionScoped@RequestScoped@ViewScoped 注释对会话、请求或具体视图执行相同的操作。

    所以,如果你想在会话中存储一些属性:

    @ManagedBean
    @SessionScoped
    public class SessionScopedBean{
    
        public String sessionAttribute;
    
        //Getter and setter
    
    }
    

    您可以使用FacesContextrecover/change the value of the attribute of the bean

    FacesContext context = FacesContext.getCurrentInstance();
    SessionScopedBean bean = (SessionScopedBean) context.getApplication()
        .evaluateExpressionGet(context, "#{sessionScopedBean}", SessionScopedBean.class);
    bean.setSessionAttribute("value");
    

    请记住,JSF bean 默认使用 bean 的名称命名,并且第一个字符小写。还要记住,如果您不初始化自己,这个 bean 在第一次命中时将是 null。您可以通过简单的方式 using a PreRenderViewEvent in the bean you want to initialize 执行此操作,例如在您的登录页面中执行它。这确保了 bean 在会话的剩余时间内保持活动状态。

    最后,这就是您从视图中访问会话属性的方式:

    #{sessionScopedBean.sessionAttribute}

    【讨论】:

    • 感谢您的建议,但是“当我将对象放入会话映射时,它是被引用还是被复制?”
    • 当 java 引用它的对象时,它将被引用。因此,如果您更改对象的值,它也会更改为地图(最后,会话属性也存储在地图中)。然而,正如我所说,在使用 JSF 时摆脱它。
    • 当创建新的会话 scobed 托管 bean 时,它是否隐式添加到 sessionmap 中?所以通过 req.getSession().getAttribute("credentials");是真的?我问这个是因为我有登录过滤器和会话 scobed managedbean 称为凭据。在过滤器中不允许依赖注入和 FacesContext#getExternalContext().getSessionMap().get("credentials");返回 null 我们无法在过滤器中访问人脸上下文,所以我猜只有接缝会话属性的方式。
    • 是的,在应该完成这项工作的过滤器中,因为 JSF bean 存储在会话映射中的属性及其名称中。请记住,如果这返回 null 可能是因为它没有初始化。只需在调用过滤器之前调用某个 bean 的方法或手动初始化它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2012-12-26
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2012-05-22
    • 2014-12-11
    相关资源
    最近更新 更多