Eu nao entendo muito de Struts, mas pelo que entendi ele serviu para abrir caminho para outros frameworks como o vRaptor (que e muito bom diga-se de passagem). Quanto ao JSF também é muito bom, mas prefiro o vRaptor. O vRaptor é mais enxuto e como o proprio nome sugere, é muito produtivo (até mais que jsf se você não tiver que trabalhar com vews muito complexas).
O fluxo de trabalho com JSF é confuso demais para iniciantes, na verdade é outro paradigma totalmente diferente. É bem mais complicado aprender JSF que Vraptor ou Struts. É como se um programador de linguagem procedural estivesse tentando aprender oo, no começo é um parto, mas depois que se acostuma não deixa a oo de jeito nenhum:wink:! Eu tenho trabalhado com JSF a pouco tempo, e ainda não me sinto confortavel com ele, já o Vraptor, em uma tarde de estudo, pude entender muito claramente a forma do framework trabalhar. A sacada de usar convenção é muito boa!!! Torna o desenvolvimento bastante produtivo pois você não tem que ficar configurardo XMLs e o fluxo de trabalho do framework é muito intuitivo.
O JSF é um framework que torna a aplicação mais pesada por causa dos componentes que ele renderiza. Mas por outro lado, os componentes do jsf são demais!!! Acredito que eles sejam a grande sacada do JSF, eles dão uma ajuda excepcional.
Em fim, se você tiver que desenvolver um projeto em que você terá a necessidade de usar muito ajax, componentes javascript complexos,… É JSF na cabeça! Mas se o seu projeto não necessitar de vews complexas, usar JSF nesses casos é dá um tiro no pé, pois em alguns aspectos, é bem mais chato trabalhar com JSF.