JSP、Servlet中的相對路徑和絕對路徑 頁面跳轉問題

來源:互聯網
上載者:User

1.JSP、Servlet中的相對路徑和絕對路徑 

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

   
  web應用的目錄結構:

   test/web/

     css/
     js/

        test.js

     web-inf/
       classes/
       lib/
       user/
         a.jsp
         b.jsp
       images/      
       web.xml
         <servlet-mapping>
           <servlet-name>handleservlet</servlet-name>
           <url-pattern>/handleservlet</url-pattern>此映射是相對於當前web應用的
         </servlet-mapping>
  。如:/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處於 。
    ../one.css:表示one.css位於a.hmtl上一級目錄下,
    ../../one.css:表示one.css位於a.hmtl上一級目錄的上一級目錄下,
    ./:表示和a.hmtl同一目錄 
  我們稱上述相對路徑為


  1、 伺服器端的地址
  伺服器端的相對位址指的是相對於你的web應用的地址, (不同於 )也就是說這時候在jsp和servlet中的相對位址應該是相對於你的web應用,即相對於http://192.168.0.1/test/的。
  其用到的地方有:
     forward:servlet中的request.getRequestDispatcher(address);這個address是在伺服器端解析的,所以,你要forwarder到user/a.jsp應該這麼寫:request.getRequestDispatcher("")這個/相對於當前的web應用test,其絕對位址就是:
     redirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>

  2、 用戶端的地址
  所有的html中的相對位址都是 。
  Html中的form表單的action屬性的地址應該是相對於http://192.168.0.1/的,所以,如果提交到user/a.jsp為:action=" user/a.jsp" ;提交到servlet為action="/test/handleservlet"
 

  3、 網站根目錄和css路徑問題 
  我們稱類似這樣的相對路徑 為相對於 。
  當在jsp中引入css時,如果其相對路徑相對於當前jsp檔案的,而在一個和這個jsp的路徑不一樣的servlet中forward這個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的相對路徑了,因為 ,所以這樣的引用肯定是出錯的。
  所以這個時候,要用網站根目錄,就是相對於http://192.168.0.1/的目錄,以“/”開頭。
  因此上述錯誤應更正為 類似的網站根目錄的相對目錄。這樣在servlet轉寄後和jsp中都是 ,就能正確使用所定義的css樣式了。

 

頁面跳轉問題:

 

高,  低, 因為的流程是這樣的,  request1  sent to server,  server return back to client, 然後

request2 then sent to server. 但是僅在server side處理, 對client side 是透明的. 由於有兩次傳輸, 所以效率低.

範圍:
由於對request.setAttribute() 來說, 它攜帶的對象生存範圍只在request內, 所以方式會導致request攜帶的對象丟失.

 

使用說明:

1. sendRedirect

     servlet和jsp裡面一樣

     response.sendRedirect(); 

 

2. include  這種也是上面提到的forward形式,

    1)  servlet裡面

    request.getRequestDispatcher( "jsp2.jsp" ).include(request,   response);  

    2)  jsp裡面

    <jsp:include page= "include.jsp" />

說明
頁面會同時包含頁面1和頁面2的內容,地址欄不變。
使用request.setAttribute的內容,可以正常使用

 

3. forword

    1)  servlet裡面

    request.getRequestDispatcher( "jsp2.jsp" ).forward(request,   response); 
    2)  jsp裡面

    <jsp:forward page= "include.jsp" />

說明
頁面會是頁面2的內容,地址欄不變
使用request.setAttribute的內容,可以正常使用


3.JSP中用相對路徑引用JS,CSS檔案的三種情況

  第一種情況 最常見的情況
   一個tomcat上都跑多個工程, 用工程名來區分
   因為我的的URL是 :http://localhost/工程名 /home/index.jsp
   多了一個工程名,所以要加 <%=request.getContextPath() %>
   如:<script src="request.getContextPath() %> /home/test.js"></script>

  寫request.getContextPath() %>太麻煩,可以在每一個jsp檔案頂部加入以下內容後,

   Java代碼 
  1. <%   
  2. String path = request.getContextPath();   
  3. String basePath = request.getScheme()++request.getServerName()++request.getServerPort()+path+;   
  4. %>   
  5. <base href=>  

/home/test.js"></script>了

 

   第二, 直接存取jsp檔案

   真實項目中, 一個tomcat上要是也跑了多個工程, 並用IP來區分
   url 是這樣的: http://localhost/home/index.jsp     。
   test2.js 與index.jsp 放在同一檔案夾下,下面用相對路徑來引入JS檔案 是OK 的:
 < script src=test2.js></script>

   index.jsp可以找到test2.js檔案

 

   第三種情況: servlet轉寄到jsp(jsp在web-inf下,必須用servlet或action訪問)

   在第二情況的基礎上,一個tomcat上要是也跑了多個工程, 並用IP來區分。

   我們訪問的是 或是struts的index.jsp
    url 是:

    url 是:

    這裡不是訪問JSP檔案了

 

    下面是OK 的.
    < script src= test2.js></script>

    test2.js 前面一定要有/home/

    實際項目中, 訪問 servlet或是struts的action最多, 所以這裡要使用<script src=/home/test2.js></script>。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.