Как включить другой XHTML в XHTML с помощью JSF 2.0 Facelets?
каков наиболее правильный способ включить другую страницу XHTML в страницу XHTML? Я пробовал разные способы, ни один из них не работает.
2 ответов
<ui:include>
самый простой способ-это <ui:include>
. Включенный контент должен быть помещен внутрь <ui:composition>
.
стартовый пример главной страницы /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
. Обратите внимание, что вам не нужно повторяю!--13-->, <h:head>
и <h:body>
внутри файла include, поскольку в противном случае это приведет к неверный HTML.
вы можете использовать динамическое выражение EL в <ui:include src>
. См. также как ajax-обновить динамический включить содержимое меню навигации? (JSF SPA).
<ui:define>
/<ui:insert>
более продвинутый способ, в том числе templating. Это включает в себя в основном наоборот. Христос шаблон страницы должен использовать <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
(обратите внимание на ; также вот, это файл в полном объеме):
<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>
by <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 в качестве tagfile, чтобы вы могли в конечном итоге использовать его так <my:tagname foo="#{bean.foo}">
. См. также когда использовать
вы даже можете передать целые бобы, методы и параметры через <ui:param>
. См. также JSF 2: Как передать действие, включая аргумент, который будет вызван к суб-представлению Facelets (используя ui:include и ui: param)?
дизайн советы
файлы, которые не должны быть общедоступными, просто введя / угадав его URL, должны быть помещены в /WEB-INF
папка, например, как файл включения и файл шаблона в приведенном выше примере. См. также какие файлы XHTML мне нужно поместить в /WEB-INF, а какие нет?
там не должно быть никакой разметки (HTML-код) вне <ui:composition>
и <ui:define>
. Вы можете поставить любой, но они будут будь игнорировать по Фейслетов. Размещение разметки там полезно только для веб-дизайнеров. См. также есть ли способ запустить страницу JSF без создания всего проекта?
HTML5 doctype является рекомендуемым doctype в эти дни, "несмотря на", что это файл XHTML. Вы должны увидеть XHTML как язык, который позволяет создавать вывод HTML с помощью инструмента на основе XML. См. также можно ли использовать JSF+Facelets с HTML 4/5? и JavaServer сталкивается с поддержкой 2.2 и HTML5, почему XHTML все еще используется.
файлы CSS/JS/image могут быть включены как динамически перемещаемые/локализованные/версионные ресурсы. См. также как ссылаться на ресурс CSS / JS / image в шаблоне Facelets?
вы можете поместить файлы Facelets в многоразовый файл JAR. См. также структура для нескольких проектов JSF с общим кодом.
для реальных примеров расширенные Шаблоны Facelets, проверьте на исходный код приложения Java EE Kickoff и исходный код сайта OmniFaces showcase.
включены страницы:
<!-- 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 файл, как показано выше.