2010-11-05 14 views
11

Tengo problemas, incluida una plantilla de facelet. Quería dividir algo de contenido, para poder reutilizarlo en otro lugar.Problema al utilizar include en Facelets

Así que cambió este código:

<!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> 

A esto:

<!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> 

Y dentro admin-generic.xhtml que envuelve el código de una interfaz de usuario: composición.

<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> 

Pero nada se muestra. Acabo de recibir una página en blanco, sin errores. ¿Está mal usar ui:composition? Lo he intentado con ui:component pero eso tampoco ayudó.


actualización: Según mi guía Facelets Essentials, que dice:

La etiqueta ui:include se puede utilizar para incluir presentar otra Facelets en el documento . Simplemente incluye cualquier archivo fuente que especifique. Puede incluir cualquier archivo Facelets que tiene ui:component o ui:composition etiquetas (que recortan el contenido fuera de sí mismos) o simplemente un fragmento de XHTML o XML.

¿Eso es lo que está pasando? ¿Está el contenido fuera del include recortado? ¿Cómo puedo simplemente incluir la página sin que el contenido esté recortado?

Respuesta

11

El <ui:define> tiene que ser colocado en un <ui:composition> o <ui:decorate>con un template que contiene elapropiadoetiquetas. Lo ha movido a <ui:composition>sin a template. Sin plantilla significa que no hay contenido.

Técnicamente, para lograr su requisito, debe reemplazar el <ui:include> por <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> 

y declarar la página anterior (supongo que como somepage.xhtml) como template en 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> 

Tenga en cuenta que usted tiene que abrir admin_generic.xhtml en el navegador. Si su intención es abrir somepage.xhtml en el navegador, entonces el <ui:define> realmente tiene que permanecer en somepage.xhtml.Sin embargo, puede reemplazar el cuerpo de <ui:define> por un simple <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> 

Permite <ui:composition>, por lo que no necesariamente tienen que poner el <table> a la raíz.

<!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> 
+0

Gracias por la aclaración –

+0

De nada. En el futuro intenta minimizar el ruido irrelevante en la pregunta para que otros lo contesten antes :) – BalusC

+0

Sí, buen consejo. Haré –

1

He resuelto mediante la eliminación de la <ui:composition> y la <ui:define> y simplemente añadiendo el espacio de nombres directamente en el <table> así:

<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"> 

Así que ahora mi página tiene el siguiente aspecto:

<ui:define name="content"> 
    <ui:include src="/admin/admin_generic.xhtml" /> 
</ui:define> 
+2

No es necesario que declare la tabla como raíz. Un 'ui: composition' funcionaría tan bien. Creo que tu idea errónea es causada por mucho juicio y error. El punto es que el 'ui: define' debe ir en una 'ui: composition' con una' template'. – BalusC

+0

Sí, tienes razón. Su último punto es la clave –

Cuestiones relacionadas