簡體   English   中英

請求范圍的bean和數據模型初始化?

[英]Request-scoped beans and datamodel initialization?

更新II:好的,我設法縮小了一點。

我有一個帶有數據表的頁面,其中包含排序和過濾功能,這些都在數據庫中進行。 換句話說,我不使用rich的嵌入式功能:我使用的數據表,而是讓數據庫完成工作。

我使用請求范圍的 bean。 唯一的會話范圍bean包含我的界面的排序和過濾。

每列的過濾都綁定到某些會話bean字段。 因此,它實際上在更新模型值階段更新。

排序需要我的部分邏輯,所以我調用某個方法來為會話bean設置正確的值。 這在Invoke Application階段執行。

因此,在渲染響應階段,頁面實際呈現的任何更改都已到位。

問題是,在我的頁面中的JSF DataTable,並datascroller調用backingBean.getDataModel()取指從數據庫和數據dataModel.getRowCount()期間(這我已經實現調用運行一個單獨的查詢方法) 應用請求值階段。 這兩個查詢也會在渲染響應階段進行,渲染響應階段是更改全部到位的唯一階段,查詢將正常運行。

這意味着在執行過濾或排序后顯示頁面時,會發生雙倍數量的查詢。

我想執行排序和過濾只執行所需的查詢而不再執行。

有什么建議?

應用請求值階段期間的getter調用是強制性的,因為JSF需要知道最初顯示哪些輸入值,以便它最終可以在適用的下一階段進行任何驗證和/或調用任何valuechangelisteners。 還必須找出在任何行中按下/單擊了哪個按鈕/鏈接,以便它知道在調用操作階段調用哪個bean操作。

但是如果你沒有任何要驗證/值更改檢查的輸入字段,也沒有任何行中的任何按鈕/鏈接,那么我可以想象在申請請求值階段的查詢完全是多余的。

不幸的是,你不能完全禁用它。 從技術上講,唯一的方法是將數據bean放在會話范圍內,並且只在bean的構造函數和bean操作方法中執行昂貴的SQL查詢(以及刷新datamodel),這樣它才會在bean的bean中調用構造(用於第一個視圖)和bean的動作方法(在新的排序/過濾器/任何請求期間)。 然而,缺點是數據模型中的任何更改都反映在最終用戶在同一會話中打開的所有窗口/選項卡中,這可能會導致“wtf?” 最終用戶的經驗。

現在,Tomahawk是第一個對<t:dataTable>preserveDataModel屬性有一個很好的解決方法,它基本上將數據模型放在特定於請求的組件樹中(而后者又存儲在會話范圍中)或者在客戶端的隱藏輸入字段中,具體取決於您在faces-config中配置視圖狀態的存儲位置的方式。 RichFaces沒有這樣的直接解決方案,但<a4j:keepAlive>基本相同。 它只會影響“整個”bean,因此如果您的數據bean包含的不僅僅是數據模型,您可以考慮重構它。 您應該記住將bean設計為會話作用域bean。

如果數據模型變大,那么我可以想象這會影響服務器內存,但是如果你只將數據模型的可視部分存儲在內存中(因此不是整個數據模型,包括所有其他數據模型)頁)。 看看它是否超過了在單個HTTP請求期間觸發雙SQL查詢的成本。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM