0

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

4

1 回答 1

1

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

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

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

@ManagedBean
@SessionScoped
public class SessionScopedBean{

    public String sessionAttribute;

    //Getter and setter

}

您可以使用以下方法恢复/更改 bean 的属性FacesContext

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

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

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

#{sessionScopedBean.sessionAttribute}

于 2013-04-07T10:34:21.537 回答