这是我想要做的一个例子。
在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视图中,我还需要同时加载更多记录(在不同的浏览器窗口中),这样我就无法将记录保存在会话中。
请注意:根据公司政策,我不允许发布实际代码,所以这个例子是我的限制。遗憾!
任何帮助将不胜感激!
由于
埃里克
答案 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之上使用任何其他框架,因此这不是一个选项。