[jsr-314-open] Facelets: XHTML vs. XML
Andy Schwartz
andy.schwartz at ORACLE.COM
Thu May 7 16:21:10 EDT 2009
Gang -
I have been think about the Dan's blog entry on Facelets pages as valid
XML documents:
http://blog.hibernate.org/10752.lace
Actually, I have been struggling with related issues. Wanted to ping
the EG to see whether we can start some discussion on this topic.
In Dan's case, XML (plus XSD) provides a way to improve the page
authoring experience. In my case, I am interested in XML as a way to
support content-type independence for contents rendered by Faces
components. That is, it should be possible to use Facelets as an XML
document that describes how to build the component tree and leave the
decision of whether to render XHTML content or HTML content (or some
other type of content) up to the render kit. While Facelets is fairly
close to meeting this requirement, there are a couple of minor
assumptions built into the Facelets implementations (both Facelets 1.x
and JSF 2.0) that complicate matters.
The complications arise from how Facelets treats XML-specific constructs
such as:
- The XML declaration
- XML processing instructions
- CDATA sections
Currently these constructs are doing double-duty:
1. They are consumed by the Facelets XML parser.
2. They are passed through to the browser.
I suppose that #2 makes sense if you view the Facelets page as an XHTML
document to which some pre-processing is applied before handing off to
the client. However, this subverts the ability to support non-XML/XHTML
content generation, such as HTML content generation.
A simple example that demonstrates where we run into trouble... In ADF
Faces applications, the root component (under the view root) is
typically an af:document component. af:document takes care of rendering
the document "chrome", including the doctype and the html/head/body
elements. A minimal ADF Faces page might look something like this:
<?xml version='1.0' encoding='utf-8'?>
<f:view xmlns:f="http://java.sun.com/jsf/core"
xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
<af:document/>
</f:view>
This creates a trivial component tree: a UIViewRoot containing an ADF
Faces RichDocument component. It should be possible to render this
component tree as either an XHTML or an HTML document. The Renderer for
the RichDocument component could easily handle both of these cases.
However, there is a stumbling block... With Facelets, the XML
declaration ends up being passed through to the browser, regardless of
what type of content the RenderKit happens to generate. The end result:
when rendering the document to HTML, we end up with a bogus XML
declaration in our generated HTML content.
In the above example, the purpose of including the XML declaration in
the Facelets page is to ensure that the Facelets page is a valid XML
document (#1 above), not for the purpose of including this in the
generated content (#2 above), yet we end up with both.
We run into similar problems with CDATA sections. For example, the
following code uses the Trinidad trh:script component to insert a script
into the page:
<trh:script>
<![CDATA[
if (0 < 1) alert("Woohoo! Zero *is* less than one!");
]]>
</trh:script>
As with the previous example, the XML-specific construct (a CDATA
section in this example) is meant to apply to the Facelets page itself -
not to the generated content. That is, the CDATA section provides a way
to tell the Facelets parser not to parse the specified character data.
This is not intended to be used as an instruction to the browser (just
to Facelets XML parser). However, Facelets passes the CDATA through to
the browser. As a result, in the case where we render HTML content, we
end up with bogus CDATA sections inside of our generated HTML document,
which causes the browsers to get confused.
In order to support content independence (or, more particularly, to
support HTML rendering), the render kit needs to be able to make
decisions such as whether script contents need to be wrapped in CDATA
sections (when generating XHTML content yes, HTML content no) or whether
an XML declaration is necessary in the generated content (same deal).
Note that this sort of content-type independence is already possible
using JSP documents (ie. XML-based JSP pages), since JSP engines
interpret the XML constructs as instructions for the JSP's XML parser.
There is no assumption that the generated output will be XML/XHTML. We
would like to see Facelets support similar behavior.
Of course, every Facelets page that currently exists relies on the
current XHTML-centric behavior, so there is no chance that we can change
this default behavior. However, I would like to see some mechanism for
opting in to a more XML-centric processing model. I suppose that this
could be left up to the JSF implementations to provide, though it seems
like this might be a reasonable candidate for a spec-level solution.
Thoughts?
Andy
More information about the jsr-314-open-mirror
mailing list