Идея виртуального каталога хороша, но обычно эту проблему можно решить достаточно просто, задав собственный сервлет.Нет необходимости в дополнительном компоненте.
<servlet>
<servlet-name>Mah Servlet</servlet-name>
<servlet-class>org.mahorg.MahServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Mah Servlet</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
Тогда вы просто напишите сервлет, который может выполнять следующие действия ...
1. Determine filename and folder location looking at request context path
2. Get bytes of file using easy tool like Apache Commons IO.
3. Put bytes into response stream
4. Set response header to XML mime type
5. Response complete
Не забывайте об обязательных проблемах безопасностии разрешения для файлов и т.д ...