A especificação do Servlet 2.4 diz isso sobre o WEB-INF (página 70):
Um diretório especial existe dentro da hierarquia de aplicativos nomeada
WEB-INF
. Este diretório contém todos os itens relacionados ao aplicativo que não estão na raiz do documento. O
WEB-INF
nó não faz parte da árvore de documentos públicos do aplicativo . Nenhum arquivo contido no WEB-INF
diretório pode ser servido diretamente a um cliente pelo contêiner. No entanto, o conteúdo do
WEB-INF
diretório é visível para o código do servlet usando as chamadas de método getResource
e getResourceAsStream
no ServletContext
e pode ser exposto usando as RequestDispatcher
chamadas.
Isso significa que os WEB-INF
recursos são acessíveis ao carregador de recursos do seu aplicativo da Web e não diretamente visíveis ao público.
É por isso que muitos projetos colocam seus recursos como arquivos JSP, JARs / bibliotecas e seus próprios arquivos de classe ou arquivos de propriedades ou qualquer outra informação confidencial na WEB-INF
pasta. Caso contrário, eles seriam acessíveis usando uma URL estática simples (útil para carregar CSS ou Javascript, por exemplo).
Seus arquivos JSP podem estar em qualquer lugar, do ponto de vista técnico. Por exemplo, no Spring, você pode configurá-los para serem WEB-INF
explicitamente:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" >
</bean>
As pastas WEB-INF/classes
e WEB-INF/lib
mencionadas no artigo de arquivos WAR da Wikipedia são exemplos de pastas exigidas pela especificação do Servlet em tempo de execução.
É importante fazer a diferença entre a estrutura de um projeto e a estrutura do arquivo WAR resultante.
A estrutura do projeto, em alguns casos, reflete parcialmente a estrutura do arquivo WAR (para recursos estáticos, como arquivos JSP ou arquivos HTML e JavaScript, mas esse nem sempre é o caso.
A transição da estrutura do projeto para o arquivo WAR resultante é feita por um processo de construção.
Enquanto você geralmente é livre para criar seu próprio processo de criação, hoje em dia a maioria das pessoas usa uma abordagem padronizada como o Apache Maven . Entre outras coisas, o Maven define padrões para quais recursos na estrutura do projeto são mapeados para quais recursos no artefato resultante (o artefato resultante é o arquivo WAR nesse caso). Em alguns casos, o mapeamento consiste em um processo de cópia simples; em outros casos, o processo de mapeamento inclui uma transformação, como filtragem ou compilação e outras.
Um exemplo : A WEB-INF/classes
pasta conterá posteriormente todas as classes e recursos Java compilados ( src/main/java
e src/main/resources
) que precisam ser carregados pelo Classloader para iniciar o aplicativo.
Outro exemplo : A WEB-INF/lib
pasta conterá posteriormente todos os arquivos jar necessários pelo aplicativo. Em um projeto maven, as dependências são gerenciadas por você e o maven copia automaticamente os arquivos jar necessários para a WEB-INF/lib
pasta. Isso explica por que você não tem uma lib
pasta em um projeto de preparação.