[java] war / WEB-INF 폴더의 리소스에 대한 파일 경로?

내 앱 엔진 프로젝트의 war / WEB-INF 폴더에 파일이 있습니다. 서블릿 컨텍스트에서 파일을 읽을 수있는 FAQ를 읽었습니다. 그래도 리소스에 대한 경로를 형성하는 방법을 모르겠습니다.

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

위와 같이 File ()과 함께 사용할 해당 리소스에 대한 경로를 어떻게 구성합니까?

감사



답변

이를 수행하는 몇 가지 방법이 있습니다. WAR 파일이 확장되면 (.war 파일 대신 파일 집합) 다음 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)

그러면 찾고있는 리소스에 대한 전체 시스템 경로를 얻을 수 있습니다. 그러나 서블릿 컨테이너가 WAR 파일 (예 : Tomcat)을 확장하지 않으면 작동하지 않습니다. 작동하는 것은 ServletContext의 getResource메소드를 사용하는 것 입니다.

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

또는 입력 스트림을 원하는 경우 :

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)

후자의 접근 방식은 사용하는 서블릿 컨테이너와 애플리케이션이 설치된 위치에 관계없이 작동합니다. 이전 접근 방식은 배포 전에 WAR 파일의 압축을 푼 경우에만 작동합니다.

편집 :
getContext () 메서드는 분명히 구현해야 할 것입니다. JSP 페이지를 통해 context필드 로 사용할 수 있습니다 . 서블릿 ServletConfig에서 서블릿의 init()메소드 로 전달되는 서블릿을 가져옵니다 . 그 시간에 저장하면 그 후 원하는 시간에 ServletContext를 얻을 수 있습니다.


답변

이제 Java EE 7을 사용하면 리소스를보다 쉽게 ​​찾을 수 있습니다.

InputStream resource = getServletContext().getResourceAsStream("/WEB-INF/my.json");

https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext–


답변

늦었다는 건 알지만 보통 이렇게 해요

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");


답변