【问题标题】:How to pass bean property from one view to another view如何将 bean 属性从一个视图传递到另一个视图
【发布时间】:2014-02-21 06:18:22
【问题描述】:

我正在使用 JSF 2.1 和 Primefaces:

我有一个视图范围的托管 bean,它具有一个托管属性和一个方法,可以在其他视图范围的托管 bean 上设置某些内容并转发到引用该托管 bean 的其他页面:

@ManagedBean
@ViewScoped
public class HelloMB {

   @ManagedProperty("otherMB")
   private OtherMB other;

   public String changeOtherMB() {
      otherMB.setAnyObject(new Object());
      return "otherPage.xhtml";
   }

}

@ManagedBean
@ViewScoped
public class OtherMB {

   private Object o;    

   public void setAnyObject(Object o) {
      this.o = o;
   }

}

所以,在渲染 otherPage 时,o 为 null。

您知道我该如何解决这个问题吗?如何在不使用 @SessionScoped 的情况下将对象保留在 @ViewScoped 托管 bean 中并使其在其他页面上保持活动状态?

【问题讨论】:

    标签: jsf parameter-passing managed-bean view-scope


    【解决方案1】:

    一旦您导航到不同的 JSF 视图,视图范围就会被销毁并重新创建。您知道,只要您与同一个 JSF 视图交互,视图范围就存在。在这种特殊情况下,您在一个请求期间有效地结束了 #{otherMB} 托管 bean 的两个实例。一个由源视图使用的实例和另一个由目标视图使用的实例。

    由于第二个视图是在同一个请求中创建的,您可以将其作为请求属性传递。

    @ManagedBean
    @ViewScoped
    public class HelloMB implements Serializable {
    
        public String changeOtherMB() {
            ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
            ec.getRequestMap().put("anyObject", anyObject);
            return "otherPage.xhtml";
        }
    
    }
    
    @ManagedBean
    @ViewScoped
    public class OtherMB {
    
        private Object anyObject;    
    
        @PostConstruct
        public void init() {
            ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
            this.anyObject = ec.getRequestMap().get("anyObject");
        }
    
    }
    

    不过,我想知道您是否了解幂等请求与非幂等请求的重要性。也许您实际上需要一个“普通的”链接,而无需调用视图范围的 bean 操作方法。有关详细示例,请参阅下面最后一个“另请参阅”链接。

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      相关资源
      最近更新 更多