2012-08-10 74 views
0

下面是我尝试做的一个例子。使用Session和View来浏览视图scoped托管bean JSF 2.0

在sessionScoped豆

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

在viewScoped豆

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

所以在坚果壳我想调用的图中的方法从另一个bean这是对另一个作用域bean查看(listRecords.xhtml)。 当我运行这个(只使用一个标准的命令链接)时,会话bean按我的预期工作,viewScoped bean被创建并且ViewScopedBeanloadRecord方法被调用但是那么viewScoped bean被重新创建(构造函数被再次调用),但是这次ViewScopedBeanloadRecord未运行,页面加载空白字段。

据我所知,只要您返回null(或有一个void方法)留在相同的视图,但你如何从listRecords.xhtml过渡到viewRecord.xhtml并运行加载方法?

一旦我在viewRecord.xhtml视图中,我也将被要求同时加载更多的记录(在不同的浏览器窗口中),所以我不能保留会话中的记录。

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

任何帮助,将不胜感激!

感谢

埃里克

回答

0

战斗后,并试图与Requestscoped,Viewscoped不同的组合和@PostConstruct我无法获得这种情况下正常工作。我还使用动态包含文件,这些文件依赖于bean中的属性来决定构建哪个xhtml文件,这在使用viewScope和@PostConstruct时似乎会导致问题。

所以我去了一个完全基于会话的解决方案。

取代viewScoped或requestScoped bean我在会话bean中创建了一个类型为“record”的属性,并且每当调用sessionbean中的视图记录方法时,我都将新记录属性替换为新记录属性,然后转发给显示记录视图。所以它创建了一种“请求”记录属性,每次对视图记录方法的新调用都会覆盖该属性。所以只有最后一次被观看的观看留在会话中。

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

0

我们有一个类似的问题,我们通过使用@SessionScoped bean作为支持Bean整个会话解决它。我们将其注入管理会话中所需数据的其他@ViewScoped@RequestScoped bean中。

另一个步骤是使用GET参数。

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

祝你好运:)

+0

所有与此解决方案的会话中,因为它们始终被引用,所以JVM永远不会销毁它们,直到会话结束。这就像所有的豆被标记为“sessionScoped”。 – 2012-11-28 16:16:50