JSF(JavaServer Faces) 프레임워크에서, 특정 리소스(예: 사용자 메뉴얼.pdf)의 실제 파일경로를 취득하는 방법
◆ 파일경로
취득하려는 파일의 경로는 아래와 같다.
◆ 파일경로 취득
ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
String realPath = servletContext.getRealPath("/resources/file/사용자 메뉴얼.pdf");
위 로직을 풀어서 설명해 보면 다음과 같다.
1. FacesContext.getCurrentInstance()
JSF 애플리케이션의 요청과 관련된 모든 정보를 포함하고 있는 FacesContext 객체를 가져온다.
2. getExternalContext().getContext()
ExternalContext 객체를 통해 서블릿 관련 정보를 가져온다.
getContext()는 ServletContext 객체를 반환한다.
3. ServletContext.getRealPath(String path)
주어진 상대 경로에 대한 실제 파일 시스템 경로를 반환한다.
여기서는 (/resources/file/사용자 메뉴얼.pdf)에 대한 실제 경로를 반환한다.
◆ 비고
ServletContext.getRealPath() 메서드는 웹 애플리케이션의 Context 내에서 주어진 경로의 실제 파일 시스템 경로를 반환하지만 배포된 WAR 파일이 어느 형태로 배포되었는지에 따라 동작이 달라진다.
WAR 파일이 압축 해제된 상태로 배포된 경우는 getRealPath()가 정상적으로 동작하며, 파일 시스템 상에서 실제 파일의 경로를 반환한다.
WAR 파일이 압축된 상태로 배포된 경우는 getRealPath()이 null을 반환할 수 있다.
이는 압축된 WAR 파일 내부의 리소스에 대한 실제 파일 시스템 경로가 없기 때문인데, 이 경우 리소스는 파일 시스템에 존재하지 않고, 대신 클래스패스 내에 위치하게 된다.
압축된 WAR 파일로 배포된 경우, 리소스를 읽어들이려면 ServletContext.getResourceAsStream()을 사용하여 리소스를 읽어오는게 더 좋은 대안이 될수 있다.
ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
InputStream inputStream = servletContext.getResourceAsStream("/resources/file/사용자 메뉴얼.pdf");
글 내용 중 잘못된 부분이 있거나, 첨부하실 내용이 있으시면 댓글로 남겨주세요. 공부하는데 많은 도움이 됩니다.
-- 기억의 유효기간은 생각보다 짧다. --
'웹 프레임워크 (Web Framework) > JSF (JavaServer Faces)' 카테고리의 다른 글
JSF web.xml 서블릿, 필터 맵핑 (0) | 2024.02.17 |
---|---|
JSF의 EL 표현식 에러 (The entity name must immediately follow the '&' in the entity reference.) 해결법 (0) | 2022.11.18 |