向東博客

          非澹泊無以明志,非寧靜無以致遠.
          posts - 12,  comments - 19,  trackbacks - 0

          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 樣式了。

          ?

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

          posted on 2006-10-10 08:57 向東博客 閱讀(3795) 評論(2)  編輯  收藏 所屬分類: 開發技巧

          FeedBack:
          # re: JSP、Servlet中的相對路徑和絕對路徑
          2007-02-23 10:47 | yangdamao
          路徑問題把我給繁死了.
          非常感謝,說的通俗易懂!
          你去當老師應該是一個很不錯的老師!  回復  更多評論
            
          # re: JSP、Servlet中的相對路徑和絕對路徑[未登錄]
          2008-10-22 08:32 | jason
          以前一直搞.net,最近轉到java,一開始就是這個路徑問題,昨天晚上搞了整整一個晚上,也沒弄出來,今天早上簡單的一看,就明白了,太感謝樓主了  回復  更多評論
            







          留言簿(3)

          我參與的團隊

          隨筆分類

          在線文檔

          網站

          最新隨筆

          積分與排名

          • 積分 - 58221
          • 排名 - 895

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 静安区| 塔城市| 昭通市| 三穗县| 团风县| 仪陇县| 陇西县| 阿拉尔市| 肥乡县| 图木舒克市| 泰州市| 安陆市| 上高县| 苏尼特左旗| 东源县| 和林格尔县| 乌什县| 溆浦县| 顺义区| 田阳县| 阿巴嘎旗| 洛隆县| 长海县| 大余县| 兴义市| 常州市| 扶绥县| 舟曲县| 吴桥县| 隆化县| 柳河县| 江北区| 马尔康县| 营口市| 衢州市| 冀州市| 娱乐| 岑巩县| 社旗县| 福州市| 玉田县|