有不同的方法來實現這一點。首先,您必須定義「Facelets頁面加載時」的含義。我假設你是在頁面呈現之前的意思。
PreRenderViewEvent
隨着JSF 2.x中做到這一點最簡單的方法是PreRenderViewEvent
系統事件偵聽器。爲此,您首先需要一個f:event
標籤在你的網頁是這樣的:
<f:event type="javax.faces.event.PreRenderViewEvent"
listener="#{bean.preRenderView}"/>
爲聽衆必須PreRenderViewEvent
在視圖根(f:view
)註冊。所以f:event
必須是f:view
的直接孩子,或者如果您不使用f:view
,那麼它應該是最高級別的某個地方。模板f:event
必須放在保證相同的ui:define
內。
在呈現視圖之前調用listener
屬性中引用的偵聽器方法。該方法可能是這樣的:
public void preRenderView(ComponentSystemEvent ev) {
//Do something
}
@PreRenderView
如果使用CDI用於MyFaces CODI,你可以簡單地標註一個管理bean的方法與@PreRenderView
和頁面呈現之前,它會被稱爲。
視圖操作
隨着JSF 2.2(尚未最後確定),可以使用視圖操作調用在生命週期的不同階段的方法。有關詳細信息,請參閱我的JSFlive post on JSF 2.2 view actions。
你可以找到PreRenderViewEvent
例子並查看我的GitHub repository
注意動作過程中查看生成時間''運行,而不是在視圖渲染時間。所以,預渲染視圖事件太晚了。 OP的最佳選擇是將請求/視圖範圍數據分割成請求/視圖範圍的bean,並在那裏注入會話範圍的bean。 –
BalusC
2013-04-12 02:25:30
@BalusC如果你能詳細說明如何在request/view作用域bean中注入會話作用域bean,這將是非常有用的。 – 2013-04-12 02:43:09
甚至更簡單:丟棄'c:forEach'並使用'ui:repeat'代替 - 它是一個組件並在渲染時進行評估。 – Michi 2013-04-12 04:50:11