除了c:if
或c:choose
之外,是否有更好的方法来实现在多个组件中仅对一个组件进行条件渲染。像JSF页面的switch case那样的东西?
在这种情况下,JSF 的规范方法是使用 rendered
属性。以下是一些示例:
<h:someComponent rendered="#{bean.booleanValue}" />
<h:someComponent rendered="#{bean.intValue gt 10}" />
<h:someComponent rendered="#{bean.objectValue eq null}" />
<h:someComponent rendered="#{bean.stringValue ne 'someValue'}" />
<h:someComponent rendered="#{not empty bean.collectionValue}" />
<h:someComponent rendered="#{not bean.booleanValue and bean.intValue ne 0}" />
<h:someComponent rendered="#{bean.enumValue eq 'ONE' or bean.enumValue eq 'TWO'}" />
rendered
属性,而JSTL标签在视图构建时间执行。详见JSTL in JSF2 Facelets... makes sense?
因此,如果用于评估条件的变量的范围比视图范围更小(例如请求范围),则应使用rendered
属性。例如,在ajax请求时重新渲染一组组件。虽然JSTL标签在这种情况下同样适用,但它们可能会在“太早”(即在调用操作之前)被评估,并且它们还会破坏视图范围。详见@ViewScoped
breaks in tag handlers
如果用于评估条件的变量具有更广泛的范围,例如会话范围或应用程序范围或在某些模板客户端中硬编码,则JSTL标签更有效率,因为它们仅在视图构建期间被评估,并非每次在视图渲染期间。详见How to make a grid of JSF composite component?
您可以使用rendered
属性:
<h:commandButton rendered="#{value == 'value1'}"/>
<h:commandButton rendered="#{value == 'value2'}"/>
虽然它不像真实案例运算符那样清晰,但它是在普通JSF中的。
c:if
更好? - Rajat Gupta
rendered
属性是否比使用c:if
更好? - Rajat Gupta