Ответ 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>