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

aby*_*lie 2 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;
   }

}
Run Code Online (Sandbox Code Playgroud)

因此,当渲染otherPage时o为null.

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

Bal*_*usC 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";
    }

}
Run Code Online (Sandbox Code Playgroud)
@ManagedBean
@ViewScoped
public class OtherMB {

    private Object anyObject;    

    @PostConstruct
    public void init() {
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        this.anyObject = ec.getRequestMap().get("anyObject");
    }

}
Run Code Online (Sandbox Code Playgroud)

但是我想知道你是否意识到幂等与非幂等请求的重要性.也许您实际上需要一个"普通的vanilla"链接,而无需调用视图范围的bean操作方法.请参阅下面的最后一个"另请参见"链接以获取有关该示例的详细示例.

也可以看看: