1. 程式人生 > >web應用下絕對路徑和相對路徑問題

web應用下絕對路徑和相對路徑問題

web 中的  /  到底代表什麼?      >超連結:<a href="/TestServlet">Java Web</a><br><br>     此時相當於:http://localhost:8080/TestServlet  此時是不能連線到servlet的,因為servlet不是直接部署tomcat的webapps目錄下,正確的方式應該加上工程路徑,即為:http://localhost:8080/shipin/TestServlet   。     >表單中的action:<form action="/login.jsp" >   此時相當於:
http://localhost:8080/longin.jsp
  此時也是不能連線到servlet的,,同上。
    >請求重定向: request.sendRedirect("/login.jsp") 此時相當於: http://localhost:8080/longin.jsp 原理同上,瀏覽器直接更換網址 2.若/交由web伺服器來解析代表當前web工程的根路徑。例:/shipin/    (shipin即工程名)     >請求轉發時:request.getRequestDispatcher("/chapter.jsp").forward(request, response);  此時相當於:
    >web.xml 中對映servlet的訪問路徑時
         <servlet-mapping>
                <servlet-name>getinRegisterServlet</servlet-name>
                <url-pattern>/getinRegister</url-pattern>
         </servlet-mapping>     >其他定製標籤 web應用中的“絕對路徑”是指相對於工程根目錄的路徑 request.getContextPath()可獲得
此時的路徑在工程目錄下,例:/shipin
路徑應該怎麼寫 ? 上面的/代表的是被解析完成後路徑的第一個/ 把所有非字串的的東西全部轉化為字串後,才開始解析第一個/
例如:<a href="<%=request.getContextPath()%>/Test3Servlet">   裡面有方法,全部轉化為字串後為"/shipin/Test3Servlet" 然後開始解析/ 如上,這裡/應該被解析為web站點的跟目錄即http://localhost:8080/  ,解析完後即為完整的url,http://localhost:8080/shipin/Test3Servlet, 正確理解web各個場景路徑的/的含義後 該怎麼判斷寫的路徑對不對: 步驟:1.把你寫的路徑當中所有非字串(例如函式)的東西都轉化為字串             2.按照上文中,/到底代表什麼,把第一個/解析替換出來             3.判斷最終的解析結果是不是一個完整正確的工程目錄,完整正確的工程目錄應該是:htttp://localhost:8080/工程名/檔案的完整目錄(包括資料夾)例:若目標jsp檔案在webContent目錄下的Get資料夾下,則正確路徑為:htttp://localhost:8080/ship/Get/login.jsp web應用中的“絕對路徑”是指相對於工程根目錄的路徑 request.getContextPath()可獲得 此時的路徑在工程目錄下,例:/shipin 相對路徑是指,相對於一個檔案或資料夾的路徑 設當前檔案(即程式碼執行到哪個檔案)為a.jsp,相對路徑的作用範圍: 若c.jsp處於與當前檔案同一級目錄:c.jsp 若c.jsp處於與當前檔案同一級目錄的資料夾下:/資料夾名/c.jsp
若c.jsp處於與當前檔案上一級目錄:../c.jsp
最好寫絕對路徑getContextPath() + 具體檔案相對於工程的資料夾路徑,不容易出錯。
絕對路徑的反例: 把所有非字串的的東西全部轉化為字串後,才開始解析第一個/,,非常重要,舉個反例,request.getRequestDispatcher(request.getContextPath()+"/Test3Servlet").forward(request,response);
此例咋一看沒啥問題,但是,先來看,把非字串轉化字串後:/shipin/Test3Servlet,然後解析/,這是轉發,/應該被解析為:/shipin/,然後最終路徑就變成了:/shipin/shipin/Test3Servlet,只要/還可以解析,就會向上解析,最終變成了http://localhost/8080/shipin/shipin/Test3Servlet,顯然這是錯誤的。這裡就不能加上request.getContextPath(),只要request.getRequestDispatcher("/Test3Servlet").forward(request,response); 則/Test3Servlet被解析為/shipin/Test3Servlet,然後/shipin/Test3Servlet又被解析為http://localhost/8080/shipin/Test3Servlet.
相對路徑的反例: 從一個a.jsp提交請求到personServlet再轉發到b.jsp,當到了personServlet時,此時的當前檔案就是personServlet,所以要以personServlet為當前目錄去定位b.jsp,即便a.jsp和b.jsp在同一目錄下,也不能就寫:b.jsp,而要寫相對於personServlet的路徑。而寫絕對路徑就沒問題,顧名思義,絕對定位,不是相對的。