我必須在頁面加載時調用我的bean上的init方法作爲第一個操作,我試圖在頁面開始時簡單地調用#{bean.init}
,但我已經看到在init()
之前執行<c:if>
測試。我以前init()
, 我怎麼能解決這個問題,並呼籲init()
作爲真正的第一件事像JSF在加載頁面之前調用bean方法
#{bean.init}
<c:if test="#{bean.conditionsCheck}">...</c:if>
和conditionsCheck()
方法被調用?
我必須在頁面加載時調用我的bean上的init方法作爲第一個操作,我試圖在頁面開始時簡單地調用#{bean.init}
,但我已經看到在init()
之前執行<c:if>
測試。我以前init()
, 我怎麼能解決這個問題,並呼籲init()
作爲真正的第一件事像JSF在加載頁面之前調用bean方法
#{bean.init}
<c:if test="#{bean.conditionsCheck}">...</c:if>
和conditionsCheck()
方法被調用?
可以使用@PostConstruct
註解來自動調用你的init方法:
@PostConstruct
public void init() {
// do something
}
此方法施工豆後自動調用。
您的解決方案看起來更像是一個type="preRenderView"
但f:event
這不能被使用,因爲c:if
標籤中查看生成的時間進行評估,而f:event
(分別爲您的解決方案)運行視圖呈現的右之前在渲染響應階段。查看this question和this question以獲取詳細信息。
更新:當你評價你使用的是@SessionScoped
豆其中@PostConstruct
只調用每個會話一次,而不是在每一頁上的負載。在這種情況下,另一種解決方案是將您的init
方法作爲您的conditionsCheck
方法中的第一條語句(與您的假設c:if
boolean init的提示幾乎相同)。您也可以使用自定義PhaseListener
,但我想這對於這個問題會有些過量。
參見:
這工作,如果你添加一個JSF控制像CommandButton
,並在它的價值,你把它寫成:
value="#{sessionScopedBean.method()}"
這方法將在這個頁面加載時被調用。
任何人搜索...
如果使用JSF實現支持它,我們可以使用scriptCollector標籤的預渲染的,是這樣的:
<scriptCollector id="scriptCollector1" preRender="#{bean.method}">
...
</scriptCollector>
正如他是用一個簡單的EL問題描述調用來調用該方法。無論如何,@PostConstruct不應該解決這個問題嗎? – unwichtich
的確,但'preRenderView'不能解決問題。另請參見http://stackoverflow.com/q/3342984/ – BalusC
我不知道@PostConstruct是否可以解決問題,但它會引入另一個問題,對於僅在初始化Bean後才運行的SessionScoped,並非每次我將重新加載頁面 –