Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 是否有一种优雅的方法来处理渲染检查,与if-else块非常相似_Jsf_Seam - Fatal编程技术网

Jsf 是否有一种优雅的方法来处理渲染检查,与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."

在下面的场景中,“hasA”条件被检查了两次,是否有一种方法可以模拟类似于if/else块的情况,从而只对条件进行一次评估

            <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/setter实际上只是一个getter/setter,不计算任何内容

  • 这个解释并不十分清楚,但你应该明白这个想法。我认为多次评估一个简单的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注释在上下文中存储计算值。