你不能在叠代主体的循环标记内部使用 JSF 组件标记,象JSTL 的 <c:forEach>标记。 推荐的方法是使用 HtmlDataTable 组件或其它的组件叠代一个数据集或集合,在这个例子中,没有 JSF 组件 嵌套在 JSTL <c:if>标记内。 但是如果组件显示一次然后当页面再次显示时被条件标记(如 <c:if>)隐藏会发生什么呢? 第一次显示组件时,组件被添加到视图,第二次如果<c:if> 标记不显示组件, JSF 将从视图中删除它。意思就是任何输入控件会丢失他们的本地值,你不能再引用这些组件,举一个例子,看清单3, 它来自清单2的同一页.
清单 3. 用JSTL标记条件显示JSF 组件
...
<h:form>
<h:outputText value="If you entered a number greater than 10,
two input controls will display below."/>
<p>
<c:if test="${sessionScope.exampleBean.number > 10}">
<h:outputLabel id="inputStringLabel"for="inputString">
<h:outputText id="outputStringLabel" value="Enter in your string.
JSF will remember the value unless this control is hidden."/>
</h:outputLabel>
<h:inputText id="inputString"/>
<h:commandButton value="Go!"/>
</c:if>
</p>
</h:form>
...
如果exampleBean.number的值比10大, JSTL <c:if> 标记将会执行它的主体。如果主体被执行,那么所有嵌套其中的组件将增加到视图并显示。 如果没有执行,组件将会删除 (如果先前已增加). 这显示在图1. 如果你用JSTL 条件标记(或其它的定制标记)控制组件的可见性。如果它们没有显示,组件将被从视图中移走。这意思是说组件会忘记他们的本地值。
Figure 1. The JSTL <c:if> tag will execute its body if the value of exampleBean.number is greater than 10. Click on thumbnail to view full-sized image.
图 2 显示了清单2和清单3的输出。顶部输入域(一个 HtmlInputText 组件)的值关联到了 exampleBean.number的属性, JSTL <c:forEach>使用它显示一个字符串exampleBean.number次,在页面底部,如果exampleBean.number的值大于10, JSTL <c:if>标记显示一个带有JSF组件的表格。 否由,组件将不会显示, 并从视图中移出 (输入控件将丢失它的值).
Figure 2. The output of the JSP page shown in Listings 2 and 3. Click on thumbnail to view full-sized image.
你能达到清单3中代码同样的效果,通过把组件放入一个 HtmlPanelGroup 并设置它的 rendered 属性等于同样的表达式。 HtmlPanelGroup 可以作为多个组件的容器,下面是例子:
<h:panelGroup rendered="#{sessionScope.exampleBean.number > 10}">
<h:outputLabel id="inputStringLabel2" for="inputString">
<h:outputText id="outputStringLabel2" value="Enter in your string. JSF
will remember the value."/>
</h:outputLabel>
<h:inputText id="inputString2"/>
<h:commandButton value="Go!"/>
</h:panelGroup>
文章整理:西部数码--专业提供域名注册、虚拟主机服务如果exampleBean.number 大于10,这个面板变得可见。在这种情况下,如果组件没有显示也不会删除。这是一个使用纯JSF而不用JSTL的好例子。
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




