Java 如何在JSF中设置变量?

Java 如何在JSF中设置变量?,java,jsf,variables,jstl,el,Java,Jsf,Variables,Jstl,El,这里我的代码迭代每一行的列,并且每次迭代都会计算呈现的属性,覆盖testRule <p:dataTable ...> <p:column ...> ... </p:column> <p:column rendered="#{managedBean.testRule('rules.canDoActions')}"> <!-- Action buttons --> &

这里我的代码迭代每一行的列,并且每次迭代都会计算
呈现的
属性,覆盖
testRule

<p:dataTable ...>
    <p:column ...>
        ...
    </p:column>

    <p:column rendered="#{managedBean.testRule('rules.canDoActions')}">
        <!-- Action buttons -->
        <h:commandButton ...>
        <h:commandButton ...>
    </p:column>
</p:dataTable>

...
为了获得更好的性能,我想将结果设置为一个变量,但我不知道如何。。。它会变成这样:

   <?:??? var="canDoActions" value="#{managedBean.testRule('rules.canDoActions')}">
   <p:dataTable ...>
        <p:column ...>
            ...
        </p:column>

        <p:column rendered="#{canDoActions}">
            <!-- Action buttons -->
            <h:commandButton ...>
            <h:commandButton ...>
        </p:column>
    </p:dataTable>

我不允许使用核心标签库,这意味着
是不可能的

然后,您可以将它存储在Bean本身上,并检查它是否为null calculateRules和set value,或者只是返回

例如:

HashMap<String, Boolean> map;

public boolean testRule(String stringInput) {
   Boolean result = map.get(stringInput);

   if (result == null) {
       //calculate and set in map
   }

   return result;
}
HashMap;
公共布尔测试规则(字符串stringInput){
布尔结果=map.get(stringInput);
如果(结果==null){
//在地图上计算和设置
}
返回结果;
}

为什么不“允许”使用JSTL核心标记库?@BalusC:Architect决定不将JSTL与JSF结合使用,因为(如果我没有错的话)它在其他标记的不同阶段运行,而这里的人肆无忌惮地使用它,混合了一些东西,出现了许多错误和困惑(如果我没有错的话,JSTL核心不会在ajax调用中重新运行)。JSTL是为JSP创建的,它是为JSP进行逻辑设计的。我知道它可以与JSF一起使用,但是,在这里,架构师认为JSTL的使用不是最佳实践。尽管我们牺牲了JSTL,我们的问题还是解决了(相信,JSTL并不是那么必要)。很高兴和你谈话,@BalusC!JSTL确实没有必要。但是,当您想要动态构建视图时,它可能会有所帮助。另请参见,虽然您的架构师肯定有一个正确的观点(对于初学者来说,这确实经常令人困惑),但完全限制它有点过分热情。嗯,
将是你问题的答案。如果这不是一个选项(或者揭示了其他问题;例如,它与视图范围的bean不匹配),那么您必须将自身缓存在getter中。请看Jigar的回答。我同意BalusC的观点,另外请注意,Facelets使用的JSTL并不是JSP附带的真正JSTL。这是一个专门改编的“模拟”。请注意,甚至不是所有属性和标记都存在。然后,本机Facelets库也有构建时和运行时标记。此外,如果我没有弄错的话,c:set和ui:param实际上都不存储结果,只是分配给它的表达式的动态别名。也许使用即时语法${…}可以获得这种效果。