Проверьте, была ли ui: insert определена в клиенте шаблона

Мне интересно, можно ли узнать, было ли ui:insert определено в ui:composition. Я знаю, что я могу сделать это, используя отдельный ui:param, но просто хотел сделать это, чтобы это не было простым и менее подверженным ошибкам.

Пример:

Шаблон

...
<ui:insert name="sidebar" />

<!-- Conditionnaly set the class according if sidebar is present or not -->
<div class="#{sidebar is defined ? 'with-sidebar' : 'without-sidebar'}">
    <ui:insert name="page-content" />
</div>
...

Page 1

...
<ui:define name="sidebar">
    sidebar content
</ui:define>

<ui:define name="page-content">
    page content
</ui:define>
...

Page 2

...
<ui:define name="page-content">
    page content
</ui:define>
...

Ответ 1

ui:param для меня лучший способ. Это просто вопрос правильного использования. В качестве простого примера я определяю параметр здесь, чтобы указать там боковую панель или нет. Имейте в виду, что вы можете определить определение вставки по умолчанию в шаблоне, поэтому просто объявите его внутри:

template.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html">

    <ui:insert name="sidebar">
        <!-- By default, there no sidebar, so the param will be present.
            When you replace this section for a sidebar in the client template,
            the param will  be removed from the view -->
        <ui:param name="noSideBar" value="true" />
    </ui:insert>

    <div class="#{noSideBar ? 'style1' : 'style2'}">
        <ui:insert name="content" />
    </div>

</ui:composition>

Затем пара представлений здесь, одна с боковой панелью, а другая без боковой панели. Вы можете проверить его и посмотреть, как меняется стиль в браузере. Вы заметите, что во втором нет значения для #{noSideBar}, которое будет оцениваться как false в любом условном выражении EL.

page1.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets" template="/template.xhtml">
    <ui:define name="content">
        No sidebar defined? #{noSideBar}
    </ui:define>
</ui:composition>

page2.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets" template="/template.xhtml">
    <ui:define name="sidebar" />
    <ui:define name="content">
        No sidebar defined? #{noSideBar}
    </ui:define>
</ui:composition>

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