As frameworks tend to do, it imposes restrictions and adds complexity, and
sometimes it feels as if you spend more time fighting those than doing
productive work, but then there are also times when you find that a
seemingly
daunting task is ridiculously simple thanks to the framework.
And if you didn't use such a framework, you'd probably end up creating your
own restrictions and complexities, probably worse ones.
The obvious (because most popular) one would be Struts, which is in fact
the main precursor to JFS and pretty similar, though it focuses more on
the controller side instead of the view.
There are literally dozens of other Webapp frameworks, such as
Turbine, Cocoon, Tapestry, Jetspeed, Expresso. All of them have
different scopes and focuses, and it may even be a good idea
to combine two of them.
A good comparison of Struts and JSF:
http://www.sys-con.com/story/?storyid=46516&de=1&jdj=on
An article on the same subject, by a guy who was heavily involved in the
development of both:
http://blogs.sun.com/roller/page/craigmcc/20040927
Lots of other articles:
http://www.google.com/search?q=java+"web+frameworks"+comparison