JSF 2查看过期的最奇怪的错误(更新 - 仅在将状态保存到服务器时发生)

时间:2011-09-26 12:27:34

标签: ajax jsf jsf-2

这个错误是 - 我的JSF应用程序中有几个表单。 如果我在特定表单外激活AJAX调用20次或更多次,我会得到"No Saved View State Could be found for the view identifier"例外。

UPDATE 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>

END OF UPDATE 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
  5. 这不会导致异常:

    1. Ax18,B,C,A。
    2. 换句话说,如果在最近20次点击中未点击表单中的按钮,则下次点击该按钮时会抛出No save view state例外。
      同一表单中的所有按钮都等同于表单,这意味着,如果form A有按钮A1A2,则以下会导致异常:< / p>

      1. A1x20,A2
      2. A1x19,B,A2
      3. A1,A2x20,B,A1
      4. 任何想法?!?这让我疯了。

1 个答案:

答案 0 :(得分:5)

您已从单个页面上超过了会话限制中的视图数量。默认情况下,限制为15,但可由web.xml中的上下文参数配置。从技术上讲,每个表单都是一个具有自己视图状态的独立视图。当您在触摸其他表单的同时连续ajax更新一个表单时,它们在服务器端的视图状态将缓慢但肯定会过期。

在客户端保存视图状态确实可以解决此问题,因为服务器端会话中的任何内容都不会被存储。它只会使响应大小更大(现在带宽便宜)。

如果你想在服务器端保持视图状态,那么你应该render单个ajax表单中的其他表单,以便它们的视图状态也会更新:

<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>