除c:if
或c:choose
之外,是否有更好的方法可以从多个组件中实现1个组件的条件渲染。像JSF页面的开关案例?
答案 0 :(得分:6)
规范的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'}" />
与JSTL标记的区别在于,在视图渲染时评估rendered
属性,而在视图构建期间执行JSTL标记。另请参阅JSTL in JSF2 Facelets... makes sense?
因此,如果评估条件所需的变量具有比视图范围(即请求范围)更窄的范围,那么您应该使用rendered
属性。例如,在ajax请求时重新呈现一组组件时。虽然JSTL标签 在这种情况下可以同样有效,但它们可能会被评估过早#34; (即在调用动作之前,这可能反过来改变了条件)并且它们也会破坏视图范围。另请参阅@ViewScoped
breaks in tag handlers。
如果评估条件所需的变量范围更广,例如在会话范围或应用程序范围内或在某些模板客户端中进行了硬编码,然后JSTL标记更有效,因为它们仅在视图构建时间内进行评估,而不是在视图渲染时间内每次评估。另请参阅How to make a grid of JSF composite component?
答案 1 :(得分:1)
您可以使用rendered
属性:
<h:commandButton rendered="#{value == 'value1'}"/>
<h:commandButton rendered="#{value == 'value2'}"/>
它不像真实案例运算符那么清晰,但它是在普通的JSF中。