Проблема с использованием include в Facelets - PullRequest
11 голосов
/ 05 ноября 2010

У меня проблемы, включая шаблон фейслета. Я хотел разделить некоторый контент, чтобы я мог использовать его где-то еще.

Итак, я изменил этот код:

<!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: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, но это тоже не помогло.


Обновление : Согласно моему руководству по Facelets Essentials, оно гласит:

Тег ui:include может использоваться для включения другого файла Facelets в ваш документ. Он просто включает любой указанный вами исходный файл. Вы можете включите любой файл Facelets с тегами ui:component или ui:composition (которые обрезают содержимое вне себя) или просто фрагмент XHTML или XML.

Это то, что происходит? Содержимое за пределами включения обрезается? Как я могу просто включить страницу без обрезки содержимого снаружи?

Ответы [ 2 ]

11 голосов
/ 08 ноября 2010

<ui:define> должен быть помещен в <ui:composition> или <ui:decorate> с a template, содержащим соответствующие теги <ui:insert>. Вы переместили его в <ui:composition> без a 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>
1 голос
/ 08 ноября 2010

Я решил это, удалив <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>
...