Как использовать тег внутри тега

#jsf-2

#jsf-2

Вопрос:

Я хочу использовать <f:loadBundle> тег, на мой взгляд. Я знаю, что могу объявить его внутри faces-config.xml , но по какой-то причине я хочу использовать его, на мой взгляд. Я использую тег таким образом, но он не работает. Я использую его внутри <ui:composition> тега.

 <h:head>
    <title>Email Content</title>
</h:head>
<h:body>
    <ui:composition template="./WEB-INF/templates/layout.xhtml">
        <ui:define name="content">
            <f:loadBundle basename="presentationBeans.homepage.messages" var="msgs"/>
            <h:form id="emailContent_Review" >
                <p:growl id="growl" showDetail="true" />
                <p:panel id="panel"  
                    header="#{msgs.ECR_panelHeader}" 
                    style="border-color: #000000;width: 960px;position: absolute;left: 150px;height: 370px" >
                    <p:dataTable value="#{emailContent_Review.emailContent}"
                        var="emailContent"
                        selection="#{emailContent_Review.selectedEmailContent}"
                        emptyMessage="#{msgs.ECR_tableEmptyMessage}" 
                        widgetVar="portalsTable"
                        rows="8" height="350" paginator="true">
                        <f:facet name="header" >
                        </f:facet>
                    </p:dataTable>
                </p:panel>
            </h:form>
        </ui:define>
    </ui:composition>
</h:body>
  

Что я делаю не так? Также я прочитал, что

Чтобы использовать шаблон, вы используете тег ‘ui:composition’ с атрибутом ‘template’ . Facelets удаляет все теги за пределами тега, то есть объявление doctype, теги html, head, title и body . Это необходимо, потому <ui:composition> что заменяется шаблоном, который содержит собственный набор тегов html, head, title и body .

Если я хочу использовать свой файл свойств в разделе head, то как я могу его использовать? Потому что раздел head находится вне <ui:composition> тега. Я хочу сказать, если я хочу это сделать

 <h:head>
    <title>#{msgs.indexWindowTitle}</title>
</h:head>
  

тогда как я могу использовать свой файл свойств снаружи <ui:composition> ?

Ответ №1:

Это действительно не сработает. Измените свой основной шаблон layout.xhtml , чтобы заменить заголовок шаблоном вставить заполнитель:

 <h:head>
    <title><ui:insert name="title">Default title</ui:insert></title>
</h:head>
  

Затем измените свой шаблон client, чтобы определить его:

 <ui:composition template="./WEB-INF/templates/layout.xhtml">
    <ui:define name="title">
        <f:loadBundle basename="presentationBeans.homepage.messages" var="msgs"/>
        #{msgs.indexWindowTitle}
    </ui:define>
    <ui:define name="content">
        ...
    </ui:define>
</ui:composition>
  

Обратите внимание, что вам не нужно повторять <f:loadBundle> for <ui:define name="content"> .

Комментарии:

1. Привет, спасибо, извините за поздний ответ. Большое вам спасибо 🙂 😉

2. @BalusC обычно вы хотите, чтобы a f:loadBundle был вашим основным шаблоном, но теперь вы рекомендуете помещать его в каждое представление?

Ответ №2:

Я натолкнулся на подход, который хорошо работает для меня на Mojarra 2.1.x, возможно, дать ему сбой. Настройка примера @BalusC:

 <ui:composition>
    <f:loadBundle basename="presentationBeans.homepage.messages" var="msgs"/>

    <ui:decorate template="./WEB-INF/templates/layout.xhtml">
        <ui:define name="title">
            #{msgs.indexWindowTitle}
        </ui:define>
        <ui:define name="content">
            ...
        </ui:define>
    </ui:decorate>
</ui:composition>
  

Мой подход к вложению шаблонного ui:decorate в мои простые теги ui:composition хорошо работает для меня, потому что я часто хочу объявить один тег f:loadBundle, который является общим для всех моих вложенных ui:define. Однако я не уверен, какие дополнительные манипуляции я заставляю выполнять ядро, когда я делаю это, или если я использую неполную реализацию спецификации, чтобы получить то, что я хочу. YMMV