Servlet 路徑 客戶端路徑 伺服器端路徑 ServletContext獲得資源路徑 Class獲得資源路徑 ClassLoader獲得資源路徑
(1)路徑分為三種
1.絕對路徑
2.相對路徑(分兩種)
帶“/”的相對路徑
不帶“/”的相對路徑
(2)客戶端路徑
1.超連結
絕對路徑:<a href="http://Localhost:8080/javaEE-05/servlet/AServlet">點選</a>
相對路徑(帶“/”的相對路徑):<a href="/javaEE-05/servlet/AServlet">點選</a> //相對於主機
相對路徑(不帶“/”的相對路徑):<a href="AServlet"></a> //相對於當前檔案的位置
2.表單
絕對路徑:<form action="http://Localhost:8080/javaEE-05/servlet/AServlet
<input type="submit" value="">
</form>
相對路徑(帶“/”的相對路徑):<form action="/javaEE-05/servlet/AServlet"> //相對於主機
<input type="submit" value="">
</form>
相對路徑(不帶“/”的相對路徑):<form action="AServlet"> //相對於當前檔案的位置
<input type="submit" value="">
</form>
3.重定向
相對路徑(帶“/”的相對路徑):response.sendRedirect("/javaEE-05/servlet/AServlet"); //相對於主機 路徑帶專案名稱
相對路徑(不帶“/”的相對路徑):response.sendRedirect("AServlet"); //相對於當前路徑
總結:客戶端路徑
客戶端路徑 帶“/”的相對路徑:相對於主機
客戶端路徑 不帶“/”的相對路徑:相對於當前路徑(當前檔案位置)
(2.1)建議使用“/”
在Servlet中的重定向建議使用“/”開頭,路徑相對以主機 要給出應用名稱
例如:response.sendRedirect("/javaEE-05/servlet/AServlet");
其中/javaEE-05是當前應用名,如果將來修改了應用名稱,那麼也要修改所有重定向的路徑,這一問題的處理方案是使用request.getContextPath()來獲取應用名稱。
response.sendRedirect(request.getContextPath+"/servlet/AServlet");
(3)服務端路徑
服務端路徑必須是相對路徑,不能是絕對路徑
帶“/”的相對路徑
不帶“/”的相對路徑
1.請求轉發
轉發相對路徑(帶"/"的相對路徑):
request.getRequestDispatcher("/servlet/AServlet").forward(request.response); //相對於web應用
轉發相對路徑(不帶"/"的相對路徑):
request.getRequestDispatcher("servlet/AServlet").forward(request.response); //相對於web應用
2.請求包含
包含相對路徑(帶"/"的相對路徑):
request.getRequestDispatcher("/servlet/AServlet").include(request.response); //相對於web應用
包含相對路徑(不帶"/"的相對路徑):
request.getRequestDispatcher("/servlet/AServlet").include(request.response); //相對於web應用
3.<url-pattern> 對映路徑
<url-pattern>必須使用“/”開頭,並且相對的是當前web應用
總結:請求轉發包含對映路徑帶不帶“/”都是相對於當前web應用
(4)ServletContext上下文物件獲取資源路徑
必須是相對路徑
ServletContext獲取資源相對路徑(帶“/”的相對路徑):
this.getServletContext.getRealPath("/servlet/AServlet"); //相對於當前web應用
ServletContext獲取資源相對路徑(不帶“/”的相對路徑):
this.getServletContext.getRealPath("servlet/AServlet"); //相對於當前web應用
(5)Class獲取資源
必須是相對路徑
帶“/”的相對路徑:類名.class.getResourceAsStream("/a.txt"); //相對於當前類classes路徑
不帶“/”的相對路徑:類名.class.getResourceAsStream("a.txt"); //相對於classes所在路徑
(6)ClassLoader獲取資源
必須是相對路徑
帶“/”的相對路徑:類名.class.getClassLoader().getResourceAsStream("/a.txt"); //相對於當前類路徑
不帶“/”的相對路徑:類名.class.getClassLoader().getResourceAsStream("a.txt"); //相對於當前類路徑