当一个面板或某个命名容器是c的一部分时:如果它位于c:foreach中。工作不正常,在第一次渲染期间,对象的映射不正确。
JSTL标签(foreach) - > JSTL标签(如果) - >容器(面板/子视图)。
XHTML:可
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
<h:body>
<h:head/>
<h:form id="myForm">
<c:forEach items="#{jstlViwBean.list}" var="node">
<c:if test="#{node ne 'two' or jstlViwBean.flag}" >
<h:panelGroup layout="block" style="display: block">
<h:outputText value="#{node}" />
</h:panelGroup>
</c:if>
</c:forEach>
<p:commandButton process="@this" value="toggle" update="myForm">
<f:setPropertyActionListener target="#{jstlViwBean.flag}" value="#{!jstlViwBean.flag}" />
</p:commandButton>
<p:commandButton process="@this" value="refresh" update=":myForm"/>
</h:form>
</h:body>
</html>
查看bean:
@Named
@ViewScoped
public class JstlViwBean implements Serializable{
private static final long serialVersionUID = 1L;
private boolean flag;
private List<String> list;
@PostConstruct
private void init(){
list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
}
public List<String> getList() {
return list;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
在这个简单的例子中,当标志为真时,我正在添加一个包含两个的面板。切换按钮将切换标志并刷新页面。 当第一次按下切换时,它会给出
“一 三 三“
而不是 “一 二 三“但是下一次刷新会让它恢复正常。
任何人都可以帮助我了解这里发生的事情吗?