#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