URL中的訪問路徑如何設(shè)置?

訪問路徑與資源名稱
通常的URL資源路徑由兩部分構(gòu)成:訪問路徑與資源名稱. 資源名稱指的是要訪問資源的直接名稱, 如show.jsp, 或與要訪問資源存在映射關(guān)系的間接名稱, 如show.do. 而訪問路徑, 則是通過該路徑可以定位到指定的資源, 即在URL資源訪問路徑中除了資源名稱以外的其他部分. 一般情況下, 在URL訪問路徑中, 最后一部分為資源名稱, 而其他部分則為訪問路徑.
如下面的URL:
http://localhost:8080/ssm/show.do其中 http://localhost:8080/ssm 為訪問路徑, show.do為資源名稱.
<body>
????<a?href="xxx/ooo/show.do">跳轉(zhuǎn)到show頁面a>
body>其中 xxx/ooo/ 為訪問路徑, show.do為資源名稱.
根據(jù)"訪問路徑是否可以獨立完成資源準(zhǔn)確定位"的判別標(biāo)準(zhǔn), 可以將訪問路徑分為絕對路徑與相對路徑.
絕對路徑
絕對路徑, 是指根據(jù)給出的訪問路徑可以準(zhǔn)確定位到資源的路徑. Web應(yīng)用的絕對路徑是指帶訪問協(xié)議的路徑, 如:
http://localhost:8080/ssm/show.do相對路徑
相對路徑是指根據(jù)訪問路徑無法準(zhǔn)確定位到資源的路徑. 因為只有絕對路徑才能定位到資源, 所以當(dāng)資源的路徑是相對路徑時, 我們的首要任務(wù)是找到參照路徑, 然后將參照路徑和相對路徑拼接成絕對路徑.
在Web應(yīng)用中, 相對路徑的寫法有兩種: 以斜桿開頭的相對路徑和不以斜桿開頭的相對路徑.
以斜桿開頭的相對路徑
以斜桿開頭的相對路徑, 根據(jù)路徑所在文件所處位置的不同, 又分為前端路徑和后端路徑.
(1) 前端路徑
前端路徑是指由瀏覽器解析執(zhí)行的代碼中所包含的路徑, 如html, css, js, 及jsp中的靜態(tài)路徑. 前端路徑的參照路徑是Web服務(wù)器的根路徑, 即 http://localhost:8080/
(2) 后端路徑
后端路徑是指由服務(wù)器解析執(zhí)行的代碼及文件中所包含的路徑, 如Java代碼中的路徑, jsp中的動態(tài)路徑(Java代碼塊中的路徑), xml文件中的路徑等. 后端路徑的參照路徑是Web應(yīng)用的根路徑, 即: http://localhost:8080/ssm/
注意, response.sendRedirect("") 中的路徑為前端路徑, 因為重定向是把URL發(fā)送給客戶端, 客戶端再次向服務(wù)器發(fā)送請求. 所以在后臺代碼中要重定向到show.jsp頁面時, 代碼如下:
response.sendRedirect("show.jsp");
或 response.sendRedirect(request.getContextPath + "/show.jsp");不以斜桿開頭的相對路徑
不以斜桿開頭的相對路徑, 無論是前端路徑還是后端路徑, 其參照路徑都是當(dāng)前資源的訪問路徑, 而不是當(dāng)前資源的保存路徑.
路徑常見問題
(1) 為什么頁面超鏈接的href屬性值加上斜桿會報錯?
<body>
????<a?href="/show.do">跳轉(zhuǎn)到show頁面a>
body>因為超鏈接上的路徑為前端路徑, 其參照路徑為 http://localhost:8080/ ,拼接為絕對路徑后為 http://localhost:8080/show.do , 但該資源真正的絕對路徑為 http://localhost:8080/ssm/show.do , 解決辦法如下:
<body>
????<a?href="${pageContext.request.contextPath}/show.do">跳轉(zhuǎn)到show頁面a>
body>(2)為什么點擊超鏈接跳轉(zhuǎn)到自身后再點擊會報錯?
Controller代碼
@RequestMapping("/test/show.do")
public?ModelAndView doShow()?{
????return?new?ModelAndView("/index.jsp");
}index頁面
<body>
??<a?href="test/show.do">跳轉(zhuǎn)a>
body>index頁面的路徑為 http://localhost:8080/ssm/index.jsp , 當(dāng)點擊第一次時絕對路徑為 http://localhost:8080/ssm/test/show.do , 點擊第二次時絕對路徑為 http://localhost:8080/ssm/test/test/show.do , 解決辦法如下:
<body>
????<a?href="${pageContext.request.contextPath}/show.do">跳轉(zhuǎn)a>
body>或者
<%
????String?path = request.getContextPath();
????String?bathPath = request.getScheme() + "://"?+ request.getServerName() + ":"?+ request.getServerPort() + path + "/";
%>
<html>
<head>
????<base?href="<%=bathPath%>">
head>
<body>
??<a?href="test/show.do">跳轉(zhuǎn)a>
body>
html>頁面中的< base>標(biāo)簽, 會在當(dāng)前頁面的所有資源請求路徑前加上< base>標(biāo)簽內(nèi)的路徑, 將相對路徑變成絕對路徑. 該方式實際上是修改了不帶斜桿的相對路徑的參照路徑, 將其修改為了basePath, 所以這種方式要求頁面中的請求不能以斜桿開頭.
原文鏈接:blog.csdn.net/litianxiang_kaola/article/details/86485484
