我想在名为Authors
的列表中显示documentAuthorBeanToShow
的名称。我在inputtexts
中展示了它们,并且我显示了button
以删除显示的每个Author
。当我点击该按钮时,我想从Author
中删除list
并自动将其从视图中删除。
问题是:当我点击按钮时,我得到例外:
HTTP STATUS 500 - java.util.ConcurrentModificationException
我在这里检查了一些链接,发现我需要使用方法Iterator.remove()
在迭代时从列表中删除元素。但我的问题是关于JSF。我不知道如何在xhtml页面中使用迭代器。我正在努力完成这项简单任务的最佳方法是什么?
已编辑 - 现在使用Iterator.remove()。使用下面的代码,我没有得到上述的例外。为了让它正常工作,只需添加我选择的答案中描述的属性。
查看代码:
XHTML
<a4j:repeat value="#{editDocController.documentAuthorsBeanToShow}" var="author" >
<br />
<h:inputText value="#{author.name}" disabled="true" />
<h:commandButton type="submit" action="#{editDocController.removeAutor(author.uri)}" value="Remover" />
<br />
</a4j:repeat>
editDocController
public void removeAutor(String uri) {
Iterator<AuthorBean> itAuthorBean = this.documentAuthorsBeanToShow.iterator();
while(itAuthorBean.hasNext()) {
AuthorBean a = itAuthorBean.next();
if(a.getUri().equals(uri)) {
itAuthorBean.remove();
}
}
}
谢谢!
答案 0 :(得分:2)
在Iterator
方法中使用removeAutor()
。
public void removeAutor(String uri) {
Iterator<AuthorBean> iterator = documentAuthorsBeanToShow.iterator();
while (iterator.hasNext()) {
if(iterator.next().getUri().equals(uri)){
iterator.remove();
}
}
}
答案 1 :(得分:1)
也许这可以帮助你,我把你要刷新的区域放入一个带有id的a4j:outPutpanel,然后用a动作改变a4j:commandButton的commandButton并指定你要重新渲染的区域,看看这个可怜的例子:
<a4j:outputPanel id="panellImatge">
<!-- here a4j:repeat...whatever-->
<a4j:commandButton styleClass="button" action = "yourControllertoremove" reRender="panellImatge"/>
</a4j:ouPutPanel>
我希望它有所帮助。
所以在你的控制器中删除元素。