jsp路徑basepath的作用

來源:互聯網
上載者:User
  • JSP路徑basePath的作用(本文為轉載的文章,文章轉自:http://yonglailizhi.iteye.com/blog/719924

  • 在JSP中的如果使用 "相對路徑"  則有可能會出現問題.    
  •   
  • 因為 網頁中的 "相對路徑" , 他是相對於 "URL請求的地址" 去尋找資源.    
  •   
  • 上面這句話是什麼意思呢 ?    
  • 舉個例子:    
  • 假如我們有一個項目: MyApp    
  • 在該項目下, 有一個jsp檔案夾    
  • 該檔案夾下包括:    
  • login.jsp    // 登陸頁面    
  • register.jps  // 註冊頁面    
  •   
  • 我們在瀏覽器中輸入地址 (注意: 地址的內容):    
  • http://localhost:8080/MyApp/jsp/login.jsp    
  • 這時候, 瀏覽器會連結到 "登陸頁面" (login.jsp)    
  • 在login.jsp檔案內包含了如下 "部分代碼":    
  • <a href="jsp/register.jsp">註冊使用者 </a>    
  •   
  • 那麼,如果我們點擊這個連結,就會在瀏覽器地址欄中, 出現如下錯誤連結:    
  • http://localhost:8080/MyApp/jsp/jsp/register.jsp    
  •   
  • 看~~    
  • 為什麼會出現"/jsp/jsp/register.jsp"呢?    
  • 因為, 網頁中的"相對連結", 是相對於你所 "請求的URL路徑" 所決定的.    
  •   
  • 即:    
  •   
  • 因為這裡請求路徑是:http://localhost:8080/MyApp/jsp/login.jsp    
  •   
  • 那麼, 瀏覽器 就會在這個路徑下(即:http://localhost:8080/MyApp/jsp/)去找 jsp/register.jsp    
  • 所以就會出現如下錯誤內容:    
  • http://localhost:8080/MyApp/jsp/jsp/register.jsp    
  •   
  • 上面的問題,就是調用頁面和被調用頁面的URL不同所造成的,    
  • 此類錯誤也常常會出現在2個頁面之間進行 "轉寄"(forward) 操作的時候。    
  • 因為forward是在後台進行的,對用戶端來說是透明的。(即: URL不改變,而資料內容卻是另一個頁面返回來的。。。)    
  •   
  •   
  • 那麼如何解決這問題呢?    
  •   
  • (一)方法一:直接採用絕對路徑 (不推薦)    
  • 在JSP頁面端,獲得本項目的絕對位址(如果你的項目叫MyApp,那麼獲得到的地址就是 http://localhost:8080/MyApp/):    
  • 代碼如下:    
  • <!-- **************方法一***************** -->    
  • <%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=gbk" isELIgnored="false"%>    
  • <%    
  • String path = request.getContextPath();    
  • // 獲得本項目的地址(例如: http://localhost:8080/MyApp/)賦值給basePath變數    
  • String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";    
  • // 將 "項目路徑basePath" 放入pageContext中,待以後用EL運算式讀出。    
  • pageContext.setAttribute("basePath",basePath);    
  • %>    
  • <html>    
  • <head> </head>    
  • <body>    
  • <a href="${pageScope.basePath}jsp/register.jsp">    
  • </body>    
  • </html>    
  • <!-- *************************************-->    
  •   
  • 我們可以看到,在標籤 <a>中的href屬性內,我們直接採用了    
  • “本項目路徑 ${pageScope.basePath}” 加上 "jsp/register.jsp" ,    
  • 從而構成一個絕對路徑(即: http://localhost:8080/MyApp/jsp/register.jsp)    
  •   
  • 但是這樣做有一個很不好的地方,那就是我們必須要在每個連結的前面都要加上 “${pageScope.basePath}”    
  • 如果這樣做的話,將是一件很可怕的事情。    
  •   
  • (二)方法二: 利用html中的 <base>標籤(推薦)    
  • 下面是對html中的 <base>的介紹:    
  • base 元素可規定頁面中所有連結的基準 URL    
  • 預設情況下,頁面中的連結(包括樣式表、指令碼和映像的地址)都是相對於當前頁面的地址(即:瀏覽器地址欄裡的請求URL)。    
  • 我們可以使用 <base>標籤中的href屬性來設定,所有的“相對基準 URL”。    
  •   
  • 上面說的是什麼意思呢?我們來看看代碼就知道咯~~    
  •   
  • 這是JSP端的代碼    
  • 下面的代碼 (十分類似上面 "方法一" 中的JSP代碼)    
  • 但是這裡我們並沒有採用 ${pageScope.basePath}+"相對路徑地址" 的方法,    
  • 而是採用了html檔案中的 <base>標籤:    
  • 代碼如下:    
  • <!-- *************JSP代碼******************-->    
  • <%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=gbk" isELIgnored="false"%>    
  • <%    
  • String path = request.getContextPath();    
  • // 獲得項目完全路徑(假設你的項目叫MyApp,那麼獲得到的地址就是 http://localhost:8080/MyApp/):    
  • String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";    
  • %>    
  • <html>    
  • <head>    
  • <!-- base需要放到head中 -->    
  • <base href=" <%=basePath%>">    
  • </head>    
  • // 這裡我們就可以直接使用相對路徑(即: 相對於base標籤)    
  • <a href="jsp/login.jsp">Login </a>    
  • </html>    
  • <!-- *************************************-->    
  •   
  • 大概看完了上面的代碼,或許您還是有些疑惑 *_*~~    
  • 不過當您看到了,下面的代碼,可能就豁然開朗了 (*^__^*) 嘻嘻……。    
  •   
  • 當我們去執行上面的那段JSP代碼後,我們可以在瀏覽器中可以查看,他所返回給用戶端的html代碼:    
  • 執行完上述JSP後,所返回的html代碼如下:    
  • <html>    
  • <head>    
  • <base href="http://localhost:8080/MyApp/">    
  • </head>    
  • // 設定了 <base>後,相對路徑,相對於的就是base中的路徑,而不再是瀏覽器地址的請求路徑啦~~~    
  • <a href="jsp/login.jsp">Login </a>    
  • </html>    
  •   
  • 我們可以看到JSP返回的html代碼中,包含了 <base href="http://localhost:8080/MyApp/">內容。    
  • 也就是說,在本html檔案中,遇到的所有 “相對連結(例如: <a href="jsp/login.jsp">)”,都是相對於base    
  • 的路徑(即:http://localhost:8080/MyApp/),所以我們就可以進行的使用 相對連結,而不必擔心,    
  • 轉寄操作(forward)或 請求地址不同不同所造成的頁面無法找到的錯誤啦~(即: HTTP: 404)。。。
  • 文章轉自:http://yonglailizhi.iteye.com/blog/719924
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.