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


95

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

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

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

감사

답변:


138

이를 수행하는 몇 가지 방법이 있습니다. 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를 얻을 수 있습니다.


3
이 작업을 수행하려면 다음과 같이 경로에 초기 /를 넣어야한다는 점을 지적 할 가치가 있습니다. context.getResourceAsStream ( "/ WEB-INF / test / foo.txt");
Mick Sear 2011 년

1
질문에 태그가 지정된 것처럼 appengine에서 간단하게 작동하지 않습니다.
Renascienza 2016 년

2
6 년 전에 정답으로 표시되었습니다. Google이 앱 엔진 API를 변경했거나 배포에 버그가 있습니다. 표준 서블릿을 실행하는 경우 context.getResourceAsStream()변형 을 사용할 수 있어야합니다 .
Berin Loritsch 2016 년

2
이것은 좋은 것 같지만 Java 1.8을 사용하고 있으며 getContext ()가 기본적으로 존재하지 않습니다. 사용하려면 어떤 jar 파일이 필요합니까?
f1wade

3
ServletContext는 javax.servletJ2EE 라이브러리 패키지의 일부입니다 . 서블릿 클래스 (예 : 확장 java.servlet.GenericServlet) 에서 참조를 얻습니다 . BTW, GenericServlet에는 이제 getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…에
Berin Loritsch


1

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

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.