0

我有两页(比如说 page1 和 page2),每页都有一个 magaedBean(mb1 和 mb2)。在 mb1 中,我有一个 mb2 的实例,它们的所有属性先前由 mb1 中的方法设置。像这样的东西:

public Mb1(){}//Default constructor
private Mb2 mb2;//Instance of Mb2 inside Mb1

我想要的是,从 mb1 中的一个方法,以 page2(mb2) 的控制器是存储在 mb1 中的实例的方式打开视图 page2。

我的两个 managedBeans 都必须是 ViewScoped,我知道我可以通过使用 session scoped 来做到这一点,但这不是我需要的。有办法做到这一点吗?

4

1 回答 1

0

为什么托管 bean 负责初始化另一个托管 bean?我宁愿提供必要的信息,Mb2以便他可以初始化自己。

如果您打算传递一个对象并避免Mb2自初始化(假设您使用的是 JSF 2),我建议您看看 JSF 的Flash Scope

Tough Flash本身不是一个范围,它是基于 Ruby 实现的 POST - REDIRECT - GET 模式的功能(AFAIK)。您可以创建自己的对象来存储数据并Mb2对其进行操作,而不是将 bean 作为参数。

当您需要导航到 时page2,只需将该项目存储在闪存中并稍后在创建 Mb2 时检索它。

要存储它,您需要Flash,它可以通过多种方式获得:

FacesContext.getCurrentInstance().getExternalContext().getFlash();

或者

@ManagedProperty("#{flash}")
private Flash flash;

public void setFlash(Flash jsfFlash) {
    flash = jsfFlash;
}

Flash本身是一个映射(就像请求和会话的映射一样),因此您可以将对象放在那里:

ManagingObject o = new ManagingObject();
//Initialize the object and set the desired properties.
flash.put("ManagingObject", mo);

然后,您可以Mb2通过获取对象然后从中获取对象来获取该Flash对象,例如,在preRenderView定义的事件中。

于 2013-05-06T15:17:34.407 回答