相對路徑、絕對路徑、部署路徑(html/css/servlet/jsp)
當在進行前後臺整合的時候,往往會出現路徑不統一或者路徑錯誤的情況,結果就是css無效、servlet或jsp頁面對映不到。
所以特意對路徑的設定寫一下總結:
這裡只涉及到 web應用的路徑問題, 至於本地系統的路徑不做討論。
1. 路勁可分為 絕對路徑 和 相對路徑
2. 絕對路徑 (開頭帶"/")
前端: http://localhost:8080/myWebApp/user/login.jsp
/myWebApp/user/login.jsp
後端: /user/login.jsp
這裡可以看出一個區別, 其中"/"這個斜槓在前後端有著不同的意義:
前端--> (表示) 伺服器的根路徑(例如:http://localhost:8080/)
後端-->(表示) 應用的根路徑 (例如: http://localhost:8080/yourWebAppName/)
3. 相對路徑 (開頭不帶"/")
舉個例子, 假如當前的路徑是 http://localhost:8080/myWebApp/user/login.jsp
那麼這時候訪問 “main.jsp”頁面,即訪問的是 http://localhost:8080/myWebApp/user/main.jsp
也就是說,使用相對路徑,那麼訪問的是 當前頁面路徑 所屬 目錄 下的檔案路徑。
這個特性無論是在前端 、 後端 都是一樣的。
在java中,無論是JSP或者Servlet , 都可以通過request這個物件獲得requestURL( ) , 該方法返回當前所訪問的頁面的絕對路徑的一個StringBuilder。
應用伺服器正是通過該路徑來得到使用者想要訪問的頁面路徑。
而一般使用forward時,就是通過修改該路徑(無論當前指定的是絕對路徑或者相對路徑),來請求新的路徑。
4. JSP/Servlet中對路徑資訊的獲取的相關API
下面是一個使用jetty作為底層的伺服器。其中存在一個對映為/plugins的servlet
我們訪問的頁面為:http://localhost:9090/plugins/maidatabase/user-vCard-view.jsp
下面是呼叫相關API以及得到的結果
the Base path(scheme+serverName+serverport+requestContext): http://localhost:9090 //應用路徑
request.reqeustURL(): http://localhost:9090/plugins/maidatabase/user-vCard-view.jsp //請求路徑
request.requestURI(): /plugins/maidatabase/user-vCard-view.jsp //請求路徑(相對伺服器根目錄部分)
request.getSession.getServletContext().getRealPath(""): E:\projects\openfire_src\target\openfire\plugins\admin\webapp //根目錄的真實路徑
request.getSession().getServletContext().getResource("/").toString(): file:/E:/projects/openfire_src/target/openfire/plugins/admin/webapp/ //這裡必須要‘/'開頭
request.getServletPath(): /plugins //servlet的對映路徑
the servletContext serverInfo: jetty/7.0.1.v20091125 //伺服器資訊
request.pathInfo() : /maidatabase/user-vCard-view.jsp //請求路徑中位於 servlet路徑 和 查詢資料 之間的 附加路徑資訊
servletContext.getContextPath() : //應用上下文路徑(標準的)
request.getContextPath(): //請求request 所指向的應用上下文路徑 一般為應用路徑,即/yourWebAppName (因為這裡的場景是把整個應用伺服器當成一個應用,所以應用上下文為"")
5. 附帶上別人的文章
這篇文章總結得好,而且很簡練:
1. <form action="abc.do" method="post">*********</form>,並且該頁面的訪問地址是http://localhost:8080/yaso/login
<form action="/abc.do" method="post">*********</form>,並且該頁面的訪問地址是http://localhost:8080/yaso/login
此處可以使用相對路徑或者絕對路徑,其中相對路徑是相對於當前訪問的頁面。當提交表單後,瀏覽器位址列中的資訊變為http://localhost:8080/yaso/abc.do
如果使用絕對路徑,則"/"是指伺服器的根而非應用的根。如果將上述表單改為action="/abc.do",則當提交表單後,瀏覽器位址列中的資訊變為http://localhost:8080/abc.do
如果要使用絕對路徑可以使用getContextPath()方法。
2. 在web.xml中的<servlet-mapping>中的<url-pattern>標記中只能使用絕對路徑,即必須要 以"/"開頭。可以這樣理解:一個應用對應於一個web.xml,所以這裡的絕對路徑表示應用的根,而不是伺服器的根。(一個特殊情況就是 在<url-pattern>中使用模式匹配的*.do,但仍然應該理解成從/開始。)
3.RequestDispatcher view = request.getRequestDispatcher("/abc.jsp");
RequestDispatcher view = request.getRequestDispatcher("abc.jsp");
這裡可以使用相對路徑和絕對路徑。相對路徑是當執行到該程式碼所在的Servlet的時候位址列上顯示的路徑。
如果使用絕對路徑,則"/"表示應用的根。
4.RequestDispatcher view = getServletContext().getRequestDispatcher("/abc.jsp");
這裡必須使用絕對路徑,"/"表示應用的根。可以這麼理解:在ServletContext上呼叫請求轉發,如果使用相對路徑,則無法得知到底相對於該應用的什麼位置,只能根據絕對路徑來判斷。由於是在應用上下文上呼叫的方法,所以"/"就表示應用的根。
5.servletContext中的getResourceAsStream(String),其中的引數應該是以"/"開頭的絕對路徑,其中"/"表示應用的根。