[英]JSF 2 View Expired Weirdest Bug (Update - Occurs when saving state to server only)
錯誤是這樣的 - 我的JSF應用程序中有幾個表單。 如果我在特定表單外激活AJAX調用20次或更多次,我會得到一個"No Saved View State Could be found for the view identifier"
異常。
更新1僅當狀態保存在服務器上時才會發生。 設置此選項時,不會發生此問題:
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
更新結束1
例如,假設我的應用程序中有一個表單A
,表單B
,表單C
:(執行應用程序非常復雜,我將嘗試提供所有相關信息)
<h:form>
<h:commandButton value="A">
<f:ajax render="@form"/>
<h:commandButton>
<h:form>
<h:form>
<h:commandButton value="B">
<f:ajax render="@form"/>
<h:commandButton>
<h:form>
<h:form>
<h:commandButton value="C">
<f:ajax render="@form"/>
<h:commandButton>
<h:form>
一個更重要的因素,每個時間點只能看到一個表單,其他表單有display:none
。 最后,所有bean都是會話作用域。
現在,以下單擊將導致異常(對於每一行,最后一次單擊會導致異常)
這不會導致異常:
換句話說,如果在最后20次單擊中未單擊表單中的按鈕,則在下次單擊時, No save view state
拋出“ No save view state
異常。
相同形式的所有按鈕都等同於表單,這意味着,如果form A
具有按鈕A1
和A2
則以下內容不會導致異常:
任何的想法?!? 這讓我瘋了。
您已從單個頁面上超過了會話限制中的視圖數。 默認情況下,限制為15,但可以通過web.xml
的上下文參數進行配置。 從技術上講,每個表單都是一個具有自己視圖狀態的獨立視圖。 當您在觸摸其他表單的同時連續ajax更新一個表單時,它們在服務器端的視圖狀態將緩慢但肯定會過期。
在客戶端保存視圖狀態確實可以解決此問題,因為將存儲服務器端會話中的任何內容。 它只會使響應大小更大(現在帶寬便宜)。
如果要在服務器端保持視圖狀態,那么您應該從單個ajax表單中render
其他表單,以便它們的視圖狀態也將更新:
<h:form id="A">
<h:commandButton value="A">
<f:ajax render="@form :B :C"/>
<h:commandButton>
<h:form>
<h:form id="B">
<h:commandButton value="B">
<f:ajax render="@form :A :C"/>
<h:commandButton>
<h:form>
<h:form id="C">
<h:commandButton value="C">
<f:ajax render="@form :A :B"/>
<h:commandButton>
<h:form>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.