EL会话属性和托管bean访问

时间:2013-04-07 06:51:17

标签: jsf-2 el

我对表达式语言2 bean-view通信语法感到困惑。首先,是否有可能有一个具有相同名称但不同scobes的托管bean。如果它是通过表达式语言访问它们的呢? 另一方面; 考虑在会话中有一个名为DemoBean的属性,并且还有一个名为DemoBean的会话Scobed托管bean, 如果我尝试通过EL访问这个bean,就像这样#{DemoBean} //引用bean或属性? 他们说#{sessionScobe} 是访问会话属性的方式,但是 只是#{sessionattributename} 有效吗?当我把一个对象放到会话地图上时,它会被重新编辑或复制吗?

1 个答案:

答案 0 :(得分:1)

JSF 的目标是为您自己管理会话属性。这意味着您应该忘记手动保留/恢复会话映射属性,因为您将能够使用JSF的机制来完成它。

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

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

@ManagedBean
@SessionScoped
public class SessionScopedBean{

    public String sessionAttribute;

    //Getter and setter

}

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

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}