2013-04-07 89 views
0

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

回答

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 beanFacesContext

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

记住JSF豆默认命名为bean的名字与第一性格较低。如果你没有初始化你自己,请记住这个bean在第一次打击时将会是null。您可以通过简单的方式using a PreRenderViewEvent in the bean you want to initialize并在您的登录页面中执行它。这可确保该bean在该会话的其余部分保持活力。

最后,就是你会从您的视图访问会话属性的方式:“当我把一个对象的会话映射是referanced或复制”

#{sessionScopedBean.sessionAttribute}

+0

感谢意见,但 – daemonThread 2013-04-07 17:17:16

+0

当java引用它的对象时,它将被引用。所以如果你改变对象的值,它也会变成地图(最后,会话属性也存储在地图中)。不过,正如我所说的,使用JSF时要摆脱它。 – 2013-04-07 20:32:22

+0

当新会话scobed托管bean创建它是否隐式添加到会话映射?所以通过req.getSession()。getAttribute(“credentials”)来访问它。是真的?我问这是因为我有登录过滤器和会话scobed managedbean调用credentials.In过滤器依赖注入是不允许的,并且FacesContext#getExternalContext()。getSessionMap()。get(“credentials”);返回null我们不能访问过滤器中的面孔上下文,所以只有方法接缝会话属性我猜。 – daemonThread 2013-04-07 21:54:05