JSF页面的Switch case替代方案

5

除了c:ifc:choose之外,是否有更好的方法来实现在多个组件中仅对一个组件进行条件渲染。像JSF页面的switch case那样的东西?


1
相关链接:https://dev59.com/3W445IYBdhLWcg3wappH#4870557 - BalusC
@BalusC:您能否澄清一下,使用rendered属性是否比使用c:if更好? - Rajat Gupta
我认为,由于我将为多个组件拥有几个“rendered”属性,因此最好使用一组“if”“otherwise”,以便如果我的第一个条件具有更大的可能性成立,那么我就可以避免进一步的条件检查。 - Rajat Gupta
2个回答

7

在这种情况下,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标签在这种情况下同样适用,但它们可能会在“太早”(即在调用操作之前)被评估,并且它们还会破坏视图范围。详见@ViewScoped breaks in tag handlers 如果用于评估条件的变量具有更广泛的范围,例如会话范围或应用程序范围或在某些模板客户端中硬编码,则JSTL标签更有效率,因为它们仅在视图构建期间被评估,并非每次在视图渲染期间。详见How to make a grid of JSF composite component?

1

您可以使用rendered属性:

<h:commandButton rendered="#{value == 'value1'}"/>
<h:commandButton rendered="#{value == 'value2'}"/>

虽然它不像真实案例运算符那样清晰,但它是在普通JSF中的。


你能否澄清一下,它是否比使用 c:if 更好? - Rajat Gupta
@user 不知道。你不需要导入jstl命名空间 :) - Mikita Belahlazau
《JavaServer Faces》和《Core JavaServer Faces》两本书都提到使用c:if是低效的,但没有说明原因。无论如何,如果可以通过标准JSF标签实现相同的功能,为什么要使用它们呢? - Ravi Kadaboina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接