Program Tip

servletcontext.getRealPath ( "/")는 무엇을 의미하며 언제 사용해야합니까?

programtip 2020. 12. 4. 20:22
반응형

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/당신이 더에서 사용할 수 있어야하는 FileFileInputStream.

대부분의 스타터는 전체 웹 콘텐츠 경로를 실제로 전달할 수 있고 자주 사용한다는 것을 보거나 깨닫지 못하는 것 같습니다.

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이 확장되는 방식에 관계없이 작동합니다. 따라서 예를 들어 InputStreamof 를 원하면 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);

또는 업로드 된 파일을 저장하거나 임시 파일을 만들려면 아래 "참고 항목"링크를 참조하십시오.

또한보십시오:


웹 애플리케이션의 컨텍스트 경로는 웹 애플리케이션의 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;
    }
}

참고URL : https://stackoverflow.com/questions/12160639/what-does-servletcontext-getrealpath-mean-and-when-should-i-use-it

반응형