Шаблон JSF, включите фрагмент HTML на каждой странице - PullRequest
1 голос
/ 30 июня 2011

Я не могу понять, как включить фрагмент HTML (скажем, немного table) на каждую страницу моего веб-приложения.

Скажем, это таблица, которую я хочу включить,поэтому я сделал шаблон:

<?xml version ... ?>
<!DOCTYPE ...">
<html xmlns="... all the required namespaces ...">
    <head>
    </head>
    <body>
        <table>
            <tr><td>first</td><td>second</td><td>third</td><td>...</td></tr>
        </table>
    </body>
</html>

, тогда у меня есть код, который использует его:

<?xml version ...?>
<!DOCTYPE ...">
<html xmlns="... all required namespaces ...">

    <body>
        <h3>Will this be displayed?</h3>
        <ui:composition template="tableTemplate.xhtml">
            <h4>Will this?</h4>
        </ui:composition>
    </body>

</html>

страница, которую я получаю в браузере:

<html xmlns ...>
    <head>
    </head>
    <body>
         <table>
             <tr><td>first</td><td>second</td><td>third</td><td>...</td></tr>
         </table>
    </body>
</html>

так что есть таблица, но все остальное отсутствует!

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

В главном шаблоне необходимо использовать <ui:insert>, чтобы объявить место, где будут вставлены определения шаблона.

template.xhtml

<!DOCTYPE html>
<html lang="en"
    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">
    <h:head>
        <title><ui:insert name="title">Default title</ui:insert></title>
    </h:head>
    <h:body>
        <ui:insert name="body">Default body</ui:insert>
        <table>
            <tr><td>first</td><td>second</td><td>third</td><td>...</td></tr>
        </table>
    </h:body>
</html>

В клиенте шаблона вам нужно использовать <ui:define> для определения определений шаблона, которые должны быть вставлены в места, объявленные в шаблоне.

page.xhtml

<ui:composition template="template.xhtml"
    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="title">
        Define your page title here
    </ui:define>

    <ui:define name="body">
        <h3>Define your body content here</h3>
        <p>Blah blah</p>
    </ui:define>
</ui:composition>

Нет HTML вокруг <ui:composition> не требуется. Они будут игнорироваться в любом случае. Просто не размещайте там HTML, это только пустая трата места и сбивает с толку.

Когда вы открываете page.xhtml в браузере, в отрендеренном выводе появится следующее:

<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Define your page title here</title>
    </head>
    <body>
        <h3>Define your body content here</h3>
        <p>Blah blah</p>
        <table>
            <tr><td>first</td><td>second</td><td>third</td><td>...</td></tr>
        </table>
    </body>
</html>
3 голосов
/ 30 июня 2011

TRY

<ui:include src="tableTemplate.xhtml"/>

и в вашей таблице Template.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets">

    put your template here

</ui:composition>
...