web應用下絕對路徑和相對路徑問題
阿新 • • 發佈:2019-01-26
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的路徑。而寫絕對路徑就沒問題,顧名思義,絕對定位,不是相對的。
<servlet-mapping>
<servlet-name>getinRegisterServlet</servlet-name>
<url-pattern>/getinRegister</url-pattern>
</servlet-mapping> >其他定製標籤 web應用中的“絕對路徑”是指相對於工程根目錄的路徑 request.getContextPath()可獲得
路徑應該怎麼寫 ? 上面的/代表的是被解析完成後路徑的第一個/ 把所有非字串的的東西全部轉化為字串後,才開始解析第一個/
例如:<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的路徑。而寫絕對路徑就沒問題,顧名思義,絕對定位,不是相對的。