1. 程式人生 > >Servlet--超連結,表單提交,重定向,轉發4種情況的路徑

Servlet--超連結,表單提交,重定向,轉發4種情況的路徑

實際編碼中我們經常寫路徑,寫路徑既可以寫相對路徑,也可以寫絕對路徑。我2年以前我就養成了習慣,只要是寫路徑我從來都是寫絕對路徑,因為萬一將來我們的專案的目錄發生變化,原來要是寫相對路徑的話就會有路徑依賴關係,改的地方太多了。而且相對路徑在某些情況下還有點特殊,有的是相對於原來的請求的目錄,有的是相對於整個web應用,所以我強烈建議大家以後寫路徑統一用絕對路徑(以“/”開頭)來寫,“/”表示站點的根路徑。

寫路徑的情況無非下面4種情況,這裡做一個整理。

  • 1,超連結

假設使用下面的目錄結構:

           

當前的請求路徑:http://localhost:8080/linkin/Linkin.html或者http://localhost:8080/linkin/Linkin.jsp

相對路徑:

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,表單提交
當前的請求路徑:http://localhost:8080/linkin/Linkin.jsp
相對路徑:<form action="LinkinServlet" method="POST">
絕對路徑:<form action="/linkin/LinkinServlet" method="POST">

  • 3,重定向
當前請求路徑:http://localhost:8080/linkin/LinkinServlet
相對路徑:resp.sendRedirect("jsp/Linkin1.jsp");
絕對路徑:resp.sendRedirect("/linkin/jsp/Linkin1.jsp");

  • 4,轉發
當前請求路徑:http://localhost:8080/linkin/LinkinServlet
相對路徑: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應用內部跳轉的,所以不能寫專案名稱,直接從專案名稱後面開始寫。

  • 如果還不理解,請好好理解下面這句話:
傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對於整個WEB站點的根目錄;如果建立RequestDispatcher 物件時指定的相對URL以“/”開頭,它是相對於當前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