2013-04-11 48 views
1

我正在使用JSF構建網站。我想在每次加載Facelet頁面時運行一段代碼,我需要使用會話作用域支持bean。我嘗試使用支持bean的構造函數來運行代碼塊,但它只能運行的第一次,我用下面的代碼每當Facelet頁面加載時在後臺Bean中運行代碼塊

<c:forEach var="p" items="#{statusBean.statusList}" 
         varStatus="loop"> 

由於statusBean是會話範圍,它在首次運行的構造加載頁面的時間。

是否有任何其他的替代方案來運行代碼塊,每當頁面加載時,不僅是第一次?

回答

0

有不同的方法來實現這一點。首先,您必須定義「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

+0

注意動作過程中查看生成時間''運行,而不是在視圖渲染時間。所以,預渲染視圖事件太晚了。 OP的最佳選擇是將請求/視圖範圍數據分割成請求/視圖範圍的bean,並在那裏注入會話範圍的bean。 – BalusC 2013-04-12 02:25:30

+0

@BalusC如果你能詳細說明如何在request/view作用域bean中注入會話作用域bean,這將是非常有用的。 – 2013-04-12 02:43:09

+0

甚至更​​簡單:丟棄'c:forEach'並使用'ui:repeat'代替 - 它是一個組件並在渲染時進行評估。 – Michi 2013-04-12 04:50:11