Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to use JSF+Facelets with HTML 4/5?

Facelets relies on XML namespaces to work with XHTML. How are HTML 4, and as far as I know, HTML 5 do not support namespaces. Also HTML 5 has some new elements that are not available in XHTML. Even HTML 4 and XHTML have some differences regarding elements and attributes they support.

The question is: Is it possible to render HTML 4/5 documents using Facelets? If so, how?

like image 410
Behrang Avatar asked May 29 '10 16:05

Behrang


People also ask

Can we use HTML in JSF?

Using these new features, HTML5 elements can be treated as JSF components, or JSF components can pass through to the browser without interpretation by JSF components or renderers.

What are JSF facelets?

Facelets is a powerful but lightweight page declaration language that is used to build JavaServer Faces views using HTML style templates and to build component trees.

What is JSF passthrough?

Passthrough Elements With pass-through elements it is possible to build the view with HTML elements that are linked to component instances on the server side. To make an element a pass-through element, at least one of its attributes must be in the namespace http://xmlns.jcp.org/jsf .

Why does JSF use xhtml?

An additional advantage of using *. xhtml is that the enduser won't be able to see raw JSF source code whenever the enduser purposefully changes the URL extension in browser address bar from for example . jsf to .


2 Answers

Since Facelets is a XML based view technology which eats and emits in essence XML markup, you cannot use it with a HTML4 doctype. The HTML4 doctype describes several elements which cannot be self-closing, like <link>, <meta>, <br> and <hr>. However, with XML you're forced to close them like <link/>, <meta/>, etc. So using a HTML4 doctype is absolutely not an option for Facelets (that is, when you respect the standards and/or fear the w3 validator, it will however work perfectly on the most if not all webbrowsers).

HTML5, on the other hand, allows XML markup. This is specified in chapter 3.2.2 - Elements:

Example:

<link type="text/css" href="style.css"/> 

Authors may optionally choose to use this same syntax for void elements in the HTML syntax as well. Some authors also choose to include whitespace before the slash, however this is not necessary. (Using whitespace in that fashion is a convention inherited from the compatibility guidelines in XHTML 1.0, Appendix C.)

I myself use <!DOCTYPE html> all the way, also with JSF/Facelets, even without a <?xml?> declaration in top of the page. It works perfectly in all browsers. With a XHTML doctype you should as per the specification be using a Content-Type of application/xhtml+xml which would only make MSIE to choke (it doesn't understand it). And since that's still one of the most widely used browsers... Replacing the XHTML content type by text/html is considered harmful, you also don't want to do this.

As per your arguments:

HTML 5 do not support namespaces.

This doesn't matter. The namespaces are only of interest for the XML based server side view technology (like as Facelets) which in turn can generate pure HTML with those tags. The following example is legitimately valid for Facelets:

<!DOCTYPE html> <html lang="en"     xmlns:f="http://xmlns.jcp.org/jsf/core"      xmlns:h="http://xmlns.jcp.org/jsf/html">     <h:head>         <title>Title</title>     </h:head>     <h:body>         <h:outputText value="#{bean.text}" />     </h:body> </html> 

This renders legitimately valid HTML5 (for the client side):

<!DOCTYPE html> <html lang="en">     <head>         <title>Title</title>     </head>     <body>         Some text     </body> </html> 

You see, Facelets already removes the XHTML declarations since they have no meaning in the client side.

And,

Also HTML 5 has some new elements that are not available in XHTML

this make also no sense. It's all about the generated output. Which can be HTML5 as good. Your only problem may be the browser support and the availability of 3rd party JSF components which renders HTML5 specific elements. Since JSF 2.2, it's possible to use the new passthrough elements feature to turn custom elements into a JSF component. Simply give the HTML5 element a jsf:id attribute. It'll transparently internally be interpreted as a UIPanel instance in the JSF component tree (like <h:panelGroup>).

<!DOCTYPE html> <html lang="en"     xmlns:jsf="http://xmlns.jcp.org/jsf"     xmlns:f="http://xmlns.jcp.org/jsf/core"      xmlns:h="http://xmlns.jcp.org/jsf/html" >     <h:head>         <title>Title</title>     </h:head>     <h:body>         <header jsf:id="header">Header</header>         <nav jsf:id="nav">Nav</nav>         <main jsf:id="main">Main</main>         <footer jsf:id="footer">Footer</footer>     </h:body> </html> 

You can even reference it from ajax as in <f:ajax render="main">.

Actually, XHTML is overhyped. Its sole intent is to ease HTML development using XML based tools which can manipulate/transform/generate HTML pages on the server side (like as Facelets). But some starters also use it without using any XML tool and output it plain as-is, because it's "so cool" -for some unclear reason.

Don't get me wrong. XHTML is great as server side view technology. But simply not as client side markup technology. It has utterly no value at the client side.

See also:

  • Our XHTML wiki page
  • How should a <!DOCTYPE> section look in JSF? HTML5 or XHTML?
  • JavaServer Faces 2.2 and HTML5 support, why is XHTML still being used
like image 87
BalusC Avatar answered Oct 08 '22 21:10

BalusC


On a related note, check out this IBM developerWorks article: JSF 2 fu: HTML5 composite components, Part 1

like image 31
Vetle Avatar answered Oct 08 '22 23:10

Vetle