2014-01-05 83 views
3

我必須在頁面加載時調用我的bean上的init方法作爲第一個操作,我試圖在頁面開始時簡單地調用#{bean.init},但我已經看到在init()之前執行<c:if>測試。我以前init(), 我怎麼能解決這個問題,並呼籲init()作爲真正的第一件事像JSF在加載頁面之前調用bean方法

#{bean.init} 
<c:if test="#{bean.conditionsCheck}">...</c:if> 

conditionsCheck()方法被調用?

回答

6

可以使用@PostConstruct註解來自動調用你的init方法:

@PostConstruct 
public void init() { 
    // do something 
} 

此方法施工豆後自動調用。

您的解決方案看起來更像是一個type="preRenderView"f:event這不能被使用,因爲c:if標籤中查看生成的時間進行評估,而f:event(分別爲您的解決方案)運行視圖呈現的右之前在渲染響應階段。查看this questionthis question以獲取詳細信息。

更新:當你評價你使用的是@SessionScoped豆其中@PostConstruct只調用每個會話一次,而不是在每一頁上的負載。在這種情況下,另一種解決方案是將您的init方法作爲您的conditionsCheck方法中的第一條語句(與您的假設c:if boolean init的提示幾乎相同)。您也可以使用自定義PhaseListener,但我想這對於這個問題會有些過量。

參見:

+0

正如他是用一個簡單的EL問題描述調用來調用該方法。無論如何,@PostConstruct不應該解決這個問題嗎? – unwichtich

+0

的確,但'preRenderView'不能解決問題。另請參見http://stackoverflow.com/q/3342984/ – BalusC

+0

我不知道@PostConstruct是否可以解決問題,但它會引入另一個問題,對於僅在初始化Bean後才運行的SessionScoped,並非每次我將重新加載頁面 –

0

這工作,如果你添加一個JSF控制像CommandButton,並在它的價值,你把它寫成:

value="#{sessionScopedBean.method()}"

這方法將在這個頁面加載時被調用。

-1

任何人搜索...

如果使用JSF實現支持它,我們可以使用scriptCollector標籤的預渲染的,是這樣的:

<scriptCollector id="scriptCollector1" preRender="#{bean.method}"> 
... 
</scriptCollector> 
相關問題