2013-05-06 52 views
0

我有兩個頁面(比如說page1和page2),每個頁面有一個magaedBean(mb1和mb2)。在mb1中有 ,我有一個mb2的實例,它的所有屬性都是由mb1中的一個方法預先設置的。事情是這樣的:如何從另一個managedBean恢復managedBean

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

我要的是,從MB1的方法,在某種程度上第2頁(MB2)的控制器是存儲在MB1實例打開查看第2頁。

我的managedBeans必須是ViewScoped,我知道我可以通過使用會話範圍來做到這一點,但這不是我所需要的。 是否有辦法做到這一點?

+0

您正在使用哪個版本的JSF?我不會讓一個bean負責初始化另一個... – Gamb 2013-05-06 14:14:02

+0

另外,Mb1做什麼不能讓Mb2自己做? – Gamb 2013-05-06 14:19:59

+0

這是頁面之間的通信...這是兩個crud頁面,每個頁面對應一個特定的實體 – 2013-05-06 14:49:37

回答

0

爲什麼託管bean負責初始化另一個?我寧願提供必要的信息給Mb2,以便他可以初始化自己。

如果你設置傳遞一個對象並避免Mb2的自我初始化(假設你使用的是JSF 2),我建議你看看JSF的Flash Scope

堅韌Flash本身並不是一個範圍,它是基於Ruby的POST-REDIRECT-GET模式實現的功能(AFAIK)。您可以創建自己的對象來存儲數據,並使用其對數據進行操作,而不是將bean作爲參數。

當您需要導航到page2時,只需將該項目存儲在閃存中並在稍後創建Mb2時檢索它。

要保存它,你需要的Flash,這可以通過多種方式獲得:

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

或者

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

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

閃存本身是一個地圖(就像那些爲請求和會議),所以你可以把你的對象在那裏:

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

然後,您可以通過獲取Flash並從中獲取對象,例如在preRenderView定義的事件中,獲取Mb2中的對象。