gpt4 book ai didi

jsf-2 - Tag does not reduce the component tree in composite components

转载 作者:行者123 更新时间:2023-12-01 13:32:19 24 4
gpt4 key购买 nike

我们正在开发一个基于 Mojarra 2.2.8 的具有相当大和复杂 View 的企业应用程序。我们最大的 View 生成超过 20.000 个节点的 JSF 组件树。当然我们遇到了性能问题,所以我们开始通过替换 <ui:repeat> 来减小树的大小。与 <c:forEach>并通过替换 rendered属性为 <c:if>very informative post by BalusC 中推荐的 block .这些措施大大减少了组件树,并带来了显着的性能改进。

虽然有一项措施没有奏效:我们的 View 在选项卡组中包含多个选项卡。当我们试图通过 <c:if> 删除不可见标签的内容时标签,这些选项卡的组件树仍然存在,并且在性能上没有任何好处。

我们发现,<c:if> 的这种用法之间的唯一区别是和其他几个地方是,这次<c:if>是复合组件的一部分,其内容通过 <composite:insertChildren/> 注入(inject)标签。将复合组件标签的子标签注入(inject)其定义的过程似乎与 <c:if> 有某种冲突。标签。我们还尝试替换 insertChildren带有 facet 的标签基于方法,但结果保持不变。

为了演示这一点,这是一个复合组件,它将所有内容包装在 <c:if> 中。标记,始终计算为 false :

<composite:interface>
</composite:interface>

<composite:implementation>
<c:if test="false">
<composite:insertChildren />
</c:if>
</composite:implementation>

这个组件应该什么都不显示,即使它在一个 View 中与很多子元素一起使用。它确实只显示组件树仍然存在,并且没有性能优势。

不幸的是,这使我们无法开发性能优化的选项卡组复合组件。任何人都可以解释一下,为什么会发生这种情况以及是否有解决方法?

我们使用的是 mojarra 2.2.8、el-api 2.2.5、tomcat 8.0。

最佳答案

技术问题是<c:if>在此构造中仅阻止包含(和执行)<cc:insertChildren>标记自己。 <cc:insertChildren> in turn 实际上负责重定位任何复合组件子组件到复合组件实现中声明的位置,以便它们将被实际呈现。默认情况下,复合组件不渲染任何子组件。声明的子项实际上存储为复合组件的一个方面。

换句话说,<c:if>实际上并不能阻止那些子组件最终出现在组件树中。它只会阻止 <cc:insertChildren>从被调用。因此,观察到的行为是按设计工作的。要实现所需的行为,您实际上应该向后移动 <c:if>给客户。

<your:composite ...>
<c:if test="#{false}">
...
</c:if>
</your:composite>

我知道这是不直观的。实际上,您应该从使用复合组件来编写模板中退一步。他们不太适合那个。你应该使用 <ui:composition> , <ui:include> , <ui:decorate>或为此标记文件。复合组件应该只用于组合组件。

另见:

关于jsf-2 - <c :if> Tag does not reduce the component tree in composite components,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com