OK, I was wrong. I've sort of gone along with the crowd with my dislike of JavaServer Faces. You know: It's hopelessly complex and only usable with by tools dumbed down for VB programmers. It's a web framework that only Struts users could love. I just sort of accepted the blog pundit party line. It's easier to criticize something than to promote it, especially when you haven't really taken the time to look at it. All I had seen was a few confusing and poorly-written articles which seemed to reinforce those ideas.
I've been sitting on a review copy of Core JavaServer Faces for quite some time and decided to finally dig it out over the holidays. Armed with that and the reference implementation I put together a few simple web applications.
Much to my surprise, JSF is really quite simple and intuitive. I loved the simplicity of the model objects and actions, and navigation is incredibly easy to string together. I found getting started to be an order of magnitude easier than with struts, and surprisingly I found it even easier to get started with than Tapestry. As an emacs die-hard, I don't mind a bit of a learning curve with my tools. But, I do mention just because everyone consistently points out how confusing and complex JSF is. It's not. It's dead simple. The deployment descriptors are straight forward and the pages are easy to understand. I've been doing JSTL for quite some time, so it all felt quite natural me.
What's good and bad? The programming style is similar to Tapestry and dead on intuitive. Besides the fact that I detest the IClassName naming convention that Tapestry uses, I don't see them as being that different. JSF seems a bit simpler to me, but I've only done toy applications with either one so it's hard to say. It's certainly a world of difference from older frameworks like Struts. I hope I never have to manually generate a URL, extract a request parameter or touch a javax.servlet class again.
On the bad side, I think that Tapestry has a leg up on JSF in terms of page creation. I've had a love-hate relationship with Tapestry here. On one hand, I love the idea of being able to embed default values and make pages that an HTML guy can come in and edit. On the other hand, I hate writing HTML. JSF naturally appeals there because you aren't needing to bother with the details of HTML to create your application. I think abstracting out HTML generation is a much better way to go, but I'm not sure that that is practical or realistic. In other words, it's a nice theory, but the Tapestry way of doing things seems to work well for people in practice. I'll have to work with JSF a bit more before I'm convinced that it does work.
My goal here isn't to praise JSF beyond saying that my first impressions were incredibly positive. I'm definitely looking forward to getting into it a bit deeper.