我有两个页面(比如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,我知道我可以通过使用会话范围来实现它,但这不是我需要的。 这是一种方法吗?
答案 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
中获取该对象。