Hi Stephen,

This actually is a very common mistake people make with JSF 2. The
problem is the following:

As you correctly pointed out, f:metadata needs to be a direct child of
f:view. However, with facelets f:view is handled very differently then
with JSP. In JSP you need f:view as the root tag for every other JSF
tag, but in facelets the UIViewRoot is always the xml root tag (the
most outer tag with the xmlns attributes). Thus in JSF 2 when using
facelets, UIViewRoot is most certainly created by the following code:

<html xmlns="http://www.w3.org/1999/xhtml";
    xmlns:ui="http://java.sun.com/jsf/facelets";
    xmlns:h="http://java.sun.com/jsf/html";
    xmlns:f="http://java.sun.com/jsf/core";>

This means that you have to place f:metadata as a direct child of the
above root element, for example:

<html xmlns="http://www.w3.org/1999/xhtml";
    xmlns:ui="http://java.sun.com/jsf/facelets";
    xmlns:h="http://java.sun.com/jsf/html";
    xmlns:f="http://java.sun.com/jsf/core";>

    <f:metadata>....</f:metadata>

</html>

This will make it work ;)

Also, as an explanation why there still is a f:view tag for facelets
also: Since you need some kind of way to set the attributes of f:view
(like e.g. locale), you still need the f:view tag. However, it does
not create an additional UIViewRoot, but only pass through the
attributes to the already existing UIViewRoot. Thus you will use it in
this way:

<html xmlns="http://www.w3.org/1999/xhtml";
    xmlns:ui="http://java.sun.com/jsf/facelets";
    xmlns:h="http://java.sun.com/jsf/html";
    xmlns:f="http://java.sun.com/jsf/core";>

    <f:metadata>....</f:metadata>
    <f:view locale="...." />

    <h:head>...</h:head>
    <h:body>...</h:body>
</html>

I hope this helps ;)

Regards,
Jakob

