2010-11-29 58 views
5

是否有可能在before-invokeApplication-phaselistener中獲得對待執行的managedbean的引用?JSF 2:在階段偵聽器對象中訪問託管bean的實例?

在調用應用程序階段之前,應該清楚哪個managedBean即將執行該方法。

爲了舉例,假設有1個主要的管理bean來處理1個jsf頁面。

所以,我需要的是基本上是:

  1. 用戶訪問該程序從
  2. 因爲它是從菜單訪問的菜單,主管理bean的init()方法被調用來初始化如準備的東西數據,做授權檢查
  3. 隨後的提交不不需要再調用init()方法,直到它從菜單

重新訪問要實現點# 2,即時想到攔截其中一個階段

我已經檢查了關於在階段實現中獲取託管bean的API文檔,但我似乎找不到任何。

輸入這個問題後,我意識到我可以在@PostConstruct或託管bean的構造函數中做到這一點,但這隻會在第一次構建bean時執行,而我的需要是每次調用jsf從菜單訪問。

有什麼建議嗎?

問候,
阿爾伯特錦

回答

3

您可以通過ELContext/ELResolver訪問託管bean。這在MyFaces wiki中很好解釋(也適用於香草JSF)。

例如:

ELContext elContext = FacesContext.getCurrentInstance().getELContext(); 
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication() 
    .getELResolver().getValue(elContext, null, "neededBean"); 

參見MyFaces wiki entry作進一步的解釋,和實現爲其他JSF版本。

你的想法使用@PostConstruct是一個很好的想法。考慮將你的範圍改爲喜歡@ViewScoped的東西,所以每次你瀏覽該視圖時都會執行該邏輯。

另外,看看PreRenderViewEvent(對於JSF 2)。此代碼嵌入在您的facelet頁面中:

<f:metadata> 
<f:viewParam name="foo" value="#{bean.foo}"/> 
<f:event type="preRenderView" listener="#{bean.doSomething}"/> 
</f:metadata> 

f:事件偵聽器在每個頁面視圖之前執行。

+0

哇,這麼多的選擇。謝謝 ! – bertie 2010-11-30 10:43:24