c: если как часть составного: insertChildren - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь перенести одно приложение на новый сервер приложений, и JSF начинает работать по-разному из-за другой реализации JSF.Сейчас у меня проблема с MyFaces 2.0.Это работало на старом сервере:

есть составной компонент <abc:form>, который включает тег <composite:insertChildren>.

при использовании этого компонента в xhtml, например:

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

эта <c:if... часть - дети.Однако ничего не отображается.Как будто c: если разрешено в false, или тестирование не выполняется.

Я знаю, что этот случай можно разрешить, используя <h:outputText> вместо <c:if>, но у меня есть много кода, где <c:if> входит в состав более сложных детей.Этот пример - просто упрощение, описывающее мою боль.

Итак, законно ли иметь теги jstl, которые могут быть включены как дочерние элементы для компонентов? Я предполагаю, что здесь виноваты жизненные циклы JSP / JSF.


edit: как видно из комментария ниже, это комбинация JSF и портлета (WebSphere Portal 9 в WAS 8.5.5).Я все еще не уверен, виноват ли портал (и портальный мост) или чистый JSF здесь.Поэтому я создал демонстрационный проект, который проявляет мою проблему.Если есть какая-нибудь добрая душа, которая может использовать этот код, чтобы попытаться развернуть его на своем собственном портале, это будет очень цениться.Он был создан в Rational Application Developer путем создания нового проекта портлета с одним портлетом JSF внутри.Затем я добавил составной компонент в WebContent / resources и изменил представление портлета по умолчанию (xhtml).

Экспортированные проекты из RAD

1 Ответ

0 голосов
/ 21 декабря 2018

Я тестировал ваш код локально в простом веб-приложении Tomcat и c:if работал, как и ожидалось, как дочерний компонент вашего составного компонента.Из ваших комментариев вы указали, что используете портлет MyFaces Bridge для JSF 2.0. Это версия моста 3.0.0-alpha. Поскольку в веб-приложении все работало правильно (даже с MyFaces Core 2.0.0), а версия моста портлета все еще альфа-версия, представляется весьма вероятной ошибкав мостике (может быть 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 в JSF2 Facelets ... имеет смысл?

Еще одно, более сложное решение - реализовать ваш составной компонент в виде простого настраиваемого компонента Java или полностью настраиваемого компонента Java вместо этого.

Если естьлюбая добрая душа, которая может использовать этот код, чтобы попытаться развернуть его на своем портале, была бы очень признательна.

Я не смог воспроизвести эту проблему в Liferay 7.0 + JSF 2.2 + Liferay Faces Bridge4.1.2.c:if нормально работал как дочерний элемент вашего составного компонента.Полное раскрытие, я разработчик Liferay Faces Bridge.К сожалению, я не думаю, что Liferay Faces Bridge решит вашу проблему, поскольку мы поддерживаем только Mojarra (не MyFaces) и JSF 2.1 +.

...