使用Session和View Scoped托管bean JSF 2.0时导航视图

时间:2012-08-10 13:13:52

标签: java java-ee jsf-2

这是我想要做的一个例子。

在sessionScoped bean中

SessionBeanloadRecord(){
Do something
ViewScopedBean viewScopedBean = (ViewScopedBean) context.getApplication().evaluateExpressionGet(context, "#{viewScopedBean}", ViewScopedBean.class);
return viewScopedBean.viewScopedBeanLoadRecord();
}

在viewScoped bean中

ViewScopedBeanloadRecord(){
Retrieve and populateFields    
return "viewRecord.xhtml";    
}

因此,在一个坚果shell中,我想从另一个视图(listRecords.xhtml)中的另一个bean调用视图范围内的bean。 当我运行它(只使用标准的commandlink)时,会话bean按照我的预期工作,创建viewScoped bean并调用ViewScopedBeanloadRecord方法然后重新创建viewScoped bean(再次调用构造函数)但这次是ViewScopedBeanloadRecord未运行,页面加载空白字段。

据我所知,只要你返回null(或者有一个void方法)来保持相同的视图,视图范围bean只是活着的,但是你如何从listRecords.xhtml转换到viewRecord.xhtml并运行加载方法

一旦我在viewRecord.xhtml视图中,我还需要同时加载更多记录(在不同的浏览器窗口中),这样我就无法将记录保存在会话中。

请注意:根据公司政策,我不允许发布实际代码,所以这个例子是我的限制。遗憾!

任何帮助将不胜感激!

由于

埃里克

2 个答案:

答案 0 :(得分:0)

我们遇到了类似的问题,我们通过使用@SessionScoped bean作为整个会话的辅助bean来解决它。我们将其注入到管理会话中所需数据的其他@ViewScoped@RequestScoped bean中。

另一种解决方法是使用GET参数。

记住bean的生命周期,并使用不同的功能来污染数据。 @PostConstruct注释也非常方便。

祝你好运:)

答案 1 :(得分:0)

在与Requestscoped,Viewscoped和@PostConstruct进行战斗并尝试不同的组合后,我无法让这个场景正常工作。我也使用动态包含文件,这些文件依赖于bean中的属性来决定构建哪个xhtml文件,这似乎在使用viewScope和@PostConstruct时会出现问题。

所以我选择了完全基于会话的解决方案。

我在会话bean中创建了一个类型为“record”的属性而不是viewScoped或requestScoped bean,每当调用sessionbean中的视图记录方法时,我用新的记录属性替换了以前的记录属性,然后转发到显示记录视图。因此,它创建了一种“请求”记录属性,该属性在每次调用视图记录方法时都会被覆盖。因此,只有最后一个被观看者留在会话中。

我已经阅读了可能解决问题的<t:saveState>标签,但作为一个项目,决定不在JSF之上使用任何其他框架,因此这不是一个选项。