簡體   English   中英

JSF 2查看過期的最奇怪的錯誤(更新 - 僅在將狀態保存到服務器時發生)

[英]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都是會話作用域。

現在,以下單擊將導致異常(對於每一行,最后一次單擊會導致異常)

  1. Ax20,B
  2. Ax19,B,C
  3. Ax10,Cx10,B
  4. Bx5,Cx5,Bx5,Cx5,A

這不會導致異常:

  1. Ax18,B,C,A。

換句話說,如果在最后20次單擊中未單擊表單中的按鈕,則在下次單擊時, No save view state拋出“ No save view state異常。
相同形式的所有按鈕都等同於表單,這意味着,如果form A具有按鈕A1A2則以下內容不會導致異常:

  1. A1x20,A2
  2. A1x19,B,A2
  3. A1,A2x20,B,A1

任何的想法?!? 這讓我瘋了。

您已從單個頁面上超過了會話限制中的視圖數。 默認情況下,限制為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.

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