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

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

str action local white 一句話 ont java ons isp

實際編碼中我們常常寫路徑,寫路徑既能夠寫相對路徑,也能夠寫絕對路徑。我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文件引入靜態資源相對路徑還不一樣,記住以下的一句話,假設是在server上直接執行的靜態資源比方html文件引入別的靜態資源這裏的“相對”就是物理意義上的相對,假設是在server上要跳轉的這樣的視圖資源比方jsp文件引入別的靜態資源這裏的“相對”是相對於上整個webproject的相對。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。雖然我們不怎麽寫相對路徑,可是難免會維護別人的代碼。所以還是要了解一下的。假設在超鏈接中使用了到了相對路徑,假設要是沒有server跳轉。比方html這些文件。則相對就是文件所在的文件夾。要是經過了server跳轉,比方jsp這些文件或者通過XXX.do跳轉到的頁面上的話,這裏的相對是相對於整個web應用,不一樣的。


2。絕對路徑比較好,以後我們寫路徑都直接寫絕對路徑就好。除了轉發。絕對路徑的開頭“/”代表域名之後的東西,也就是說相當於省去了整個url上面的主機IP和port號而已。項目名稱還是要寫的。

轉發是唯一一個比較特殊的,由於轉發本身就是在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 server的 URL 命名空間的缺省的根上下文時,那麽上下文路徑將會是一個空的字符串。

假設上下文並非server的命名空間的根,則上下文路徑就以“/”開始,但不能以“/”結束。
2)Servlet 路徑(Servlet Path)
該路徑就是直接與激活該請求的對應映射。它也是以“/”開頭。

但要註意的是,假設指定的請求是與“/*”模式相匹配,則此時 Servlet 路徑就是一個空字符串。
3)路徑信息(PathInfo)
請求路徑中除了上下文路徑和 Servlet 路徑以外的部分。當沒有額外的路徑時路徑信息就是空的(null),或者它會以“/”開始的字符串。

在 HttpServletRequest 接口中定義例如以下的方法來訪問請求路徑的對應信息:getContextPath(); getServletPath(); getPathInfo(); 值得註意的是,請求 URI 和路徑的各部分之間的 URL 編碼的不同之外。以下的等式恒成立: requestURI = contextPath + servletPath + pathInfo


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