ServletContext.getRealPath() 是從當前servlet 在tomcat 中的存放文件夾開始計算起的 比如,有個servlet 叫 UploadServlet,它部署在tomcat 下麵以後的絕對路徑如下:"C:\Program Files\apache-tomcat-8.0 ...
ServletContext.getRealPath() 是從當前servlet 在tomcat 中的存放文件夾開始計算起的
比如,有個servlet 叫 UploadServlet,它部署在tomcat 下麵以後的絕對路徑如下:"C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet"
那麼,ServletContext.getRealPath("/") 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet"
ServletContext.getRealPath("/attachment") 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet\attachment"
ServletContext.getRealPath("attachment") 會導致NullPointerException
結論就是:
在使用ServletContext.getRealPath() 時,傳入的參數是從 當前servlet 部署在tomcat中的文件夾算起的相對路徑,要以"/" 開頭,否則會找不到路徑,導致NullPointerException
觀察到的結果是:
ServletContext.getRealPath("/") 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet"
ServletContext.getRealPath("/") + "xxx" 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServletxxx"
ServletContext.getRealPath("/") + "/xxx" 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet\xxx"
即,getRealPath() 返回的字元串結尾不帶"/"
註意,Windows下,在Eclipse debug過程中,看到的getRealPath() 返回的字元串其實是長這樣子的:
"C:\\Program Files\\apache-tomcat-8.0.\\webapps\\UploadServlet\\attachment" \\"中的第一個"\"是轉義符,你懂的。