Estoy trabajando en una aplicación web Java EE con la siguiente estructura de código fuente:
src/main/java <-- multiple packages containing java classes
src/test/java <-- multiple packages containing JUnit tests
src/main/resources <-- includes properties files for textual messages
src/main/webapp/resources <-- includes CSS, images and all Javascript files
src/main/webapp/WEB-INF
src/main/webapp/WEB-INF/tags
src/main/webapp/WEB-INF/views
Lo que me interesa es WEB-INF
: contiene web.xml
archivos XML para configurar servlets, contextos de cableado de Spring Beans y etiquetas y vistas JSP.
Estoy tratando de entender qué limita / define esta estructura. Por ejemplo, ¿los archivos JSP siempre deben estar dentro WEB-INF
o podrían estar en otro lugar? ¿Y hay algo más que pueda entrar WEB-INF
? La entrada de archivos WAR de Wikipedia menciona las classes
clases de Java y los lib
archivos JAR; no estoy seguro de haber comprendido completamente cuándo serían necesarios, además de las otras ubicaciones de archivos de origen.
servlets
jakarta-ee
war
web-inf
Steve Chambers
fuente
fuente
WEB-INF
y otras ubicaciones, vea la pregunta, Controlar el classpath en un servlet , especialmente esta Respuesta .Respuestas:
La especificación Servlet 2.4 dice esto sobre WEB-INF (página 70):
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:Las carpetas
WEB-INF/classes
yWEB-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
ysrc/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 laWEB-INF/lib
carpeta. Eso explica por qué no tienes unalib
carpeta en un proyecto maven.fuente
WAR
>WEB-INF
>lib
>JAR
archivo>resources
WAR
archivo>WEB-INF
>lib
>JAR
archivo>META-INF
>resources
> yourStaticFilesGoHere .Cuando implementa una aplicación web Java EE (utilizando marcos o no), su estructura debe seguir algunos requisitos / especificaciones. Estas especificaciones provienen de:
Si utiliza Apache Tomcat, el directorio raíz de su aplicación debe colocarse en la carpeta de la aplicación web. Eso puede ser diferente si usa otro contenedor de servlet o servidor de aplicaciones.
Requisitos de la API de Java Servlet La API de
Java Servlet establece que el directorio de la aplicación raíz debe tener la siguiente estructura:
Estos requisitos están definidos por la API de Java Servlet.
3. Su dominio de aplicación
Ahora que ha seguido los requisitos del contenedor de Servlet (o servidor de aplicaciones) y los requisitos de la API de Java Servlet, puede organizar las otras partes de su aplicación web en función de lo que necesita.
- Puede colocar sus recursos (archivos JSP, archivos de texto sin formato, archivos de script) en el directorio raíz de su aplicación. Pero entonces, las personas pueden acceder a ellos directamente desde su navegador, en lugar de que sus solicitudes sean procesadas por alguna lógica proporcionada por su aplicación. Por lo tanto, para evitar que se acceda directamente a sus recursos de esa manera, puede colocarlos en el directorio WEB-INF, a cuyo contenido solo puede acceder el servidor.
-Si usa algunos marcos, a menudo usan archivos de configuración. La mayoría de estos marcos (struts, spring, hibernate) requieren que coloque sus archivos de configuración en el classpath (el directorio "clases").
fuente
Debe poner en WEB-INF cualquier página, o parte de página, que no desee que sea pública. Por lo general, JSP o facelets se encuentran fuera de WEB-INF, pero en este caso son fácilmente accesibles para cualquier usuario. En caso de que tenga algunas restricciones de autorización, WEB-INF puede usarse para eso.
WEB-INF / lib puede contener bibliotecas de terceros que no desea empaquetar a nivel del sistema (los JAR pueden estar disponibles para todas las aplicaciones que se ejecutan en su servidor), pero solo para esta aplicación en particular.
En términos generales, muchos archivos de configuraciones también van a WEB-INF.
En cuanto a WEB-INF / classes, existe en cualquier aplicación web, porque esa es la carpeta donde se ubican todas las fuentes compiladas (no JARS, sino archivos .java compilados que usted mismo escribió).
fuente
Esta convención se sigue por razones de seguridad. Por ejemplo, si una persona no autorizada puede acceder al archivo JSP raíz directamente desde la URL, puede navegar por toda la aplicación sin autenticación y puede acceder a todos los datos protegidos.
fuente
Existe una convención (no necesaria) de colocar páginas jsp en el directorio WEB-INF para que no se puedan vincular o agregar a marcadores. De esta manera, todas las solicitudes a la página jsp deben dirigirse a través de nuestra aplicación, de modo que se garantice la experiencia del usuario.
fuente