除了 c:if
或 c:choose
,是否有更好的方法来实现多个组件中的 1 个组件的条件渲染。类似于 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'}" />
与 JSTL 标签的区别在于
rendered
属性在 View 渲染期间评估,而 JSTL 标记在 View 构建期间执行。另见 JSTL in JSF2 Facelets... makes sense?因此,如果评估条件所需的变量的范围比 View 范围(即请求范围)更窄,那么您应该使用
rendered
属性代替。例如,当根据 ajax 请求重新渲染一组组件时。虽然 JSTL 标签在这种情况下可以同样有效地工作,但它们可能被“过早”评估(即在调用操作之前,这可能会改变条件)并且它们也会破坏 View 范围。另见 @ViewScoped
breaks in tag handlers .如果评估条件所需的变量具有更广泛的范围,例如 session 范围或应用程序范围或在某些模板客户端中进行了硬编码,那么 JSTL 标记会更有效,因为它们将仅在 View 构建期间进行评估,而不是在 View 呈现期间每次都进行评估。另见 How to make a grid of JSF composite component?
关于jsf - JSF 页面的 switch case 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9192866/