JSF qualifies for the title of 'most frustrating software development infrastructure component' due to a few design and/or implementation features.
1) The symptom dumps are almost useless as they seldom point to your own code
2) It disregards null pointers so things just stop working without you having a clue where and why; one should be extremely alert for things to keep working
3) It is absolutely unclear why and when the cache of your web browser must be flushed; sometimes errors are already fixed; you go to sleep desperate and when you fire up the server the next day, everything works; on the other hand, working code fails at customer sites before you flush the caches
This does not mean I do not like it; there is just a great opportunity to improve the design and code so it will stop wasting other people's time.
I recently had another look at IBM's mainframe ISPF in the GML version. This is more or less the same idea, and of course IBM did not realise the gold they are sitting on; change the tags to xml, make a version of the compiler that spits out servlets and we are done.