2011/4/29 Stephen Connolly <stephen.alan.conno...@gmail.com>:
> If I change the template to
>
> */WEB-INF/templates/basic.xhtml*
>
> <?xml version="1.0" encoding="utf-8"?>
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
>       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
> <f:view xmlns="http://www.w3.org/1999/xhtml"; xmlns:ui="
> http://java.sun.com/jsf/facelets";
>
>     xmlns:h="http://java.sun.com/jsf/html"; xmlns:f="
> http://java.sun.com/jsf/core";>
> <ui:insert name="metadata"/>
> <html>
> <h:head>
>   <ui:insert name="header"/>
> </h:head>
> <h:body>
>       <ui:insert name="content"/>
> </h:body>
> </html>
> </f:view>
>
>
> Then it seems to work... but the tagdocs on
> http://javaserverfaces.java.net/nonav/docs/2.0/vdldocs/facelets/f/metadata.html
> say
> it should work the way I had things originally.... strange
>
> On 29 April 2011 10:23, Stephen Connolly 
> <stephen.alan.conno...@gmail.com>wrote:
>
>> Spoke too soon
>>
>> :-(
>>
>> I'd been checking to see if it was the servlet mapping that was causing the
>> issues, so I changed the mapping from *.xhtml to *.faces... and I'd
>> forgotten to change the url in my browser, so I was being served the raw
>> .xhtml which was rendering the <h2> as a <h2>...
>>
>> removing the com.sun.faces.validateXml had no effect
>>
>> The problem still exists!
>>
>> HELP!
>>
>> -Stephen
>>
>>
>> On 29 April 2011 10:10, Stephen Connolly 
>> <stephen.alan.conno...@gmail.com>wrote:
>>
>>> Ok, I just found the/a solution.
>>>
>>> that was to remove
>>>
>>>   <context-param>
>>>     <param-name>com.sun.faces.validateXml</param-name>
>>>     <param-value>true</param-value>
>>>   </context-param>
>>>
>>> from the web.xml
>>>
>>> For some reason this completely ruins the f:metadata tag
>>>
>>> Not sure if that is a bug or a "feature" but might as well post the
>>> solution anyway so that others might benefit
>>>
>>> -Stephen
>>>
>>> On 29 April 2011 10:08, Stephen Connolly <stephen.alan.conno...@gmail.com
>>> > wrote:
>>>
>>>> Myfaces 2.0.5.
>>>>
>>>> I have been reading the JSF docs on the f:metadata tag..., e.g.
>>>> http://javaserverfaces.java.net/nonav/docs/2.0/vdldocs/facelets/f/metadata.htmland
>>>> http://myfaces.apache.org/core20/myfaces-impl/tlddoc-facelets/index.html
>>>>
>>>> I cannot seem to get f:metadata to work, e.g.
>>>>
>>>> */WEB-INF/templates/basic.xhtml*
>>>>
>>>> <?xml version="1.0" encoding="utf-8"?>
>>>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
>>>>        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
>>>> <html xmlns="http://www.w3.org/1999/xhtml";
>>>>      xmlns:ui="http://java.sun.com/jsf/facelets";
>>>>      xmlns:h="http://java.sun.com/jsf/html";
>>>>      xmlns:f="http://java.sun.com/jsf/core";
>>>>        >
>>>> <h:head>
>>>>    <ui:insert name="header"/>
>>>> </h:head>
>>>> <h:body>
>>>>    <f:view>
>>>>        <ui:insert name="metadata"/>
>>>>        <ui:insert name="content"/>
>>>>    </f:view>
>>>> </h:body>
>>>> </html>
>>>>
>>>>
>>>> and then reference that template
>>>>
>>>> */test.xhtml*
>>>> <?xml version="1.0" encoding="utf-8"?>
>>>> <ui:composition xmlns="http://www.w3.org/1999/xhtml";
>>>>       xmlns:ui="http://java.sun.com/jsf/facelets";
>>>>      xmlns:h="http://java.sun.com/jsf/html";
>>>>       xmlns:f="http://java.sun.com/jsf/core";
>>>>      template="/WEB-INF/templates/basic.xhtml">
>>>>    <ui:define name="metadata">
>>>>       <f:metadata>
>>>>        <f:viewParam name="id"/>
>>>>      </f:metadata>
>>>>    </ui:define>
>>>>    <ui:define name="content">
>>>>         <h1>The big news stories of the day</h1>
>>>>    </ui:define>
>>>> </ui:composition>
>>>>
>>>>
>>>> whenever i try to access the test.xhtml view I get the following:
>>>>
>>>> *[In Jetty 8.0.0.M2]
>>>> *
>>>>
>>>> HTTP ERROR 500
>>>>
>>>> Problem accessing /test.xhtml. Reason:
>>>>
>>>>    /test.xhtml at line 8 and column 19 <f:metadata> Parent UIComponent
>>>> j_id1187866547_41aebe2a should be instance of UIViewRoot
>>>> Caused by:
>>>>
>>>> javax.faces.view.facelets.TagException: /test.xhtml at line 8 and column
>>>> 19 <f:metadata> Parent UIComponent j_id1187866547_41aebe2a should be
>>>> instance of UIViewRoot
>>>>  at
>>>> org.apache.myfaces.view.facelets.tag.jsf.core.ViewMetadataHandler.apply(ViewMetadataHandler.java:61)
>>>> at
>>>> org.apache.myfaces.view.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:86)
>>>>  at
>>>> org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:167)
>>>> at
>>>> org.apache.myfaces.view.facelets.impl.TemplateContextImpl$TemplateManagerImpl.apply(TemplateContextImpl.java:128)
>>>>  at
>>>> org.apache.myfaces.view.facelets.impl.TemplateContextImpl.includeDefinition(TemplateContextImpl.java:92)
>>>> at
>>>> org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:433)
>>>>  at
>>>> org.apache.myfaces.view.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:93)
>>>> at
>>>> javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:51)
>>>>  at
>>>> org.apache.myfaces.view.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:156)
>>>> at
>>>> javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:59)
>>>>  at
>>>> org.apache.myfaces.view.facelets.tag.jsf.ComponentTagHandlerDelegate.apply(ComponentTagHandlerDelegate.java:324)
>>>> at
>>>> javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:54)
>>>>  at
>>>> javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:51)
>>>> at
>>>> org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:57)
>>>>  at
>>>> javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:51)
>>>> at
>>>> org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:45)
>>>>  at
>>>> org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:322)
>>>> at
>>>> org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:369)
>>>>  at
>>>> org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:347)
>>>> at
>>>> org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:215)
>>>>  at
>>>> org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:140)
>>>> at
>>>> org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:57)
>>>>  at
>>>> org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:45)
>>>> at
>>>> org.apache.myfaces.view.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:143)
>>>>  at
>>>> org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.buildView(FaceletViewDeclarationLanguage.java:327)
>>>> at
>>>> org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:66)
>>>>  at
>>>> org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
>>>> at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
>>>>  at
>>>> org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:546)
>>>> at
>>>> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:483)
>>>>  at
>>>> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
>>>> at
>>>> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:516)
>>>>  at
>>>> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:230)
>>>> at
>>>> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:956)
>>>>  at
>>>> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:411)
>>>> at
>>>> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:188)
>>>>  at
>>>> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:891)
>>>> at
>>>> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
>>>>  at
>>>> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:247)
>>>> at
>>>> org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:151)
>>>>  at
>>>> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:114)
>>>> at org.eclipse.jetty.server.Server.handle(Server.java:353)
>>>>  at
>>>> org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:598)
>>>> at
>>>> org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:1059)
>>>>  at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:590)
>>>> at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:212)
>>>>  at
>>>> org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:427)
>>>> at
>>>> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:510)
>>>>  at
>>>> org.eclipse.jetty.io.nio.SelectChannelEndPoint.access$000(SelectChannelEndPoint.java:34)
>>>> at
>>>> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
>>>>  at
>>>> org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:450)
>>>> at java.lang.Thread.run(Thread.java:680)
>>>>
>>>>
>>>> [In Tomcat 7.0.12]
>>>>
>>>> HTTP Status 500 -
>>>>
>>>> type Exception report
>>>>
>>>> message
>>>>
>>>> description The server encountered an internal error () that prevented it
>>>> from fulfilling this request.
>>>>
>>>> exception
>>>>
>>>> javax.servlet.ServletException: /test.xhtml at line 8 and column 19
>>>> <f:metadata> Parent UIComponent j_id1187866547_41aebe2a should be instance
>>>> of UIViewRoot
>>>>  javax.faces.webapp.FacesServlet.service(FacesServlet.java:205)
>>>> root cause
>>>>
>>>> javax.faces.view.facelets.TagException: /test.xhtml at line 8 and column
>>>> 19 <f:metadata> Parent UIComponent j_id1187866547_41aebe2a should be
>>>> instance of UIViewRoot
>>>> org.apache.myfaces.view.facelets.tag.jsf.core.ViewMetadataHandler.apply(ViewMetadataHandler.java:61)
>>>>
>>>> org.apache.myfaces.view.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:86)
>>>> org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:167)
>>>>
>>>> org.apache.myfaces.view.facelets.impl.TemplateContextImpl$TemplateManagerImpl.apply(TemplateContextImpl.java:128)
>>>> org.apache.myfaces.view.facelets.impl.TemplateContextImpl.includeDefinition(TemplateContextImpl.java:92)
>>>>
>>>> org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:433)
>>>> org.apache.myfaces.view.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:93)
>>>>
>>>> javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:51)
>>>> org.apache.myfaces.view.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:156)
>>>>
>>>> javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:59)
>>>> org.apache.myfaces.view.facelets.tag.jsf.ComponentTagHandlerDelegate.apply(ComponentTagHandlerDelegate.java:324)
>>>>
>>>> javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:54)
>>>> javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:51)
>>>>
>>>> org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:57)
>>>> javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:51)
>>>>
>>>> org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:45)
>>>> org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:322)
>>>>
>>>> org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:369)
>>>> org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:347)
>>>>
>>>> org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:215)
>>>> org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:140)
>>>>
>>>> org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:57)
>>>> org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:45)
>>>>
>>>> org.apache.myfaces.view.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:143)
>>>> org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.buildView(FaceletViewDeclarationLanguage.java:327)
>>>>
>>>> org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:66)
>>>> org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
>>>> javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
>>>> note The full stack trace of the root cause is available in the Apache
>>>> Tomcat/7.0.12 logs.
>>>>
>>>> Apache Tomcat/7.0.12
>>>>
>>>>
>>>> Which says it's not the container...
>>>>
>>>> If I try direct with no template, e.g.
>>>>
>>>> test2.xhtml
>>>> <?xml version="1.0" encoding="utf-8"?>
>>>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
>>>>         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
>>>> <html xmlns="http://www.w3.org/1999/xhtml";
>>>>       xmlns:ui="http://java.sun.com/jsf/facelets";
>>>>       xmlns:h="http://java.sun.com/jsf/html";
>>>>       xmlns:f="http://java.sun.com/jsf/core";
>>>>          >
>>>> <h:head>
>>>>     <ui:insert name="header"/>
>>>> </h:head>
>>>> <h:body>
>>>>     <f:view>
>>>>         <f:metadata>
>>>>           <f:viewParam name="id"/>
>>>>         </f:metadata>
>>>>         <h1>The big news stories of the day</h1>
>>>>     </f:view>
>>>> </h:body>
>>>> </html>
>>>>
>>>> Then I get:
>>>>
>>>> javax.servlet.ServletException: /test2.xhtml at line 14 and column 21 
>>>> <f:metadata> Parent UIComponent j_id1723811066_66bf44b9 should be instance 
>>>> of UIViewRoot
>>>>     javax.faces.webapp.FacesServlet.service(FacesServlet.java:205)
>>>>
>>>>
>>>> Which tells me I must be reading
>>>> http://javaserverfaces.java.net/nonav/docs/2.0/vdldocs/facelets/f/metadata.htmlseriously
>>>>  wrong
>>>>
>>>> Oh, before I forget, here is my web.xml
>>>>
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee";
>>>>          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>>>          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
>>>> http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd";>
>>>>   <context-param>
>>>>     <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
>>>>     <param-value>server</param-value>
>>>>   </context-param>
>>>>   <context-param>
>>>>     <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
>>>>     <param-value>.xhtml</param-value>
>>>>   </context-param>
>>>>   <context-param>
>>>>     <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
>>>>     <param-value>true</param-value>
>>>>   </context-param>
>>>>   <context-param>
>>>>     <param-name>javax.faces.PROJECT_STAGE</param-name>
>>>>     <!--<param-value>Production</param-value>-->
>>>>     <param-value>Development</param-value>
>>>>   </context-param>
>>>>   <context-param>
>>>>     <param-name>com.sun.faces.validateXml</param-name>
>>>>     <param-value>true</param-value>
>>>>   </context-param>
>>>>   <listener>
>>>>
>>>> <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
>>>>   </listener>
>>>>
>>>>   <servlet>
>>>>     <servlet-name>Faces Servlet</servlet-name>
>>>>     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
>>>>     <load-on-startup>1</load-on-startup>
>>>>   </servlet>
>>>>   <servlet-mapping>
>>>>     <servlet-name>Faces Servlet</servlet-name>
>>>>     <url-pattern>*.xhtml</url-pattern>
>>>>   </servlet-mapping>
>>>>
>>>>   <session-config>
>>>>     <session-timeout>60</session-timeout>
>>>>   </session-config>
>>>> </web-app>
>>>>
>>>> Any and all help appreciated
>>>>
>>>> -Stephen
>>>>
>>>
>>>
>>
>



-- 
Jakob Korherr

blog: http://www.jakobk.com
twitter: http://twitter.com/jakobkorherr
work: http://www.irian.at

Reply via email to