URLs are not the same thing as filesystem paths - they are Uniform Resource
Locators. For convenience, in a lot of cases the levels of a URL may echo levels of directories in a filesystem tree, but they don't have to. In fact, neither branch nor tip of a URL path needs to actually exist as a file at all - they're just cues to the application on where and/or how to find and present things. No
Struts app has any files whose names end in ".do" anywhere in the WAR, for example.
The web.xml file contains the URL decoding map for the application. It's what causes Struts ".do" URLs to be routed to the Struts
servlet for processing by the appropriage Form Bean, Action, and View processors as determined by its reading of struct-config.xml. A similar mechanism is used with the JSF servlet.
So the answer is: you setup the web.xml to handle the URLs, subject to the URL naming constraints built into the jsf servlet.