In Facelets 1.x, it was possible to implement load views from external locations (such as the class path,
or a repository) by providing a ResourceResolver implementation.
The ResourceResolver is also present in JSF 2, so this is still possible. However, there is a new
requirement. Implicit navigation calls ExternalContext.getResource() to determine whether a view id
corresponds to a physical resource. If ExternalContext.getResource() returns a non-null URL, implicit
navigation to the view id is allowed.
This contract is not ideal, as:
1. It is non-obvious.
2. It requires hooking into multiple locations.
3. It makes it difficult to distinguish between requests for view ids vs. other types of resources.
Regarding #3â€¦ ExternalContext.getResource() may be used for all sorts of resources. In our case we
only want to search our external repositories when a view id is requested, but not, say, when someone
calls getResource() to load some other type of file (eg. a style sheet).
We need to introduce a cleaner contract that simplifies the responsibilities for custom view loading