Условно сделать ui: define

Как я могу условно отобразить <ui:define>?

Данные в шаблоне зависят от требуемого <f:viewParam>.

Но если предоставлен недопустимый параметр представления, то <ui:define> не следует отображать, так как необходимо использовать содержимое по умолчанию шаблона.

Я попытался использовать <c:if>, но он не работает.

Ответ 1

Невозможно условно отобразить/построить <ui:define>. Вы можете делать только его содержимое. Все, что находится за пределами <ui:define>, игнорируется в шаблонах.

Лучше условно построить <ui:insert>. <ui:insert> выполняется во время времени сборки, поэтому невозможно условно отобразить его с помощью свойства, которое устанавливается через <f:viewParam>. Вы можете условно построить его (сам тег <ui:insert>), используя тег времени построения условного вида, такой как JSTL <c:if>, который, в свою очередь, напрямую проверяет исходный параметр запроса (и, следовательно, не свойство <f:viewParam>).

В главном шаблоне он будет выглядеть так, если предположить, что достаточно единственного присутствия параметра запроса (если вам нужно выполнить проверку, вам нужно сделать это внутри выражения EL или в управляемом bean, где свойство предварительно инициализируется через @ManagedProperty("#{param.foo}").

Например, в главном шаблоне:

<c:if test="#{not empty param.foo}">
    <ui:insert name="content" />
</c:if>
<c:if test="#{empty param.foo}">
    <p>Default content</p>
</c:if>

или, более понятный, но более подробный

<c:choose>
    <c:when test="#{not empty param.foo}">
        <ui:insert name="content" />
    </c:when>
    <c:otherwise>
        <p>Default content</p>
    </c:otherwise>
</c:choose>

См. также: