Jsf 是否有一种优雅的方法来处理渲染检查,与if-else块非常相似
在下面的场景中,“hasA”条件被检查了两次,是否有一种方法可以模拟类似于if/else块的情况,从而只对条件进行一次评估Jsf 是否有一种优雅的方法来处理渲染检查,与if-else块非常相似,jsf,seam,Jsf,Seam,在下面的场景中,“hasA”条件被检查了两次,是否有一种方法可以模拟类似于if/else块的情况,从而只对条件进行一次评估 <s:decorate template="/layout/display.xhtml"> <h:outputText value="Print A." rendered="#{hasA}"/> <h:outputText value="Print B."
<s:decorate template="/layout/display.xhtml">
<h:outputText value="Print A." rendered="#{hasA}"/>
<h:outputText value="Print B." rendered="#{!hasA}"/>
</s:decorate>
您可以使用EL表达式在值属性中写入条件
<h:outputText value="#{hasA ? 'Print A.' : 'Print B.'}" />
为了避免这个问题,您可以确保getter不会重复执行任何复杂的操作,或者基本上返回一个布尔值。您还应该确保getter是:调用两次应该得到相同的结果。要做到这一点,您可以
这个解释并不十分清楚,但你应该明白这个想法。我认为多次评估一个简单的getter没有什么错 这将导致这些控件中的一个或另一个被添加到JSF组件树中。如果提交了表单并恢复了视图,则不管
${hasA}
的值是多少,树已经构建好,原始状态将被重新呈现。混合使用JSF和非JSF控件、即时求值和延迟求值表达式——这通常会导致令人惊讶的行为。我只是指出了这一点,以便使用此代码段的任何人都不会受到严重的震惊。@McDowell-您是指我的第一个使用h:output text的解决方案,还是使用JSTL的解决方案?这就是我编写推荐方法的原因-使用rendered。但是,我添加了对第一个的引用comment@Odelya-我指的是JSTL和JSF标记的混合。我们的outputtext示例是一个完美的答案。毫无理由地抛出JSTL会使答案变得笨拙。OP根本没有提到JSTL,这也不是推荐的方式。我也没有在每一个JSF+JSP回答中提到它可以用Scriptlet完成,但不推荐这样做。如果你整理了答案,你会得到一张选票:)他更喜欢优雅的方式来使用它,意思是,不要写同样的条件twice@Odelya哦,优雅是品味的问题。我建议坚持使用简单的rendered
属性,不要混合使用JSTL或编写复杂的EL表达式。使用Seam@Factory注释在上下文中存储计算值。