JSF is one of the purest implementations of the Model/View/Controller (MVC) paradigm that exists for
J2EE and it is an integral part of the JEE specification (unlike
Struts, Spring web, Wicket and so forth).
There is no one-size-fits-all solution, but JSF is a good fit for applications where a lot of web forms are required to be processed and intensive data validation is required. JSF takes an all-or-nothing approach to data validation: if any submitted data is invalid, it is all rejected and suitable error messages are returned to the user.
Other useful amenities of JSF are Facelets (which I have found to be a lot easier to work with than Struts Tiles) and the fact that in virtually all cases, you don't have to provide Controller code, only View templates and Model objects. The Controllers are already built into JSF, debugged and ready to use.
The secret of how to be miserable is to constantly expect things are going to happen the way that they are "supposed" to happen.
You can have faith, which carries the understanding that you may be disappointed. Then there's being a willfully-blind idiot, which virtually guarantees it.