There have been several posts asking how to get a Faces Context from outside of JSF such as in a servlet. There are many reasons for doing this such as:
- Getting to a managed bean in session scope
- Getting or setting the current view id
- Generating additional content to be displayed in a faces component
- Performing authentication and session management
- Various other reasons you can come up with...
Below is one way to do this.
<disclaimer>I can't take credit for the approach as the question popped up last year on Sun's Creator forum and has since been modified/adapted/shared so many times I can no longer remember what is adopted code and what is original. However, it works and works well – at least in our Tomcat 5.5x apps</disclaimer>
We used several servlets and filters to drive external content into our JSF apps. In particular we use this approach to generate Jasper Reports, JFreeChart images and generate PDFs on the fly using iText. The same code is also used in a filter to manage sessions.
This is simple to use and extend and, as I stated earlier, has been handed around several lists. We provide convienience methods for access to managed beans and to the Application. Concrete classes extend the base class and provide getters for session-managed components etc.
Note: You should always relase the FacesContext after you're done with it (see http://ocpsoft.com/java/jsf-java/please-tell-your-developers-to-call-facescontextrelease/). I've added the removeFacesContext() method to the above code, and you should call that after calling .release() on the context.
In closing, I'm sure there may be better ways for doing this but more importantly, there are probably good reasons for not doing this at all and changing to Phase Listeners and staying within the JSF framework which I think is an important topic for continued discussion.