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



我正在使用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;
   }
}

所以,当其他页面渲染时o为null。

您有想法如何解决?我如何将对象保留在@ViewScoped托管的bean中,并在不使用@SessionScoped的另一页上保持其生存?

一旦导航到其他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");
    }
}

我想知道您是否意识到IDEMPOTENT与非数字请求的重要性。也许您实际上需要"普通的香草"。链接无需调用视图范围的bean Action方法。请参阅最后的"请参见"。下面的链接以此为例。

另请参见:

  • 如何选择合适的豆范围?
  • 如何在JSF中导航?如何使URL反映当前页面(而不是先前的页面)
  • 为实体创建主尾页,如何链接它们以及选择哪个bean范围

最新更新