web開發中的路徑

GM的春天發表於2016-10-10

路徑問題在Web開發中算是令人比較蛋疼的問題,尤其是用相對地址時,同樣的程式碼,在不同的目錄結構中竟然會出現有對有錯的結果,讓人茫然不知所措。這種錯誤,究其原因,還是對Web中路徑的概念一知半解,為徹底避免這種錯誤,提高開發效率,這裡對Web中路徑問題稍作總結。

 

1. 伺服器端的相對地址
   

    是在伺服器端解析的,是相對於web應用的地址
    servlet中的相對地址應該是相對於web應用,即相對於http://localhost:8080/webapp/

 

2. 重定向的路徑問題


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


    sendRedirect跳轉: response.sendRedirect(address);這個address是在客戶端解析的,要跳轉到a.jsp,應該這麼寫:response.sendRedirect("/webapp/user/a.jsp");
 
3. 客戶端的相對地址


    所有的html中的相對地址都是相對於http:// localhost:8080 / 的,而不是http:// localhost:8080 /webapp/ 的。 
    Html中的form表單的action屬性的地址應該是相對於http:// localhost:8080 / 的。

    所以,如果提交到a.jsp為:action="/webapp/user/a.jsp";提交到servlet為action="/webapp/handleservlet" 
    Javascript也是在客戶端解析的,所以其相對路徑和form表單一樣。

 

4. 兩種相對路徑
 
    相對於根目錄的路徑:

    /jsp/path/pathTest.jsp  
    在伺服器端解析為絕對路徑為:http://localhost:8080/webapp/jsp/path/pathTest.jsp  
    在客戶端解析為的絕對路徑為:http://localhost:8080/jsp/path/pathTest.jsp

 

    相對於當前目錄的路徑:  

    jsp/path/pathTest.jsp   
    當前目錄的路徑為http://localhost:8080/webapp/jsp/path ,

    那麼絕對路徑為:http://localhost:8080/webapp/jsp/path/jsp/path/pathTest.jsp

  
5. 站點根目錄和css路徑問題


    當在jsp中引入css時,如果其相對路徑相對於當前jsp檔案的,會正常找到相應的css
    但是如果從一個和當前jsp的路徑不一樣的Servlet中forward到這個jsp時,當前的相對路徑是哪個Servlet的相對路徑,而不是jsp所在的路徑,這時不能在jsp中用這樣的路徑:<link href="css.css" rel="stylesheet" type="text/css">或者<link href="../../css.css" rel="stylesheet" type="text/css">。

    這中情況下,要用站點根目錄來引用css檔案,就是相對於http://ip/ 的目錄,以"/"開頭,即href="/webapp/css.css"。這樣在servlet轉發後和jsp中都是相對於站點根目錄的相對路徑,就能正確使用所定義的css樣式了。

    也可以理解為在客戶端(jsp/html檔案中),引用檔案時,都要用/wabapp/***開頭,因為客戶端的相對地址是http://localhost:8080/

 

6. servlet中幾個獲取路徑方法的對比

    對於url: http://localhost:8080/webapp/blog/list

    那麼分別呼叫request.getContextPath( )、request.getServletPath( ) 、 request.getURI( )、request.getURL( )分別返回什麼路徑?

 

    這幾個方法都是在HttpServletRequest介面中定義的。

    

    1). request.getContextPath( )返回web應用程式的路徑,上例中該方法將返回/webapp;

    2). request.getServletPath( ) 返回Servlet的路徑。上例中該方法將返回/blog/list;

    3). request.getRequestURL( )返回請求的URL,上例中即為http://localhost:8080/webapp/blog/list ;

    4). request.getRequestURI( )返回HTTP請求行中請求URI的部分。上例中該方法將返回/webapp/blog/list.

            

 

*注:事例所用伺服器埠號為8080,webapp是web工程名字

相關文章