使用<a4j:repeat> </a4j:repeat>在xhtml页面中迭代时从列表中删除元素

时间:2013-12-12 14:18:56

标签: java jsf arraylist

我想在名为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();
         }
     }

 }

谢谢!

2 个答案:

答案 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>

我希望它有所帮助。

所以在你的控制器中删除元素。