Ajax渲染"冻结"一段时间更新h:selectManyListbox 10.000项

时间:2015-03-03 11:22:37

标签: ajax jsf mojarra

我正在使用Mojarra JSF(v2.2.10)和Spring(v3.2.5)在tomcat上使用一个小型管理控制台(也是用于样式化的Twitter Bootstrap)。 基本上有一个多选框,我可以通过文本框和按钮添加新条目。我也可以通过选择它们并单击删除按钮来删除条目。

以下是相关代码:

<h:form>
<h:outputLabel for="selectedEntries" value="Selected entries" />
<h:selectManyListbox id="selectedEntries" value="#{myBean.entriesToRemove}">
  <f:ajax/>
  <f:selectItems value="#{myBean.selectedEntries}" />
</h:selectManyListbox>
<h:commandButton action="#{myBean.addEntriesToSelection}" value="Add">
  <f:ajax render="selectedEntries entriesInput" />
</h:commandButton>
<h:commandButton action="#{myBean.removeEntriesFromSelection}">
  <f:ajax render="selectedEntries entriesInput" />
</h:commandButton>
<h:outputLabel for="entriesInput" value="Input" />
<h:inputTextarea id="entriesInput" value="#{myBean.entriesInput}">
  <f:ajax/>
</h:inputTextarea>

字段&#34; entriesToRemove&#34;和&#34; selectedEntries&#34;是简单的字符串列表和字段&#34; entriesInput&#34;是一个字符串。

一切正常,但是当选择&#34; selectedEntries&#34; list增长到10.000个条目,我遇到了一个性能问题:当我尝试在这个杂乱的列表中添加一个新条目时,该页面会在呈现更新列表之前冻结大约30秒。删除条目也是如此。然而,这种冻结不会发生在方法&#34; addEntriesToSelection&#34;而后来,当支持bean字段已经更新。所以我认为这与页面的渲染有关。

有人有线索,我怎么能解决这个问题?这可能是Mojarra或JSF特有的吗?

1 个答案:

答案 0 :(得分:3)

这是客户端问题,而不是服务器端问题。一些浏览器,尤其是MS Internet Explorer,在使用&#34;疯狂&#34;更新HTML DOM树时,已知会有些滞后。新的HTML元素的数量。当然10.000个列表框项目是&#34;疯狂&#34;。 Google例如当您打开搜索主页时,也不会立即显示所有这些百万可能的匹配项。相反,它显示了一个支持自动填充功能的输入字段,允许您查找和过滤相关数据。

考虑将该列表框转换为搜索/自动填充输入字段。