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-INFnó não faz parte da árvore de documentos públicos do aplicativo . Nenhum arquivo contido no WEB-INFdiretório pode ser servido diretamente a um cliente pelo contêiner. No entanto, o conteúdo do
WEB-INFdiretório é visível para o código do servlet usando as chamadas de método getResource
e getResourceAsStreamno ServletContexte pode ser exposto usando as RequestDispatcherchamadas.
Isso significa que os WEB-INFrecursos 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-INFpasta. 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-INFexplicitamente:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" >
</bean>
As pastas WEB-INF/classese WEB-INF/libmencionadas 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/classespasta conterá posteriormente todas as classes e recursos Java compilados ( src/main/javae src/main/resources) que precisam ser carregados pelo Classloader para iniciar o aplicativo.
Outro exemplo : A WEB-INF/libpasta 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/libpasta. Isso explica por que você não tem uma libpasta em um projeto de preparação.