JSF太多commandLinks(h:form)导致ViewExpiredException

时间:2015-03-06 16:06:11

标签: jsf richfaces toggle commandlink viewexpiredexception

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

此表使用RichFaces 4 togglePanel和switchType =" client"。 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。我的numberOfLogicalViews和numberOfViewsInSession是14.我不想将它设置为50,因为内存问题,因为它不应该是必要的,因为只有一个报告真的同时显示。

我试图删除h:form标签,它们被视为logicalView。在我看来,togglePanel不是项目,它需要表单,因为它的交换机类型是客户端(不是服务器和ajax,需要表单标签)。但命令链接确实需要表单标记,因为如果我删除它,则会发生错误,说明&#34;此链接被禁用,因为它没有嵌套在jsf表单中#34;。

所以我尝试用commandButton替换commandLink。这首先工作正常,形式不再需要。但不知何故,这种行为现在完全是随机的。有时可以扩展表格,有时在单击展开按钮时没有任何反应。当我再次添加表单标签时,它工作正常,但不解决我的ViewExpiredException。

希望,有人可以帮助我...

感谢您的帮助!

Buntspecht

2 个答案:

答案 0 :(得分:0)

如果您只需要切换面板,可以使用<a4j:commandLink>来限制执行范围(因此不会提交整个表单)。或者您可以完全删除命令组件,只使用togglePanel的JavaScript API:

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

答案 1 :(得分:0)

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

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

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

<rich:togglePanelItem name="opened" id="#{param.reportWrapper}_closed">

解决了这个问题...

所以现在我们摆脱了所有的h:form标签,因此减少了大约50个逻辑视图! :)