Working with JSF has been an interesting experience. My first impressions were mixed, but positive. I loved the idea behind JSF, but the actual usage of JSF was a bit awkward.
My first apps were standard J2EE + JSF apps. They worked fine, and using JSF was pleasant enough. But there wasn't much that would make me recommend JSF over other technologies. Later I moved to EJB3 + JSF. That was a huge improvement, but the simplifications in EJB3 and wonder of annotations made me begin to wish I could have the same kind of simplifications at the EJB3 tier. Of course, then Seam rolled around, brining annotations and EJB3 services to front end web components. My experience with Seam led me to one final piece of the JSF puzzle, Facelets.
Facelets is a replacement view technology that solves all of the ugliness of using JSF with JSPs. A JSP file needs to be compiled to a servlet, which is then invoked at runtime to generate a component tree which is the rendered. (or at least that is my understanding - I'm no JSF guru) If you've had to add f:verbatim at seemingly random places in your JSPs when working with JSF, you've run into one of the many quirks in using JSP+JSF. I didn't mind that as much as I minded that JSTL tags didn't seem to mix well with JSF tags. There's no doubt that JSF+JSP is quirky at best.
Facelets provides a templating system to create the UI component tree. It is simple but powerful, and has none of the quirks that JSPs have. At it's simplest, it is almost indistinguishable from a JSP:
If preserving HTML editability is important, you can insert default HTML into the template and place HTML around the ui:composition to make both pages interesting to a web designer. You can also forgo the JSF tags and use a Tapestry-like jsfc attributes. Here's a trivial example:
I'm perfectly comfortable with those JSF tags, but you could have easily written this template to be more friendly to an web guy if you prefer. It's really up to you. The nice thing about Facelets is that everything works exactly as you would expect. (yes, even JSTL tags - or at least the subset of them that facelets provides) The only thing I'd mark as a negative is that it is a bit annoying to declare all of the XML namespaces in each document. It would be nice if I could do that once for my entire project and just use them. The second downside is that normal JSP taglibs don't apply. If you have a huge investment in taglibs, you might have to do some coding to make them work under Facelets. However, the advantages of Facelets in my mind make that well worth it.
I've been using Facelets for a month or two now and have no plans to ever voluntarily go back to JSPs.