代码之家  ›  专栏  ›  技术社区  ›  Akvel

JSF 2.0托管属性对象有两个不同的实例,当我打开页面和执行ajax请求时

  •  3
  • Akvel  · 技术社区  · 12 年前

    全部的

    我是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(操作更新) 我看到我收藏的另一个实例Tree

    mbeans.CollectionFactTable@625c49
    

    这是个问题,因为我不能在ajax操作时进行更改(因为我只有复制)

    有人能帮我吗?我做什么不对?

    1 回复  |  直到 12 年前
        1
  •  1
  •   maple_shaft    12 年前

    我认为您对SessionScoped持久性在JSF中的工作方式存在误解。这种行为是意料之中的,也是正常的。

    enter image description here

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

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