12

I have problems including a facelet template. I wanted to split some content up, so that I can reuse it somewhere else.

So I changed this code:

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

To this:

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

And inside admin-generic.xhtml I wrapped the code in a ui:composition.

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

But nothing is shown. I just get a blank page, with no errors. Is it wrong using ui:composition? I have tried with ui:component but that didn't help either.


Update: According to my Facelets Essentials Guide, it says:

The ui:include tag can be used to include another Facelets file into your document. It simply includes whatever source file you specify. You can include any Facelets file that has ui:component or ui:composition tags (which trim the content outside themselves) or simply a fragment of XHTML or XML.

Is that what is going on? Is the content outside of the include trimmed away? How can I just include the page, without the content outside being trimmed?

2 Answers 2

12
+150

The <ui:define> has to be placed in an <ui:composition> or <ui:decorate> with a template containing the appropriate <ui:insert> tags. You've moved it to an <ui:composition> without a template. No template means no content.

Technically, to achieve your requirement, you have to replace the <ui:include> by <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> 

And declare the above page (I assume it as somepage.xhtml) as template in 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> 

Note that you have to open admin_generic.xhtml in the browser instead. If your intent is to open somepage.xhtml in browser, then the <ui:define> really has to stay in somepage.xhtml. You can however replace the body of <ui:define> by a 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> 

It allows for <ui:composition>, so you don't necessarily need to put the <table> to 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> 
Sign up to request clarification or add additional context in comments.

1 Comment

You're welcome. In the future try to minimize irrelevant noise in the question so that others will answer it sooner :)
1

I solved this by removing the <ui:composition> and the <ui:define> and just adding the namespace directly in the <table> like this:

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

So now my page looks like this:

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

1 Comment

You don't necessarily need to declare the table as root. An ui:composition would work as good. I think your misconception is caused by a lot of trial'n'error. The whole point is that the ui:define has to go in an ui:composition with a template.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.