这个错误是 -
我的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都是会话范围的。
现在,以下点击将导致异常(对于每一行,最后一次单击会导致异常)
这不会导致异常:
换句话说,如果在最近20次点击中未点击表单中的按钮,则下次点击该按钮时会抛出No save view state
例外。
同一表单中的所有按钮都等同于表单,这意味着,如果form A
有按钮A1
和A2
,则以下不会导致异常:< / p>
任何想法?!?这让我疯了。
答案 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>