La specifica Servlet 2.4 dice questo su WEB-INF (pagina 70):
Esiste una directory speciale nella gerarchia dell'applicazione denominata
WEB-INF
. Questa directory contiene tutte le cose relative all'applicazione che non si trovano nella radice del documento dell'applicazione. Il
WEB-INF
nodo non fa parte dell'albero dei documenti pubblici dell'applicazione . Nessun file contenuto nella WEB-INF
directory può essere servito direttamente a un client dal contenitore. Tuttavia, i contenuti della
WEB-INF
directory sono visibili al codice servlet usando le chiamate del metodo getResource
e getResourceAsStream
su ServletContext
, e possono essere esposti usando le RequestDispatcher
chiamate.
Ciò significa che le WEB-INF
risorse sono accessibili al caricatore di risorse dell'applicazione Web e non sono direttamente visibili al pubblico.
Questo è il motivo per cui molti progetti mettono le loro risorse come file JSP, JAR / librerie e i propri file di classe o file delle proprietà o qualsiasi altra informazione sensibile nella WEB-INF
cartella. Altrimenti sarebbero accessibili usando un semplice URL statico (utile per caricare CSS o Javascript per esempio).
I tuoi file JSP possono essere ovunque anche se dal punto di vista tecnico. Ad esempio in primavera puoi configurarli per essere WEB-INF
esplicitamente:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" >
</bean>
Le cartelle WEB-INF/classes
e WEB-INF/lib
menzionate nell'articolo sui file WAR di Wikipedia sono esempi di cartelle richieste dalle specifiche Servlet in fase di esecuzione.
È importante fare la differenza tra la struttura di un progetto e la struttura del file WAR risultante.
La struttura del progetto rifletterà in alcuni casi parzialmente la struttura del file WAR (per risorse statiche come file JSP o file HTML e JavaScript, ma non è sempre così.
La transizione dalla struttura del progetto al file WAR risultante viene eseguita da un processo di generazione.
Mentre di solito sei libero di progettare il tuo processo di compilazione, oggigiorno la maggior parte delle persone utilizzerà un approccio standardizzato come Apache Maven . Tra le altre cose, Maven definisce i valori predefiniti per i quali le risorse nella struttura del progetto sono associate a quali risorse nell'artefatto risultante (in questo caso l'artefatto risultante è il file WAR). In alcuni casi la mappatura consiste in un semplice processo di copia, in altri casi il processo di mappatura include una trasformazione, come il filtraggio o la compilazione e altri.
Un esempio : la WEB-INF/classes
cartella conterrà in seguito tutte le classi e le risorse java compilate ( src/main/java
e src/main/resources
) che devono essere caricate dal Classloader per avviare l'applicazione.
Un altro esempio : la WEB-INF/lib
cartella conterrà in seguito tutti i file jar necessari all'applicazione. In un progetto maven le dipendenze sono gestite per te e maven copia automaticamente i file jar necessari nella WEB-INF/lib
cartella per te. Questo spiega perché non hai una lib
cartella in un progetto maven.