내 앱 엔진 프로젝트의 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");
그러면 찾고있는 리소스에 대한 전체 시스템 경로를 얻을 수 있습니다. 그러나 서블릿 컨테이너가 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");
후자의 접근 방식은 사용하는 서블릿 컨테이너와 애플리케이션이 설치된 위치에 관계없이 작동합니다. 이전 접근 방식은 배포 전에 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");