【问题标题】:How to set a variable in JSF?如何在 JSF 中设置变量?
【发布时间】:2012-01-24 16:51:52
【问题描述】:

我的代码在这里迭代每一行的列,每次迭代都会计算 rendered 属性,超过 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>

另外,我不允许使用核心标签库,这意味着&lt;c:set ../&gt; 是不可能的。

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

【问题讨论】:

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

标签: java jsf variables jstl el


【解决方案1】:

我不允许使用核心标签库,这意味着&lt;c:set ../&gt; 是不可能的

然后您可以将它存储在 Bean 本身上并检查它是否为 null 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2021-08-10
    • 2019-09-18
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多