JSF navigation system offers 2 ways of work: Forward and redirect. The forward method is simply useless. Any decent web application must have correlation between browser url and the view that is being presented. On the other hand, when using forward it is impossible to pass parameters between pages. This makes the whole navigation system of JSF simply useless (I never use it at all ...). Parameters between pages needed to be passed using url parameters. Needing to use session variables or any other weird solutions is simply not good since it makes the application more dependant.
If I have a page that should show some product, and the product id parameter is passed using session or any solution other than url parameter, then I totally dependant on the source from which I am directed to this page. This source of course must initialize the product id or some bean. This is very limiting (to my opinion and experience of course ...). With url parameters this problem never exists. Every page can stand for it's own and have it's own "api" defined by the parameters it should get in order to show the page. I can send users to this page from any source that I like, and even send this url by mail to some other users, and the page could be easily accessed with no problems.
I know this problem is simply the was JSF is designed, but I think this is the kind of problems that prevents from technologies being adopted.