3

全部

我是 JSF2 的新手(在 tomcat7 上使用 Mojarra + primeFaces),我得到了 ManagedProperty 对象的奇怪行为:

@ManagedBean
@ViewScoped
public class CreateFactMB implements Serializable{

    @ManagedProperty(value="#{collectionFactTable}") 
    private CollectionFactTable collectionFactTable; //SessionBean
    ...
    //setters/getters

我在打开页面时打印了对象(刷新 brouser)我看到了一个 collectionTree 实例

mbeans.CollectionFactTable@12803ba

但是当我做ajax请求时

<p:commandButton id="btn1" value="Save" update="growl"
                actionListener="#{createFactMB.doUpdate}" />    

doUpdate我看到我的 collectionTree 的另一个实例

mbeans.CollectionFactTable@625c49

这是问题,因为我无法在 ajax 操作时进行更改(因为我刚刚复制)

任何人都可以帮助我吗?我做错了什么?

4

1 回答 1

1

我认为您对 SessionScoped 持久性在 JSF 中的工作方式存在误解。这种行为是预期的和正常的。

在此处输入图像描述

在请求开始时,无论范围如何,都会实例化所有托管 bean。在恢复视图阶段,基于会话的持久性值被设置为新的托管 bean 对象,有效地将 SessionScoped bean 恢复到发送最后一个响应之前的最后一个状态。

一旦响应完成并被发送,这些托管 bean 实例中的数据将被持久化,并且对象被取消引用以进行垃圾回收。该过程在下一个请求时重新开始,无论它是否是 Ajax。

于 2012-07-19T13:10:21.547 回答