c:if 作为 composite:insertChildren 的一部分

c:if as part of composite:insertChildren

我正在尝试将一个应用程序迁移到新的应用程序服务器,由于不同的 JSF 实现,JSF 的行为似乎开始有所不同。现在是 MyFaces 2.0,我遇到了问题。这适用于旧服务器:

有一个包含 <composite:insertChildren> 标签的复合组件 <abc:form>

像这样在 xhtml 中使用此组件时:

<abc:form>
    <c:if test="true">
        this text will not be visible. But it should be.
    </c:if>
</abc:form>

<c:if...部分是儿童。但是什么也没有呈现。好像 c:if 解析为 false,或者不进行测试。

我知道这种情况可以通过使用 <h:outputText> 而不是 <c:if> 来解决,但是我有很多代码,其中 <c:if> 包含在更复杂的子项中。这个例子只是描述我的痛苦的一个简化。

那么,将 jstl 标签作为子组件包含在组件中是否合法? 我认为 JSP/JSF 生命周期是这里的罪魁祸首。


编辑:如以下评论所示,这是 JSF 和 portlet 的组合(WAS 8.5.5 上的 WebSphere Portal 9)。我仍然不确定这里应该归咎于门户(和门户桥)还是纯 JSF。因此,我创建了展示我的问题的演示项目。如果有任何好心人可以使用此代码尝试将其部署到 his/hers 自己的门户,将不胜感激。 它是在 Rational Application Developer 中创建的,方法是创建新的 portlet 项目,其中包含一个 JSF portlet。然后我将复合组件添加到 WebContent/resources,并修改了默认的 portlet 视图 (xhtml)。

Exported projects from RAD

我在一个简单的 Tomcat 网络应用程序中本地测试了您的代码,并且 c:if 作为您的复合组件的子组件按预期工作。根据您的评论,您表示您正在使用 MyFaces Portlet Bridge for JSF 2.0。 That version of the bridge is 3.0.0-alpha. Since things worked correctly in a webapp (even with MyFaces Core 2.0.0) and the portlet bridge version is still alpha, it seems extremely likely that there is a bug in the bridge (maybe PORTLETBRIDGE-179?)。由于不再维护 MyFaces 桥接器,我怀疑该桥接器是否会得到修复。

我建议您通过将 JSTL 标签替换为本质上呈现相同标记的 JSF HTML 标签来解决此问题:

  • <c:if test="true">... -> <h:panelGroup rendered="true">...
  • <c:choose><c:when test="true">...<c:otherwise>...
    ->
    <h:panelGroup rendered="true">...<h:panelGroup rendered="false">...
  • <c:set> -> <ui:param>
  • <c:forEach> -> <ui:repeat>

另请参阅:JSTL in JSF2 Facelets... makes sense?

另一个更困难的解决方案是将复合组件实现为 simple custom Java component or full custom Java component

If there is any kind soul that can use this code to try deploying it to his/hers own portal, it would be much appreciated.

我无法在 Liferay 7.0 + JSF 2.2 + Liferay Faces Bridge 4.1.2 中重现此问题。 c:if 作为复合组件的子组件运行良好。完全披露,我是 Liferay Faces Bridge 开发人员。不幸的是,我认为 Liferay Faces Bridge 无法解决您的问题,因为我们只支持 Mojarra(不支持 MyFaces)和 JSF 2.1+。