【问题标题】:JSF rendered questionJSF 呈现的问题
【发布时间】:2011-08-23 02:04:04
【问题描述】:

真的应该评估将子元素解析为 render="false" 的元素吗?这给我带来了很多关于空指针异常和类似问题的麻烦。看下面的例子:

<p:tab title="#{userCompetenceController.getTreeName(3)}" rendered="#{!empty userCompetenceController.getTreeName(3)}">
  <xdin:competenceTable id="competenceBox3"
                        profile="#{userCompetenceController.selectedProfile}"
                        tree="#{userCompetenceController.getCompetenceTree(3)}"
                        maxHeight="500px"/>
</p:tab>

主要问题(除了性能)是xdin:competenceTable 不支持空的tree-attribute。 getTreeName(int index) 在这种情况下返回 null,然后调用 getCompetenceTree(3) 返回 null,即使其父级 (p:tab) 具有 rendered="false"

简而言之:xdin:competenceTable 被 EL 解析,即使它的父级有 rendered="false"。为什么?

【问题讨论】:

  • 突然想到的一件事 - 如果您使用 Facelets 并且属性的类型不是 ValueExpression,那么可以在树创建时评估表达式。
  • 恐怕我知识不够,无法得到您的提示。
  • 通用视图技术要么是 Facelets (XHTML) 要么是 JSP——它们在 EL 方面的行为不同。就属性类型而言——如果你以panelGroup 为例,大多数都定义为javax.el.ValueExpression 类型——这意味着它们可以采用延迟表达式。
  • 有道理。我假设我使用的 primefaces 组件正在使用 ValueExpressions,因此在不知道是否应该渲染的情况下构建了整个树。

标签: jsf-2 el


【解决方案1】:

看看下面的 JSF 生命周期。

渲染只是最后一个阶段,rendered="false" 只影响最后一个阶段,而构造组件的错误发生在第一个阶段。

非渲染组件应该实际上在所有阶段都不做任何事情,但看起来你的组件似乎不符合规范的那部分。

【讨论】:

  • 有道理。那么没有办法有条件地解析 EL 表达式吗?
  • @Rasmus:有条件地解析?当然不。有条件地评价?也许 - 不确定 && 和 ||在 EL 中发生短路。但无论如何我都不会在 EL 中添加太多逻辑,而是更喜欢将方法添加到支持 bean。
  • 我的问题实际上并不在于繁重的 EL 逻辑,而在于延迟从数据库加载大量数据的支持 bean 方法。未渲​​染对象的 EL 解析导致它们获取尚未需要的数据。
  • @Rasmus:那么这些方法难道不能根据您用于渲染属性的相同标准来避免加载任何内容吗?
  • @Michael - 说渲染属性只影响最后一个阶段是不正确的 - 在符合要求的组件中,它会影响每个阶段 - Property: 渲染。访问:RW。类型:布尔值。描述:一个标志,如果设置为 true,则表示应在请求处理生命周期的所有阶段处理此组件。默认值为“true”。 组件应在每个阶段处理之前检查此值。这主要是一种安全机制。
猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2013-11-29
  • 2011-07-24
相关资源
最近更新 更多