La especificación Servlet 2.4 dice esto sobre WEB-INF (página 70):
Existe un directorio especial dentro de la jerarquía de la aplicación denominada
WEB-INF
. Este directorio contiene todas las cosas relacionadas con la aplicación que no están en la raíz del documento de la aplicación. El
WEB-INF
nodo no forma parte del árbol de documentos públicos de la aplicación . Ningún archivo contenido en el WEB-INF
directorio puede ser servido directamente a un cliente por el contenedor. Sin embargo, el contenido del
WEB-INF
directorio es visible para el código de servlet usando las llamadas al método getResource
y getResourceAsStream
en el ServletContext
, y puede exponerse usando las RequestDispatcher
llamadas.
Esto significa que los WEB-INF
recursos son accesibles para el cargador de recursos de su aplicación web y no son directamente visibles para el público.
Es por eso que muchos proyectos ponen sus recursos como archivos JSP, JAR / bibliotecas y sus propios archivos de clase o archivos de propiedades o cualquier otra información confidencial en la WEB-INF
carpeta. De lo contrario, serían accesibles utilizando una URL estática simple (útil para cargar CSS o Javascript, por ejemplo).
Sus archivos JSP pueden estar en cualquier lugar desde una perspectiva técnica. Por ejemplo, en Spring puede configurarlos para que estén WEB-INF
explícitamente:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" >
</bean>
Las carpetas WEB-INF/classes
y WEB-INF/lib
mencionadas en el artículo de archivos WAR de Wikipedia son ejemplos de carpetas requeridas por la especificación Servlet en tiempo de ejecución.
Es importante hacer la diferencia entre la estructura de un proyecto y la estructura del archivo WAR resultante.
La estructura del proyecto en algunos casos reflejará parcialmente la estructura del archivo WAR (para recursos estáticos como archivos JSP o archivos HTML y JavaScript, pero este no es siempre el caso.
La transición de la estructura del proyecto al archivo WAR resultante se realiza mediante un proceso de compilación.
Si bien generalmente es libre de diseñar su propio proceso de compilación, hoy en día la mayoría de las personas utilizará un enfoque estandarizado como Apache Maven . Entre otras cosas, Maven define valores predeterminados para qué recursos en la estructura del proyecto se asignan a qué recursos en el artefacto resultante (el artefacto resultante es el archivo WAR en este caso). En algunos casos, el mapeo consiste en un proceso de copia simple, en otros casos el proceso de mapeo incluye una transformación, como el filtrado o la compilación y otros.
Un ejemplo : la WEB-INF/classes
carpeta contendrá más tarde todas las clases y recursos compilados de Java ( src/main/java
y src/main/resources
) que el Cargador de clases debe cargar para iniciar la aplicación.
Otro ejemplo : la WEB-INF/lib
carpeta contendrá más tarde todos los archivos jar necesarios para la aplicación. En un proyecto de Maven, las dependencias se administran por usted y Maven copia automáticamente los archivos jar necesarios en la WEB-INF/lib
carpeta. Eso explica por qué no tienes una lib
carpeta en un proyecto maven.