2011-12-20 36 views
3

我的代码在这里遍历每行的列,并且rendered属性每次迭代计算一次,过度调用testRule如何在JSF中设置变量?

<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> 

另外,我'不允许使用核心标签库,这意味着<c:set ../>是无可争议的。

在那个范围内,我怎么能设置一个变量?或者,如果不可能,您建议如何解决这个问题?

+1

你为什么不 “允许” 使用JSTL核心标签库? – BalusC 2011-12-20 18:57:01

+0

@BalusC:建筑师决定不使用JSF的JSTL,因为(如果我没有错的话)它运行在其他标签的不同阶段,这里的人们在乱用它,混合东西,出现很多错误和混淆(如果我没有错,JSTL核心不会在ajax调用上重新运行)。 JSTL是为JSP创建的,并且是为其设计的。我知道它可以与JSF一起使用,但是,在这里,架构师决定使用JSTL并不是最佳实践。尽管我们牺牲了JSTL,但我们的问题已经解决了(相信JSTL不是那么必要)。很高兴和你谈谈,@BalusC! – falsarella 2011-12-20 19:21:03

+4

JSTL确实没有必要。但是,当您想要动态构建视图时,它可能会有所帮助。另请参见http://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense虽然您的架构师肯定有一个有效的点(它确实经常令启动者感到困惑),但完全限制它有点过分热情。那么''就是你的问题的答案。如果这不是一个选项(或者显示其他问题;例如,它与视图范围的bean不能很好地协作),那么你必须在getter中缓存自己。参见Jigar的答案。 – BalusC 2011-12-20 19:29:42

回答

5

我不能使用的核心标签库,至极意味着<c:set ../>是毫无疑问的

然后你可以把它保存在bean本身并检查是否为空calculateRules和设定值或者干脆返回。

例如:

HashMap<String, Boolean> map; 

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

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

    return result; 
}