簡體   English   中英

為什么JSF在請求更新視圖的一部分時實例化頁面上的所有bean而不是頁面那部分中使用的bean?

[英]Why does JSF, on request to update a portion of view instantiate all beans on the page instead of beans used in that part of page?

我一直注意到,在更新頁面的任何一小部分時,不必要地實例化了頁面中使用的所有bean。 好的,它們是請求范圍的,因此將在每個請求上實例化,但是只有在要更新的頁面的那部分需要這些bean時才應執行此操作。 是不是

為什么在JSF中這種糟糕的設計?

更新:

我找到了導致此問題的真正原因,我在網頁的某些位置上有f:event type="preRenderView" 實際上,這些bean被重新實例化以調用偵聽器。 解決方法是改用f:event type="preRenderComponent" 這減少了每個請求的大多數不必要的bean實例,但是我仍然看到一些不必要的bean實例。

在這種情況下,只有在參與構建視圖時才會構建Bean(閱讀:在taghandler的任何屬性或UI組件的idbinding屬性中都引用了其屬性之一)。 否則將無法構建。 至少,當以“通常的方式”設計JSF視圖時,我無法在Mojarra 2.1.11中重現您的問題(在2.0.0中也是如此)。

視圖不能部分構建,但是其狀態可以部分保存和恢復,並且UI組件樹可以部分呈現。

您的“ JSF中的不良設計”投訴毫無爭議。

也可以看看:

希望我已經正確解釋了您的問題!

您的頁面是由表單提交的,因此第一次檢索或構造了組件樹(JSF生命周期的第一步)。

組件樹由所有內容組成,而不僅僅是您當前所在的視圖。

因此,在此階段將實例化綁定到任何請求范圍Bean的任何JSF組件。

一個很好的例子是tabView。 想象一個tabView有四個選項卡,每個選項卡都綁定到一個不同的頁面,每個選項卡都綁定到一個對應的請求范圍的支持bean。

盡管並非同時顯示所有選項卡,但它們都是組件樹的一部分,因此,如果您設置了一個斷點,您將看到在請求階段為每個頁面實例化的bean。

暫無
暫無

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

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