It is obvious that most of us question why we go for JavaServer Faces when a similar MVC framework, which is most popular, exists? The answer is simple. Try before commit. Use the framework, discover the benefits and then decide which is best suites your need.
JavaServer Faces is view-centric which is best suited in applications where rich GUI required. But that doesn't mean it is not suitable for the flow-based applications, where Struts is majorly being used. It can be ported on such applications as well without doing heavy work.
Below are some comparisions between both the MVC frameworks.
Standard
JavaServer Faces follows the JCP specification standard where as Struts is being developed under Apache Community.
Customization
JavaServer Faces specification provides the standards needs to be followed in implementing the specification. Any vendor can provide their own implementation which follows the JSR specification of JSF. Few vendors are actively involved in implementing the JSF framework. Oracle ADF Faces, ICEFaces, jBoss Rich Faces, Apache MyFaces are few implementations of the JSF specification. Since all vendors follow the same standard, any vendor can develop the components that can easily pluggable into the JSF applications.
Controller
The controller logic of JavaServer Faces is implemented in POJOs and hense no need to implement any specific implementations required. In struts the controller logic can be written in processAction and execute method. The controller logic is simplified by directly providing the method to be called from the JSF page. This can be achieved by using the Unified Expression Language (EL).
Rich UI Components for the View Tier
The JSF implementations provides easy to use and easily pluggable rich UI components. By using the rich UI component model the view tier of the web application will be enhanced. Also the component model can be easily extended from the standard set of components.
Event Driven
The JSF framework is event driven and the component framework is fully sensitive to the events generated from the client tier. Using this we can easily handle the events generated from the client side and can provide extended features to the web applications.