如何从另一个managedBean恢复managedBean

时间:2013-05-06 12:10:17

标签: jsf view-scope

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

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

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

我的managedBeans必须都是ViewScoped,我知道我可以通过使用会话范围来实现它,但这不是我需要的。 这是一种方法吗?

1 个答案:

答案 0 :(得分:0)

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

如果你设置了传递一个对象并避免Mb2的自我初始化(假设你正在使用JSF 2),我建议你看一下JSF的 Flash Scope

坚硬 Flash 本身不是一个范围,它是基于特征(AFAIK)的Ruby实现POST - REDIRECT - GET模式。您可以创建自己的对象来存储数据,并对其进行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中获取该对象。

相关问题