JSF es solo la capa de visualización del MVC y deberá utilizarse con otras tecnologías como Spring/Hibernate o EJB para un MVC completo.
Spring (no es el Spring MVC) es la capa controladora del MVC y, como digo, se puede usar con algo como JSF (Struts, JSP/Servlets, etc.) y algo así como Hibernate.
He estado usando Spring MVC durante aproximadamente 6 meses, aunque probablemente no sea la versión más latil de SpringMVC. Me ha parecido un poco molesto tener que lidiar con tantos XML. Todos los beans gestionados y DAO tienen una configuración XML. También todo parece tener que pasar por un método llamado onSubmit().
JSF con algo como EJB es mucho más simple en mi opinión ... Todo se puede hacer uso de Anotaciones por lo que simplemente usar @ ManagedBean = Thebean en su bean de respaldo y en su puesto JSF {} thebean.param y tiene acceso a los datos del bean de respaldo. También puede usar los beans de Session de su EJB ya que los beans de respaldo para JSF tienen acceso directo al bean de la entidad DAO (capa de modelo). De nuevo simplemente usando la anotación @Entity y la clase EntityManager
También me gusta la forma en que puede establecer sus propios métodos de acción para que pueda tener un método en su bean llamado TheBean.addDetails() y llamarlo el JSF con theBean.addDetails() en lugar de todo pasando por un método como con Spring MVC.
JSF como digo es solo la capa de vista de MVC, personalmente me gusta usarlo con EJB, ya que esto te da MVC completo todo desde Suns J2EE.jar por lo que no hay problemas para asegurarte de que tienes las versiones correctas y no se requiere configuración.
JSF 2.0 es mucho más que JSF1.2, que siempre se sintió como la mitad de un trabajo que con EJB3.1 que no es como EJB2.x y es incluso mejor que EJB3.0. Para mí JSF2.0 con EJB3.1 es tan simple y fácil de desarrollar y todo es muy transparente.
Realmente quiere comparar "Spring MVC with JSF 2", no "Spring with JSF". – BalusC