【问题标题】:JSF too many commandLinks (h:form) lead to ViewExpiredExceptionJSF 过多的 commandLinks (h:form) 导致 ViewExpiredException
【发布时间】:2015-05-08 07:01:49
【问题描述】:

我有一个 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。我的 numberOfLogicalViews 和 numberOfViewsInSession 是 14。我不想将其设置为 50,因为内存问题,并且因为实际上只有一个报告同时显示,所以它不应该是必需的。

我试图删除 h:form 标签,这些标签被视为logicalView。在我看来,togglePanel 不是需要表单的项目,因为它的开关类型是客户端(不是服务器和 ajax,需要表单标签)。但是命令链接确实需要表单标记,因为如果我将其删除,则会出现错误提示“此链接已禁用,因为它没有嵌套在 jsf 表单中”。

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

希望有人能帮帮我...

感谢您的帮助!

大头针

【问题讨论】:

  • 如果你需要折叠的东西,你可能想使用&lt;rich:collapsiblePanel&gt;。但是我只看到了 2 个 commandLink,怎么这么多?
  • 太多了,因为这只是加载的 50 个报告之一的示例。当前选定的报告显示在较大的框架中,而其他报告作为一种预览加载为较小的缩略图。所以总共有大约 100 个命令链接。
  • 你需要和服务器通信吗?因为那样你就不需要命令链接了。
  • 不,因为它们只是为了显示或隐藏我的表格。但是我可以用什么代替呢?我尝试改用命令按钮,但似乎它们还需要嵌入到 h:form 标签中才能正常工作。

标签: jsf richfaces toggle commandlink viewexpiredexception


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    非常感谢您对 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 个逻辑视图! :)

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 2012-09-04
      • 2011-01-08
      • 2011-03-18
      • 2011-02-28
      • 2018-03-27
      • 2013-11-11
      • 2011-09-03
      • 2012-01-09
      相关资源
      最近更新 更多