1. 程式人生 > >web應用路徑問題(相對路徑,絕對路徑,動態獲取路徑)

web應用路徑問題(相對路徑,絕對路徑,動態獲取路徑)

body des 轉發器 端口號 .get redirect style https 不容易

1、相對路徑和絕對路徑

絕對路徑:以 “ / ” 開頭的路徑,是完整的路徑。

相對路徑:不以 “ / ” 開頭的路徑,是相對於當前web資源目錄的路徑。

在絕對路徑中, “ / ” 的含義有兩種解釋:

  (1)如果是服務器端解析, “ / ” 代表相對於當前web應用的絕對路徑,即:協議名://服務器名(主機地址):端口號/項目名/,例如:http://localhost:8080/MyTest/。

  (2)如果是瀏覽器端解析(出現在地址欄裏的路徑), “ / ” 代表相對於當前服務器的絕對路徑,即:協議名://服務器名(主機地址):端口號/,例如:http://localhost:8080/。

常見的兩種絕對路徑的例子就是轉發重定向

假設在當前動態web項目MyTest中,項目根目錄webContent下有兩個頁面src.html和des.html。

src.html中,通過超鏈接訪問項目中的Servlet,此時a標簽的地址有瀏覽器端解析,路徑的第一個 “ / ” 代表http://localhost:8080/,如果直接寫 " /MyServlet " 就會報404錯誤。

<a href="/MyTest/MyServlet">主頁</a><!-- /MyTest/MyServlet等價於http://llocalhost:8080/MyTest/MyServlet -->

在MyServlet中做如下處理,將請求轉發到des.html做處理,此時轉發器中的地址由服務器解析,路徑的第一個 “ /

” 代表http://localhost:8080/MyTest/。

如果是重定向,重定向中的地址由瀏覽器解析,路徑的第一個 “ / ” 代表http://localhost:8080/,如果直接寫 " /des.html " 就會報404錯誤。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/des.html").forward(request, response); //   
/des.html 等價於 http://localhost:8080/MyTest/des.html
//    response.sendRedirect("/MyTest/des.html"); //
/MyTest/des.html 等價於 http://localhost:8080/MyTest/des.html
    }

如果是相對路徑的話較簡單些,但相比絕對路徑,相對路徑更容易出錯,當頁面更換位置時,鏈接容易失效。

<a href="MyServlet">主頁</a>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("des.html").forward(request, response);
//    response.sendRedirect("des.html");
    }

但是無論是相對路徑還是絕對路徑,都容易出問題。

2、動態獲取路徑(最不容易出錯的方法)

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<body>
    <!-- 獲取當前鏈接使用的協議;一般應用返回http;SSL返回https; -->
    request.getScheme()===<%=request.getScheme() %><!-- http  -->
    <br>
    <!-- 獲取當前頁面所在的服務器的名字,如果是在本地的話就是localhost -->
    request.getServerName()===<%=request.getServerName() %><!-- localhost  -->
    <br>
    <!-- 獲得服務器的端口號 -->
    request.getServerPort()===<%=request.getServerPort() %><!-- 8080  -->
    <br>
    <!-- 獲取當前web應用的根目錄 -->
    request.getContextPath()===<%=request.getContextPath() %><!-- /MyTest  -->
    <br>
    basePath===<%=basePath %><!-- http://localhost:8080/MyTest/  -->
    <br>
</body>

在java後臺同樣可以這樣獲取到路徑,但是更多的用於前臺的訪問路徑和js、css、img等靜態資源的訪問路徑問題。

web應用路徑問題(相對路徑,絕對路徑,動態獲取路徑)