JSF过多的commandLinks(h:form)会导致ViewExpiredException

JSF过多的commandLinks(h:form)会导致ViewExpiredException,jsf,richfaces,toggle,commandlink,viewexpiredexception,Jsf,Richfaces,Toggle,Commandlink,Viewexpiredexception,我有一个JSF应用程序,它创建并显示大约50个报告。这些报告以PNG格式呈现,并在图片下方显示表格 此表使用switchType=client的RichFaces 4 togglePanel。togglePanel仅用于折叠和展开表格 <h:form> <rich:togglePanel id="#{param.reportWrapper}_togglePanel" stateOrder="opened,closed" activeIte

我有一个JSF应用程序,它创建并显示大约50个报告。这些报告以PNG格式呈现,并在图片下方显示表格

此表使用switchType=client的RichFaces 4 togglePanel。togglePanel仅用于折叠和展开表格

<h:form>
        <rich:togglePanel id="#{param.reportWrapper}_togglePanel"
            stateOrder="opened,closed" activeItem="opened" switchType="client">
            <rich:togglePanelItem name="closed">
                <h:panelGroup>
                    <div class="myclass">
                        <ul class="container-icons">
                            <li>
                                <h:commandLink styleClass="container-max" value="maximieren">
                                        <rich:toggleControl targetPanel="#{param.reportWrapper}_togglePanel" targetItem="@next" />
                                </h:commandLink>
                            </li>
                        </ul>
                        <h3>My Heading</h3>
                    </div>
                </h:panelGroup>
            </rich:togglePanelItem>
            <rich:togglePanelItem name="opened">
                <h:panelGroup>
                    <div class="myclass">
                        <ul class="container-icons">
                            <li>
                                <h:commandLink styleClass="container-min" value="minimieren">
                                        <rich:toggleControl targetPanel="#{param.reportWrapper}_togglePanel" targetItem="@prev" />
                                </h:commandLink>
                            </li>
                        </ul>
                        <h3>Another Heading</h3>
                        <div class="scrolling-table-content">
                            <rich:dataTable>
                                      // ...
                            </rich:dataTable>
                        </div>
                    </div>
                </h:panelGroup>
            </rich:togglePanelItem>
        </rich:togglePanel>
        </h:form>
问题是,有时在加载报告时,我会收到ViewExpiredExceptions。我在会话中的逻辑视图和视图数是14。我不想将它设置为50,因为内存问题,并且因为它不应该是必需的,因为实际上在同一时间只显示一个报告

我试图删除h:form标记,它被视为logicalView。在我看来,togglePanel不是需要表单的项,因为它的开关类型是客户端而不是服务器,ajax需要表单标记。但是命令链接确实需要表单标记,因为如果我删除它,就会出现一个错误,说这个链接被禁用,因为它没有嵌套在jsf表单中

所以我尝试用commandButton替换commandLink。首先,这种方式很好,不再需要这种形式了。但不知何故,现在这种行为完全是随机的。有时表格可以展开,有时单击展开按钮时什么也不会发生。当我再次添加表单标记时,它可以正常工作,但不能解决ViewExpiredException问题

希望有人能帮我

谢谢你的帮助


Buntspecht

如果只需要切换面板,则可以使用该面板限制执行范围,使其不会提交整个表单。或者,您可以完全删除命令组件,只需使用togglePanel的JavaScript API即可:

<a onclick="#{rich:component('panelId')}.switchToItem(#{rich:component('panelId')}.nextItem())">Next</a>

非常感谢你的帮助,马基尔。我终于用commandButtons解决方案解决了这个问题。我无法解释原因,但我的togglePanelItems的ID在不同的报告中重复了

为每个togglePanelItem提供一个唯一的ID,如

<rich:togglePanelItem name="closed" id="#{param.reportWrapper}_opened">

解决了这个问题


现在我们去掉了所有的h:form标签,因此减少了大约50个逻辑视图

如果需要折叠的东西,可能需要使用。但我只看到2个commandLinks,怎么会太多?太多了,因为这只是加载的50个报告中的一个示例。当前选定的报告显示在较大的框架中,其他报告作为预览加载为较小的缩略图。那么总共有大约100个commandLinks。那么您需要与服务器通信吗?因为这样你就不需要commandlinks了。不,因为它们只是用来显示或隐藏我的表。但是我可以用什么来代替呢?我尝试改用commandButtons,但似乎它们也需要嵌入到h:form标记中才能正常工作。
<rich:togglePanelItem name="opened" id="#{param.reportWrapper}_closed">