Каков наиболее правильный способ включения другой страницы XHTML на страницу XHTML? Я пытаюсь по-разному, ни один из них не работает.
Как включить другой XHTML в XHTML с помощью JSF 2.0 Facelets?
Ответ 1
<ui:include>
Самый простой способ - <ui:include>
. Включенный контент должен быть помещен внутри <ui:composition>
.
Пример Kickoff главной страницы /page.xhtml
:
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head>
<title>Include demo</title>
</h:head>
<h:body>
<h1>Master page</h1>
<p>Master page blah blah lorem ipsum</p>
<ui:include src="/WEB-INF/include.xhtml" />
</h:body>
</html>
Страница включения /WEB-INF/include.xhtml
(да, это файл целиком, любые теги вне <ui:composition>
не нужны, поскольку в любом случае они игнорируются Facelets):
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h2>Include page</h2>
<p>Include page blah blah lorem ipsum</p>
</ui:composition>
Это нужно открыть /page.xhtml
. Обратите внимание, что вам не нужно повторять <html>
, <h:head>
и <h:body>
внутри include файла, что в противном случае приводило бы к недействительному HTML.
Вы можете использовать динамическое выражение EL в <ui:include src>
. См. Также Как обновить динамику ajax с помощью меню навигации? (JSF SPA).
<ui:define>
/<ui:insert>
Более продвинутый способ включения шаблонов. Это включает в себя в основном наоборот. Страница шаблона шаблона должна использовать <ui:insert>
, чтобы объявить места для вставки определенного содержимого шаблона. Страница шаблона клиента, использующая страницу главного шаблона, должна использовать <ui:define>
для определения содержимого шаблона, который должен быть вставлен.
Страница главного шаблона /WEB-INF/template.xhtml
(в качестве подсказки дизайна: заголовок, меню и нижний колонтитул могут в свою очередь быть даже <ui:include>
файлами):
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head>
<title><ui:insert name="title">Default title</ui:insert></title>
</h:head>
<h:body>
<div id="header">Header</div>
<div id="menu">Menu</div>
<div id="content"><ui:insert name="content">Default content</ui:insert></div>
<div id="footer">Footer</div>
</h:body>
</html>
Страница клиента шаблона /page.xhtml
(обратите внимание на атрибут template
, также здесь, это файл целиком):
<ui:composition template="/WEB-INF/template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:define name="title">
New page title here
</ui:define>
<ui:define name="content">
<h1>New content here</h1>
<p>Blah blah</p>
</ui:define>
</ui:composition>
Это нужно открыть /page.xhtml
. Если нет <ui:define>
, тогда будет отображаться содержимое по умолчанию внутри <ui:insert>
, если оно есть.
<ui:param>
Вы можете передать параметры <ui:include>
или <ui:composition template>
с помощью <ui:param>
.
<ui:include ...>
<ui:param name="foo" value="#{bean.foo}" />
</ui:include>
<ui:composition template="...">
<ui:param name="foo" value="#{bean.foo}" />
...
</ui:composition >
Внутри файла include/template он будет доступен как #{foo}
. Если вам нужно передать "много" параметров на <ui:include>
, то лучше рассмотреть вопрос о регистрации файла include в качестве файла тега, чтобы вы могли в конечном итоге использовать его так <my:tagname foo="#{bean.foo}">
. См. Также Когда использовать < ui: include > , файлы тегов, составные компоненты и/или настраиваемые компоненты?
Вы можете передать целые beans методы и параметры с помощью <ui:param>
. См. Также JSF 2: как передать действие, включающее аргумент, который нужно вызвать в подзаголовок Facelets (используя ui: include и ui: param)?
Советы по дизайну
Файлы, которые не должны быть общедоступными, просто вводя/угадывая его URL-адрес, должны быть помещены в папку /WEB-INF
, например, как файл include и файл шаблона в приведенном выше примере. См. Также Какие файлы XHTML мне нужно ввести /WEB -INF, а какие нет?
Не нужно иметь разметку (HTML-код) вне <ui:composition>
и <ui:define>
. Вы можете поместить любой, но они будут проигнорированы Facelets. Внесение разметки в нее полезно только для веб-дизайнеров. См. Также Есть ли способ запустить страницу JSF без создания всего проекта?
Документ HTML5 является рекомендуемым допитом в наши дни, "несмотря на то, что это файл XHTML. Вы должны увидеть XHTML как язык, который позволяет вам создавать HTML-выход, используя инструмент на основе XML. См. Также Можно ли использовать JSF + Facelets с HTML 4/5? и Поддержка JavaServer Faces 2.2 и HTML5, почему XHTML все еще используется.
Файлы CSS/JS/image могут быть включены в качестве динамически перемещаемых/локализованных/версий. См. Также Как ссылаться на ресурс CSS/JS/image в шаблоне Facelets?
Вы можете поместить файлы Facelets в многоразовый файл JAR. См. Также Структура нескольких проектов JSF с общим кодом.
В примерах расширенного шаблона Facelets для реального мира проверьте папку src/main/webapp
исходный код Java EE Kickoff и Исходный код сайта OmniFaces.
Ответ 2
Включенная страница:
<!-- opening and closing tags of included page -->
<ui:composition ...>
</ui:composition>
Включая страницу:
<!--the inclusion line in the including page with the content-->
<ui:include src="yourFile.xhtml"/>
- Вы запускаете прилагаемый файл xhtml с
ui:composition
, как показано выше. - Вы включаете этот файл с
ui:include
в содержащийся в xhtml файл, как показано выше.