1. 程式人生 > >相對路徑、絕對路徑、部署路徑(html/css/servlet/jsp)

相對路徑、絕對路徑、部署路徑(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),其中的引數應該是以"/"開頭的絕對路徑,其中"/"表示應用的根。