JSP 和 Servlet 中的絕對路徑和相對路徑問題

勸君更盡一杯酒發表於2013-10-15

JSP 和 Servlet 中的絕對路徑和相對路徑問題困擾了我好幾天,經過努力之後將其部分心得和大家共享。

       前提:假設你的 Http 地址為 http://192.168.0.1/ 你的 web 應用為 webapp ,那麼你的 web 應用 URL 為 http://192.168.0.1/webapp/

       web 應用的目錄結構:

       webapp/

              web-inf/

                 classes/

                     lib/

                     web.xml

                              <servlet-mapping>

                               <servlet-name>handleservlet</servlet-name>

                               <url-pattern>/handleservlet</url-pattern> 此對映是相對於當前 web 應用的

                             </servlet-mapping>

              user/

                     a.jsp

                     b.jsp

              images/

              css/

              js/

             

       所有相對路徑都是由“ / ”開頭的。如: /image/a.gif , /user/main.jsp ,大家知道在 html 中的相對路徑是這樣的:

       有個 html 檔案: a.html ,其中有 <link href="one.css" rel="stylesheet" type="text/css"> ,其中 href 屬性表示引用的 css 檔案的路徑。

one.css :表示 one.css 和 a.hmtl 處於同一個目錄

user/one.css :表示 one.css 處於 a.html 所在目錄的子目錄 user 中。

../one.css :表示 one.css 位於 a.hmtl 上一級目錄下,

../../one.css :表示 one.css 位於 a.hmtl 上一級目錄的上一級目錄下,

./ :表示和 a.hmtl 同一目錄

我們稱上述相對路徑為 html 相對路徑

1、 伺服器端的地址

伺服器端的相對地址指的是相對於你的 web 應用的地址,這個地址是在伺服器端解析的(不同於 html 和 javascript 中的相對地址,他們是由客戶端瀏覽器解析的)也就是說這時候在 jsp 和 servlet 中的相對地址應該是相對於你的 web 應用,即相對於 http://192.168.0.1/webapp/的。

其用到的地方有:

forwarder : servlet 中的 request.getRequestDispatcher(address); 這個 address 是在伺服器端解析的,所以,你要 forwarder 到 a.jsp 應該這麼寫: request.getRequestDispatcher(“/user/a.jsp”) 這個 / 相對於當前的 web 應用 webapp ,其絕對地址就是: http://192.168.0.1/webapp/user/a.jsp

sendRedirect :在 jsp 中 <%response.sendRedirect("/rtccp/user/a.jsp");%>

2、 客戶端的地址

所有的 html 中的相對地址都是相對於 http://192.168.0.1/ 的,而不是 http://192.168.0.1/webapp/ 的。

Html 中的 form 表單的 action 屬性的地址應該是相對於 http://192.168.0.1/ 的,所以,如果提交到 a.jsp 為: action = ”/webapp/user/a.jsp”;提交到 servlet 為 action = ”/webapp/handleservlet”

Javascript 也是在客戶端解析的,所以其相對路徑和 form 表單一樣。

3、 站點根目錄和 css 路徑問題

我們稱類似這樣的相對路徑 /webapp/…. 為相對於站點根目錄的相對路徑。

當在 jsp 中引入 css 時,如果其相對路徑相對於當前 jsp 檔案的,而在一個和這個 jsp 的路徑不一樣的 servlet 中 forwarder 這個 jsp 時,就會發現這個 css 樣式根本沒有起作用。這是因為在 servlet 中轉發時 css 的路徑就是相對於這個 servlet 的相對路徑而非 jsp 的路徑了。所以這時候不能在 jsp 中用這樣的路徑: <link href="one.css" rel="stylesheet" type="text/css"> 或者 <link href="../../one.css" rel="stylesheet" type="text/css"> 類似 href="one.css" 和 ../../one.css 的 html 相對路徑是相對於引用這個 css 的檔案的相對路徑。而在 servlet 中轉發時就是相對於這個 servlet的相對路徑了,因為 jsp 路徑和 servlet 路徑是不一樣的,所以這樣的引用肯定是出錯的。

所以這個時候,要用站點根目錄,就是相對於 http://192.168.0.1/ 的目錄,以“ / ”開頭。

因此上述錯誤應更正為 href=”/webapp/one.css” 類似的站點根目錄的相對目錄。這樣在 servlet 轉發後和 jsp 中都是相對於站點根目錄的相對路徑,就能正確使用所定義的 css 樣式了。

 

說了這麼多,不知道你瞭解沒,有什麼問題留言,大家一塊交流!

相關文章