Interesting points, Andy. The fact that Facelets currently makes it difficult to support non-XML documents is a little problematic...One would expect to use Facelets to define only a component tree, with nothing passed through; the render kit should decide how that component tree is displayed. Moreover, loosing functionality that JSP provides is a bad thing.<br>
<br>If there's a simple, elegant solution, I vote for putting it in the maintenance release. <br clear="all">---<br>Kito D. Mann -- Author, JavaServer Faces in Action<br><a href="http://twitter.com/kito99">http://twitter.com/kito99</a> <a href="http://twitter.com/jsfcentral">http://twitter.com/jsfcentral</a><br>
<a href="http://www.virtua.com">http://www.virtua.com</a> - JSF/Java EE consulting, training, and mentoring<br><a href="http://www.JSFCentral.com">http://www.JSFCentral.com</a> - JavaServer Faces FAQ, news, and info<br>+1 203-404-4848 x3<br>
<br><br><div class="gmail_quote">On Thu, May 7, 2009 at 4:21 PM, Andy Schwartz <span dir="ltr"><<a href="mailto:andy.schwartz@oracle.com">andy.schwartz@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Gang -<br>
<br>
I have been think about the Dan's blog entry on Facelets pages as valid XML documents:<br>
<br>
<a href="http://blog.hibernate.org/10752.lace" target="_blank">http://blog.hibernate.org/10752.lace</a><br>
<br>
Actually, I have been struggling with related issues. Wanted to ping the EG to see whether we can start some discussion on this topic.<br>
<br>
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.<br>
<br>
The complications arise from how Facelets treats XML-specific constructs such as:<br>
<br>
- The XML declaration<br>
- XML processing instructions<br>
- CDATA sections<br>
<br>
Currently these constructs are doing double-duty:<br>
<br>
1. They are consumed by the Facelets XML parser.<br>
2. They are passed through to the browser.<br>
<br>
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.<br>
<br>
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:<br>
<br>
<?xml version='1.0' encoding='utf-8'?><br>
<f:view xmlns:f="<a href="http://java.sun.com/jsf/core" target="_blank">http://java.sun.com/jsf/core</a>"<br>
xmlns:af="<a href="http://xmlns.oracle.com/adf/faces/rich" target="_blank">http://xmlns.oracle.com/adf/faces/rich</a>"><br>
<af:document/><br>
</f:view><br>
<br>
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.<br>
<br>
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.<br>
<br>
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.<br>
<br>
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:<br>
<br>
<trh:script><br>
<![CDATA[<br>
if (0 < 1) alert("Woohoo! Zero *is* less than one!");<br>
]]><br>
</trh:script><br>
<br>
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.<br>
<br>
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.<br>
<br>
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.<br>
<br>
Thoughts?<br><font color="#888888">
<br>
Andy<br>
<br>
</font></blockquote></div><br>