servletcontext.getRealPath ( "/")는 무엇을 의미하며 언제 사용해야합니까?
다음 스 니펫에서 :
ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
/
방법에서 무엇을 getRealPath()
나타 냅니까? 언제 사용해야합니까?
소개
은 ServletContext#getRealPath()
절대 디스크 파일 시스템 경로로 웹 콘텐츠 경로 (서버의 디스크 파일 시스템에서 확장 된 WAR 폴더 구조에서 경로를) 변환들이 의도된다.
는 "/"
웹 콘텐츠 루트를 나타냅니다. 즉 web
, 아래 프로젝트 구조와 같이 폴더를 나타냅니다 .
YourWebProject
|-- src
| :
|
|-- web
| |-- META-INF
| | `-- MANIFEST.MF
| |-- WEB-INF
| | `-- web.xml
| |-- index.jsp
| `-- login.jsp
:
그래서, 전달 "/"
하는 것은 getRealPath()
당신에게의 절대 디스크 파일 시스템 경로 반환 /web
프로젝트의 확장 된 WAR 파일의 폴더에 있습니다. 같은 /path/to/server/work/folder/some.war/
당신이 더에서 사용할 수 있어야하는 File
나 FileInputStream
.
대부분의 스타터는 전체 웹 콘텐츠 경로를 실제로 전달할 수 있고 자주 사용한다는 것을 보거나 깨닫지 못하는 것 같습니다.
String absolutePathToIndexJSP = servletContext.getRealPath("/") + "index.jsp"; // Wrong!
또는
String absolutePathToIndexJSP = servletContext.getRealPath("") + "index.jsp"; // Wronger!
대신에
String absolutePathToIndexJSP = servletContext.getRealPath("/index.jsp"); // Right!
거기에 파일을 쓰지 마십시오
또한를 사용하여 새 파일을 작성할 수 있더라도 WAR이 재배치 될 때마다 FileOutputStream
모든 변경 사항 (예 : 새 파일 또는 편집 된 파일)이 손실됩니다 . 모든 변경 사항이 원본 WAR 파일에 포함되어 있지 않기 때문입니다. 그래서 거기에 업로드 된 파일을 저장하려는 모든 시작자는 잘못하고 있습니다.
또한 서버가 WAR 파일을 디스크 파일 시스템으로 확장하도록 구성되어 있지 않고 대신 가상 파일 시스템과 같은 메모리로 확장 할 때 getRealPath()
항상 null
또는 완전히 예상치 못한 경로를 반환 합니다.
getRealPath()
휴대 할 수 없습니다. 당신은 그것을 사용하지 않는 것이 좋습니다
getRealPath()
신중하게 사용하십시오 . 실제로 이에 대한 현명한 실제 사용 사례는 없습니다. 20 년 간의 Java EE 경험을 기반으로 할 때 항상 .NET보다 훨씬 좋고 이식성이 뛰어난 또 다른 방법이 getRealPath()
있었습니다.
실제로 필요한 모든 것이 InputStream
웹 리소스 를 얻는 것이라면 ServletContext#getResourceAsStream()
대신 더 잘 사용 하면 WAR이 확장되는 방식에 관계없이 작동합니다. 따라서 예를 들어 InputStream
of 를 원하면 index.jsp
다음을 수행 하지 마십시오.
InputStream input = new FileInputStream(servletContext.getRealPath("/index.jsp")); // Wrong!
대신 다음을 수행하십시오.
InputStream input = servletContext.getResourceAsStream("/index.jsp"); // Right!
또는 사용 가능한 모든 웹 리소스 경로 목록을 얻으려면 ServletContext#getResourcePaths()
대신 사용하십시오.
Set<String> resourcePaths = servletContext.getResourcePaths("/");
를 URL
통해 개별 리소스를 얻을 수 있습니다 ServletContext#getResource()
. null
리소스가 존재하지 않을 때 반환 됩니다.
URL resource = servletContext.getResource(path);
또는 업로드 된 파일을 저장하거나 임시 파일을 만들려면 아래 "참고 항목"링크를 참조하십시오.
또한보십시오:
- getResourceAsStream () 대 FileInputStream
- 서블릿 애플리케이션에 업로드 된 파일을 저장하는 권장 방법
- Java EE 7 웹 애플리케이션 재배치시 데이터를 보관하는 간단한 방법
웹 애플리케이션의 컨텍스트 경로는 웹 애플리케이션의 WEB-INF 디렉토리를 포함하는 디렉토리입니다. 웹 앱의 '홈'이라고 생각할 수 있습니다. 종종 웹 애플리케이션을 작성할 때 파일 시스템에서이 디렉토리의 실제 위치를 가져 오는 것이 중요 할 수 있습니다. 이렇게하면 파일에서 읽거나 파일에 쓰는 것과 같은 작업을 수행 할 수 있기 때문입니다.
This location can be obtained via the ServletContext object's getRealPath() method. This method can be passed a String parameter set to File.separator to get the path using the operating system's file separator ("/" for UNIX, "\" for Windows).
There is also a change between Java 7 and Java 8. Admittedly it involves the a deprecated call, but I had to add a "/" to get our program working! Here is the link discussing it Why does servletContext.getRealPath returns null on tomcat 8?
My Method:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String path = request.getRealPath("/WEB-INF/conf.properties");
Properties p = new Properties();
p.load(new FileInputStream(path));
String StringConexion=p.getProperty("StringConexion");
String User=p.getProperty("User");
String Password=p.getProperty("Password");
}
catch(Exception e){
String msg = "Excepcion " + e;
}
}
'Program Tip' 카테고리의 다른 글
Twitter 부트 스트랩 탭 및 자바 스크립트 이벤트 (0) | 2020.12.04 |
---|---|
JavaScript에서 입력 텍스트 값을 얻는 방법 (0) | 2020.12.04 |
Lisp의 read-eval-print 루프는 Python과 어떻게 다릅니 까? (0) | 2020.12.04 |
여러 열의 값을 사용하여 Pandas 데이터 프레임을 정렬하는 방법은 무엇입니까? (0) | 2020.12.04 |
특정 브랜치에서 저장소를 얕게 복제하려면 어떻게해야합니까? (0) | 2020.12.04 |