Servlet--超連結,表單提交,重定向,轉發4種情況的路徑
寫路徑的情況無非下面4種情況,這裡做一個整理。
- 1,超連結
假設使用下面的目錄結構:
相對路徑:
1,我們來看看在linkin.html中引入linkin.js和linkin.html檔案相對路徑應該怎麼寫?
<span style="white-space:pre"> </span><script type="text/javascript" src="../scripts/linkin.js"></script>
<link rel="stylesheet" type="text/css" href="../styles/linkin.css">
2,如果在linkin.jsp中引入linkin.js和linkin.html檔案相對路徑應該怎麼寫?
<span style="white-space:pre"> </span><script type="text/javascript" src="scripts/linkin.js"></script>
<link rel="stylesheet" type="text/css" href="styles/linkin.css">
注意:上面的html檔案和jsp檔案引入靜態資源相對路徑還不一樣,記住下面的一句話,如果是在伺服器上直接執行的靜態資源比如html檔案引入別的靜態資源這裡的“相對”就是物理意義上的相對,如果是在伺服器上要跳轉的這種檢視資源比如jsp檔案引入別的靜態資源這裡的“相對”是相對於上整個web工程的相對,2者不同的。
絕對路徑:以“/”開頭,“/”表示根目錄,之後從專案名依次開始寫。
<script type="text/javascript" src="/linkin/scripts/linkin.js"></script>
<link rel="stylesheet" type="text/css" href="/linkin/styles/linkin.css">
- 2,表單提交
相對路徑:<form action="LinkinServlet" method="POST">
絕對路徑:<form action="/linkin/LinkinServlet" method="POST">
- 3,重定向
相對路徑:resp.sendRedirect("jsp/Linkin1.jsp");
絕對路徑:resp.sendRedirect("/linkin/jsp/Linkin1.jsp");
- 4,轉發
相對路徑:req.getRequestDispatcher("jsp/Linkin1.jsp").forward(req, resp);
絕對路徑:req.getRequestDispatcher("/jsp/Linkin1.jsp").forward(req, resp);
總結:
1,儘管我們不怎麼寫相對路徑,但是難免會維護別人的程式碼,所以還是要了解一下的。如果在超連結中使用了到了相對路徑,如果要是沒有伺服器跳轉,比如html這些檔案,則相對就是檔案所在的目錄,要是經過了伺服器跳轉,比如jsp這些檔案或者通過XXX.do跳轉到的頁面上的話,這裡的相對是相對於整個web應用,不一樣的。
2,絕對路徑比較好,以後我們寫路徑都直接寫絕對路徑就好。除了轉發,絕對路徑的開頭“/”代表域名之後的東西,也就是說相當於省去了整個url上面的主機IP和埠號而已,專案名稱還是要寫的。轉發是唯一一個比較特殊的,因為轉發本身就是在web應用內部跳轉的,所以不能寫專案名稱,直接從專案名稱後面開始寫。
- 如果還不理解,請好好理解下面這句話:
3,如果有程式碼潔癖的人在寫絕對路徑的時候,不想在jsp出現專案名稱這種硬碼,怎麼辦呢?用<%=request.getContextPath()%>來代替,比如:
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/common.css" />
<script type="text/javascript" src="<%=request.getContextPath()%>/jquery/base/jquery-1.8.0.js"></script>
- 最後統一來整理下請求路徑:
請求路徑是把請求導向到一個 servlet 來響應服務。它是由幾個重要的部分來組成的。 通過 HttpRequest 物件,暴露了如下資訊(對照應用的目錄結構):
1)上下文路徑(Context Path)
該路徑的字首是和 ServletContext 相關的。如果 Context 就是 Web 伺服器的 URL 名稱空間的預設的根上下文時,那麼上下文路徑將會是一個空的字串。 如果上下文並不是伺服器的名稱空間的根,則上下文路徑就以“/”開始,但不能以“/”結束。
2)Servlet 路徑(Servlet Path)
該路徑就是直接與啟用該請求的相應對映,它也是以“/”開頭。但要注意的是,如果指定的請求是與“/*”模式相匹配,則此時 Servlet 路徑就是一個空字串。
3)路徑資訊(PathInfo)
請求路徑中除了上下文路徑和 Servlet 路徑以外的部分。當沒有額外的路徑時路徑資訊就是空的(null),或者它會以“/”開始的字串。 在 HttpServletRequest 介面中定義如下的方法來訪問請求路徑的相應資訊:getContextPath(); getServletPath(); getPathInfo(); 值得注意的是,請求 URI 和路徑的各部分之間的 URL 編碼的不同之外,下面的等式恆成立: requestURI = contextPath + servletPath
+ pathInfo