天天看點

相對路徑、絕對路徑、部署路徑(html/css/servlet/jsp) 相對路徑、絕對路徑、部署路徑(html/css/servlet/jsp)

相對路徑、絕對路徑、部署路徑(html/css/servlet/jsp)

轉自:http://www.cnblogs.com/mailingfeng/archive/2012/02/23/2365155.html

當在進行前背景整合的時候,往往會出現路徑不統一或者路徑錯誤的情況,結果就是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以及得到的結果

相對路徑、絕對路徑、部署路徑(html/css/servlet/jsp) 相對路徑、絕對路徑、部署路徑(html/css/servlet/jsp)
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  (因為這裡的場景是把整個應用伺服器當成一個應用,是以應用上下文為"")      
相對路徑、絕對路徑、部署路徑(html/css/servlet/jsp) 相對路徑、絕對路徑、部署路徑(html/css/servlet/jsp)

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

繼續閱讀