Como encontrar a pasta de trabalho de um aplicativo baseado em servlet para carregar resources

Eu escrevo um servlet Java que eu quero instalar em muitas instâncias do Tomcat em servidores diferentes. O servlet usa alguns arquivos estáticos que são empacotados com o arquivo war sob WEB-INF. Esta é a estrutura de diretório em uma instalação típica:

- tomcat -- webapps --- myapp ---- index.html ---- WEB-INF ----- web.xml ----- classs ------ src ------- ..... ----- MY_STATIC_FOLDER ------ file1 ------ file2 ------ file3 

Como posso saber o caminho absoluto de MY_STATIC_FOLDER, para que eu possa ler os arquivos estáticos?

Eu não posso confiar na “pasta atual” (o que eu recebo em um novo arquivo (“.”)) Porque depende de onde o servidor Tomcat foi iniciado, o que é diferente em cada instalação!

Você pode usar ServletContext#getRealPath() para converter um caminho de conteúdo da Web relativo em um caminho do sistema de arquivos do disco absoluto.

 String relativeWebPath = "/WEB-INF/static/file1.ext"; String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath); File file = new File(absoluteDiskPath); InputStream input = new FileInputStream(file); // ... 

No entanto, se sua única intenção for obter um InputStream , use melhor ServletContext#getResourceAsStream() vez disso, como getRealPath() pode retornar null sempre que o WAR não for expandido no sistema de arquivos do disco local (o Tomcat faz por padrão, mas é configurável para não fazer isso!):

 String relativeWebPath = "/WEB-INF/static/file1.ext"; InputStream input = getServletContext().getResourceAsStream(relativeWebPath); // ... 

Afinal, isso é muito mais robusto do que a abordagem java.io.File .

Veja também:

  • getResourceAsStream () vs FileInputStream
  • O que significa servletcontext.getRealPath (“/”) e quando devo usá-lo?
  • Onde colocar e como ler arquivos de resources de configuração no aplicativo baseado em servlet?
  • A maneira recomendada para salvar arquivos enviados em um aplicativo de servlet

Eu preferiria usar a opção getResourceaAsStream para carregar o recurso com base no diretório pai.

 getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1"); 

Você pode tentar isso
String relativeWebPath = "WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);

    Intereting Posts