1. 程式人生 > >各種訪問路徑和路徑跳轉總結篇

各種訪問路徑和路徑跳轉總結篇

路徑

從一個點到另一個點的過程稱為路徑。
從一個起點到某個具體資源的過程稱為訪問路徑,訪問路徑的最後一個斜槓(/)後面的是資源名稱。
絕對資源路徑是從起點http://開始到某個具體資源的前面的最後一個”/”結束的路徑。
絕對訪問路徑:https://localhost:8080/blog/csdn/net/index.jsp
絕對資源路徑:https://localhost:8080/blog/csdn/net/
資源名稱:index.jsp
相對訪問路徑:/csdn/net/index.jsp
相對資源路徑:/csdn/net/
絕對訪問路徑(URL)=絕對資源路徑+資源名稱
相對訪問路徑=相對資源路徑+資源名稱。
有相對訪問路徑就有參考路徑,參考路徑的前半部分一定是

https://localhost:8080/
絕對訪問路徑=參考路徑+相對訪問路徑。

把訪問路徑是否可以獨立完成資源準確定位的 作為判別標準,可以將路徑分為絕對訪問路徑和相對訪問路徑。
絕對訪問路徑:給定的訪問路徑可以準確的定位到資源
相對訪問路徑:必須結合參照路徑才能實現資源的定位

下面所說的相對路徑都是指相對訪問路徑。

(1)以”/”開頭的相對路徑,開頭的”/”表示根路徑
a.前臺路徑
郵瀏覽器解析執行的程式碼中所包含的路徑(出現在 css js html jsp 的路徑就叫前臺路徑,因為瀏覽器訪問伺服器資源時會把css,js,html,jsp檔案快取到瀏覽器中,然後進行渲染,所以請求是從瀏覽器端發出的,自然由瀏覽器解析)(127.0.0.1=localhost=本機地址)
前臺路徑的參照路徑是 web伺服器的根路徑
即:

http://127.0.0.1:8080/,根路徑下是多個專案。參考tomcat伺服器,則根路徑http://127.0.0.1:8080/ 代表webapps目錄。
所以相對路徑中開頭的”/”即表示:http://127.0.0.1:8080/
轉換工作由瀏覽器完成

b.後臺路徑
是由伺服器解析執行的程式碼檔案中所包含的路徑(java 程式碼 ,jsp 檔案中的動態部分,xml)
後臺應用的參照路徑是專案的根路徑:
http://127.0.0.1:8080/專案名稱/
所以相對路徑中開頭的”/”即表示:http://127.0.0.1:8080/專案名稱/
可以看出,由伺服器解析的根路徑比由瀏覽器解析的多出一個”專案名稱”節點,因為一個專案的根節點自然是這個專案的名稱嘛。

(2)以路徑名稱開頭的相對路徑
路徑名前面的空白是預設的該資原始檔的參照路徑。除了請求轉發外,其他的路徑跳轉方式的參照路徑都是其絕對資源路徑,不管是瀏覽器解析還是由伺服器解析。

response 的sendRedirect() 方法可以完成重定向,其意思是讓瀏覽器按照其指定的路徑重新發一次請求,所以顯然裡面的路徑自然由瀏覽器來解析,是前臺路徑。其引數路徑開頭的”/”表示當前web伺服器的根。故此,此方法不僅僅可以實現在專案內部資源的跳轉,還可以實現在實現在專案之間的跳轉。
可以這樣訪問當前專案的其他資源:
response.sendRedirect(request.getContextPath()+”/otherServlet”);

總結:
1、如果使用多次”../”,最多返回至根目錄。
如果是由瀏覽器解析,則最多返回到web伺服器的根目錄所在的路徑,比如tomcat中的”…./webapps/”。
如果是由伺服器解析,則最多返回到專案的根目錄”webapp/”所在的路徑,對應於釋出後的路徑”…./專案名/”,因為在伺服器中不可能跳出該專案的範圍。
專案釋出後的路徑中的節點 “專案名稱” 對應於未釋出前的webapp(WebRoot,WebContent)目錄。
2、請求轉發request.getRequestDispatcher(“路徑名”).forward(request,response)中的路徑一定是由伺服器進行解析,因為它是在Java程式碼中。如果請求的資原始檔中進行了轉發,則在下一個資原始檔中,由瀏覽器解析的路徑的參照路徑是上一個資原始檔的參照路徑,以此類推。
3、和瀏覽器解析不同,不管是請求轉發還是其他的資原始檔之間的跳轉,由伺服器進行解析的路徑的當前路徑(參照路徑)一定是該檔案的絕對資源路徑。
4、除了請求轉發,好像其他所有的路徑跳轉都是由瀏覽器來解析。
**5、**web.xml中的標籤包含的是一個相對訪問路徑,它的參照路徑是專案的根路徑”…./專案名/”,對應於專案結構的”webapp”目錄,可以把多重資料夾裡的頁面作為首頁。該標籤的原理利用了請求轉發,當客戶端請求該專案,也就是我們經常輸入專案名來訪問該專案的首頁時,請求來到了該專案的根目錄”/專案名”,即當前的參照路徑是根目錄,隨後標籤轉發該請求到其包含的資原始檔,該路徑名是由伺服器解析的,所以伺服器找到了標籤中包含的資原始檔返回給瀏覽器。由於是轉發,所以有瀏覽器解析的當前路徑仍然保留在專案的根路徑,所以我們看到瀏覽器的位址列中的路徑是專案的根路徑。
**6、**src下的資源全都放在了WEB-INF目錄下的classes資料夾裡,WEB-INF目錄下的檔案只有伺服器端才可以訪問,之所以能夠直接訪問WEB-INF目錄下的action或controller,是因為已經在配置檔案中(Servlet或者DispatcherServlet)對請求進行了對映處理。對映後的當前路徑是action(controller)所在的絕對資源路徑,action(controller)是直接放在根目錄下面的,即它的當前路徑是(…/專案名/)
(猜的,因為我們可以在瀏覽器的位址列中直接輸入專案名+具體的action訪問該action,並且action的父級目錄只能是專案名目錄,此外在action中以相對路徑的方式訪問專案中其他資原始檔時的參照路徑是專案根目錄。可是action不是放在WEB-INF下的class資料夾裡的嗎?WEB-INF資料夾到底是怎樣的一個特殊資料夾?)。
7、既然無法從外面直接獲取WEB-INF資料夾中的資源,那麼WEB-INF資料夾中的資源可以以相對路徑的方式訪問WEB-INF資料夾外面的資源嗎?
答案是可以的。既可以通過伺服器解析跳轉也可以通過瀏覽器解析跳轉,通過伺服器解析跳轉就不說了,根據絕對資源路徑;通過瀏覽器解析路徑跳轉時的當前路徑是專案的根目錄所在的路徑(可能跳轉到該資源的方式是請求轉發,所以保留了原來的參照路徑),和action一樣似乎都是直接放在根目錄下,但是它不像action可以直接從瀏覽器端訪問,應該是沒有進行對映的原因。總之,它能
以瀏覽器解析的方式跳轉出WEB-INF目錄,但不能以瀏覽器解析的方式跳轉進WEB-INF目錄,只能通過請求轉發(伺服器解析)或者action跳轉進來。