Should I use Facelets "jsfc" attribute?

Lars Tackmann picture Lars Tackmann · Feb 25, 2010 · Viewed 12k times · Source

Facelets uses the jsfc attribute to convert HTML elements to their associated JSF components. This is rather helpful for fast prototyping as it allows you to create your views using a visual design tool. However I recently discovered this blog post by Cay Horstmann where he lays waste to the use of jsfc together with complex components such as h:dataTable.

This alarmed me as Cay Horstmann is the author of multiple of my favorite Java books. However my Google-fu skills have yielded zero results when trying to determine the scope/nature of the problem, other than a recent post by Ed Burns, who seams to like jsfc (and he is after all the co-spec lead for JSF). So my question is simply, is it recommended to use jsfc with Facelets ? and if not what's the problem it introduces.

Answer

Romain Linsolas picture Romain Linsolas · Feb 26, 2010

As you said, the jsfc attribute is essentially usefull when you have to "convert" an HTML prototype to a JSF page. For example, when you have an HTML input text:

<input type="text" .../>

you can add the jsfc attribute in order to convert this HTML component into a JSF component:

<input type="text" jsfc="h:inputText" .../>

This is equivalent to writing the following JSF code:

<h:inputText .../>

As stated in the Facelets documentation here or here, the attribute jsfc can also be used to "map" Facelets components. For example, you can remove a part of the HTML code:

<span jsfc="ui:remove">
This won't be compiled either <h:outputText value="#{foo.bar}"/>
</span>

You can also create a table using this attribute:

<table>
    <tr jsfc="ui:repeat" value="#{dept.employees}" var="emp" class="#{emp.manager ? 'mngr' : 'peon'}">
       <td>#{emp.lastName}</td>
       <td>#{emp.firstName}</td>
    </tr>
</table>

In this example, we do not link this table to a h:datatable component, but we create a table with HTML code, using the JSF component ui:repeat to iterate on rows.

As you can see, the jsfc attribute can be used to convert one HTML component into one JSF component in a JSF page. So for complex components, such as the datatable, you will have to use some workarounds (using ui:repeat instead of the h:datatable component).

Another point is that you will not be able to use third-libraries components such as the ones proposed by RichFaces, IceFaces, Tomahawk, and so on. And these libraries are really one of the interests of JSF.

So to summarize: jsfc can be usefull to transform a HTML prototype into a JSF applications, essentially for creating Proof of Concepts or designing the general UI. However, I think it is better to avoid this component once the "real" development starts...