Caminho do arquivo para o recurso em nossa pasta war / WEB-INF?


95

Eu tenho um arquivo na minha pasta war / WEB-INF do meu projeto do App Engine. Eu li nas FAQs que você pode ler um arquivo de lá em um contexto de servlet. Não sei como formar o caminho para o recurso:

/war/WEB-INF/test/foo.txt

Como eu construiria meu caminho para esse recurso para usar com File (), exatamente como parece acima?

obrigado

Respostas:


138

Existem algumas maneiras de fazer isso. Contanto que o arquivo WAR seja expandido (um conjunto de arquivos em vez de um arquivo .war), você pode usar esta API:

ServletContext context = getContext();
String fullPath = context.getRealPath("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

Isso fornecerá o caminho completo do sistema para o recurso que você está procurando. No entanto, isso não funcionará se o Servlet Container nunca expandir o arquivo WAR (como o Tomcat). O que funcionará é usar os getResourcemétodos do ServletContext .

ServletContext context = getContext();
URL resourceUrl = context.getResource("/WEB-INF/test/foo.txt");

ou, alternativamente, se você quiser apenas o fluxo de entrada:

InputStream resourceContent = context.getResourceAsStream("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResource(java.lang.String)

A última abordagem funcionará independentemente do Servlet Container usado e de onde o aplicativo está instalado. A abordagem anterior só funcionará se o arquivo WAR for descompactado antes da implementação.

EDIT: O método getContext () é obviamente algo que você teria que implementar. As páginas JSP o tornam disponível como o contextcampo. Em um servlet, você o obtém de seu, ServletConfigque é passado para o init()método do servlet . Se você armazená-lo nesse momento, poderá obter seu ServletContext a qualquer momento depois disso.


3
Vale ressaltar que precisei colocar uma inicial / no caminho para fazer isso funcionar, assim: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear de

1
Não funciona tão simples no appengine, como a pergunta está marcada.
Renascienza

2
Ela foi marcada como a resposta correta há 6 anos. O Google mudou a API do motor de aplicativo ou há um bug em sua implantação. Se você estiver executando um Servlet padrão, deverá ser capaz de usar a context.getResourceAsStream()variação.
Berin Loritsch

2
isso parece bom, mas estou usando java 1.8 e getContext () não existe por padrão, qual arquivo jar é necessário para usá-lo?
f1wade de

3
ServletContext faz parte do javax.servletpacote de suas bibliotecas J2EE. Você obtém uma referência a ele da classe de servlet (ou seja, o que estende java.servlet.GenericServlet). BTW, GenericServlet agora tem um método para getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Berin Loritsch


1

Eu sei que está tarde, mas é como eu normalmente faço,

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.