如何将bean属性从一个视图传递到另一个视图

时间:2014-01-29 12:30:47

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

我正在使用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为空。

你知道我怎么能解决这个问题?如何在@ViewScoped托管bean中保留对象并在不使用@SessionScoped的情况下将其保存在其他页面上?

1 个答案:

答案 0 :(得分:5)

导航到不同的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");
    }

}

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

另见: