Использование проблемы в Facelets
У меня проблемы с шаблоном facelet. Я хотел разбить некоторый контент, чтобы я мог повторно использовать его где-то еще.
Итак, я изменил этот код:
<!DOCTYPE html>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/layout/template.xhtml">
<ui:define name="head">
<title>Title</title>
</ui:define>
<ui:define name="header">
<h3>Header</h3>
</ui:define>
<ui:define name="content">
<table><tr><td>table</td></tr></table>
</ui:define>
</ui:composition>
Для этого:
<!DOCTYPE html>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/layout/template.xhtml">
<ui:define name="head">
<title>Title</title>
</ui:define>
<ui:include src="/admin/admin_generic.xhtml"/>
</ui:composition>
И внутри admin-generic.xhtml
я завернул код в композиции ui:.
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:define name="header">
<h3>Header</h3>
</ui:define>
<ui:define name="content">
<table><tr><td>table</td></tr></table>
</ui:define>
</ui:composition>
Но ничего не показано. Я просто получаю пустую страницу без ошибок. Неправильно ли использовать ui:composition
? Я пробовал с ui:component
, но это тоже не помогло.
Обновить. Согласно руководству Essentials от Facelets, он говорит:
Тег ui:include
можно использовать для включения другого файла Facelets в ваш документ. Он просто включает любой исходный файл, который вы указываете. Ты можешь включая любой файл Facelets с тегами ui:component
или ui:composition
(которые обрезают содержимое вне себя) или просто фрагмент XHTML или XML.
Это то, что происходит? Является ли контент вне его включенным? Как я могу просто включить страницу, без того, чтобы содержимое было обрезано?
Ответы
Ответ 1
<ui:define>
должен быть помещен в <ui:composition>
или <ui:decorate>
с a template
содержащий соответствующие теги <ui:insert>
. Вы переместили его в <ui:composition>
без template
. Без шаблона нет содержимого.
Технически, для достижения вашего требования вы должны заменить <ui:include>
на <ui:insert>
.
<!DOCTYPE html>
<ui:composition
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="template.xhtml">
<ui:define name="head">
<title>Title</title>
</ui:define>
<ui:insert />
</ui:composition>
И объявите вышеприведенную страницу (я предполагаю ее как somepage.xhtml
) как template
в admin_generic.xhtml
.
<!DOCTYPE html>
<ui:composition
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="somepage.xhtml">
<ui:define name="header">
<h1>Header</h1>
</ui:define>
<ui:define name="content">
<table><tr><td>table</td></tr></table>
</ui:define>
</ui:composition>
Обратите внимание, что вместо этого нужно открыть admin_generic.xhtml
в браузере. Если вы намерены открыть somepage.xhtml
в браузере, то <ui:define>
действительно должен оставаться в somepage.xhtml
. Однако вы можете заменить тело <ui:define>
простым <ui:include>
.
<!DOCTYPE html>
<ui:composition
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="template.xhtml">
<ui:define name="head">
<title>Title</title>
</ui:define>
<ui:define name="header">
<h1>Header</h1>
</ui:define>
<ui:define name="content">
<ui:include src="admin_generic.xhtml" />
</ui:define>
</ui:composition>
Он допускает <ui:composition>
, поэтому вам необязательно устанавливать <table>
в root.
<!DOCTYPE html>
<ui:composition
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<table><tr><td>table</td></tr></table>
</ui:composition>
Ответ 2
Я решил это, удалив <ui:composition>
и <ui:define>
и просто добавив пространство имен непосредственно в <table>
следующим образом:
<table class="adminform" xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a="http://richfaces.org/a4j">
Итак, теперь моя страница выглядит так:
<ui:define name="content">
<ui:include src="/admin/admin_generic.xhtml" />
</ui:define>