在jsf中使用<c:foreach>渲染java地图,但结果与控制器中的地图不一致

时间:2018-01-18 16:36:48

标签: jsf jsf-2 render linkedhashmap

我试图在jsf页面中迭代一张地图。但是在修改了地图数据后,我发现总是在页面上删除最后一项。 具体步骤如下:

点击删除按钮之前:
enter image description here
点击删除按钮后:
enter image description here
刷新页面后:
enter image description here

点击删除按钮之前:
enter image description here
点击删除按钮后:
enter image description here
刷新页面后:
enter image description here

JSF:

<h:panelGroup id="myPanel" layout="block">
        <c:forEach var="entry" items="#{myController.myMap}">
                <div class="col-md-2">
                    <h:outputText value="#{entry.key.date}" >
                        <f:convertDateTime pattern="dd/MM/YYYY" timeZone="GMT+8" />
                    </h:outputText>
                </div>
                <div class="col-md-1">
                    <h:commandLink>
                        <i id="delete-holiday" class="glyphicon glyphicon-trash"></i>
                        <f:ajax event="click" listener="#{myController.delete(entry.key)}" render="myPanel"></f:ajax>
                    </h:commandLink>
                </div>
        </c:forEach>
</h:panelGroup>

java代码:

public void delete(Object date){
    myMap.remove(date);
}

2 个答案:

答案 0 :(得分:0)

我解决了它,原因是jsf foreach渲染中使用的java Map。我对jsf渲染机制一无所知。但我估计它只是将地图的大小改为Map修改而jsf正在渲染Map,但没有获得Map内容。这是一个一致性问题。它可能是jsf机制问题还是有更完美的解决方案来解决它。我不知道。但我已经采用了使用List但不使用Map来呈现数据的解决方案,它运行良好。如果您知道为什么没有映射工作,或者有更好的解决方案。请让我知道。

答案 1 :(得分:0)

我发现另一个解决方案可能会更好。在组件标记中添加一个 f:ajax 标记,如下所示:

savedArray