JavaWeb中的絕對路徑和相對路徑
阿新 • • 發佈:2019-01-11
前段時間自己也剛好遇到了這個問題,把相對路徑改成絕對路徑就沒問題了,今天覆習到這裡就稍微總結一下。
使用絕對路徑:使用相對路徑可能會有問題, 但使用絕對路徑肯定沒有問題.
<a href="path/b.jsp">去BBB介面</a>
b.jsp
<a href="c.jsp">去CCC介面</a>
c.jsp
<a href="../a.jsp">去AAA介面</a>
這樣寫的話,肯定是能a到b,b到c,現在,我們用個TestServlet來處理a.jsp的請求.
a.jsp:
<a href="TestServlet">去BBB介面</a>
TestServlet中doGet()方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//模擬從資料庫中查詢資料
List<String> cities = Arrays.asList("樟村","玉山","上饒");
request.setAttribute("cities", cities);
//通過轉發的方式響應/path/b.jsp
request.getRequestDispatcher("/path/b.jsp").forward(request, response);
}
返回到的b.jsp接收轉發過來的資訊:
城市:<%=request.getAttribute("cities") %>
這樣a.jsp能到b.jsp,此時瀏覽器位址列上顯示的是Servlet的路徑,而jsp頁面的超連結還是相對於改jsp頁面的地址,則可能會出現路徑混亂的問題。
a.jsp--->/TestServlet --轉發--->b.jsp(有一個超連結:和b.jsp在同一路徑下的c.jsp)--->無法得到頁面
該如何解決呢?肯定是要說到絕對路徑了
二、編寫絕對路徑來避免上面的問題
1、在javaweb中什麼叫“絕對路徑”
相對於contextPath的路徑。即任何的路徑都必須帶上contextPath
比如:http://localhost:8080/contextPath(當前WEB應用的上下文路徑)/a.jsp
2、如何解決呢?
1)這裡我們要先提一下JavaWeb開發中的"/"到底表示什麼
①當前WEB應用的根路徑:http://localhost:8080/contextPath/ :若 / 交給servlet容器來處理
--請求轉發時:request.getRequestDispatcher("/path/b.jsp").forward(request, response);
--web.xml檔案中對映servlet訪問路徑
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
②、WEB站點的根路徑:http://localhost:8080/ :若 / 交給瀏覽器來處理
--超連結:<a href="TestServlet">去BBB介面</a>
--表達中的action:<form action="/test.jsp">
--做請求重定向的時候:response.sendRedirect("/a.jsp")
2)解決方法
如果 / 代表的是站點的根目錄,在其前面加上contextPath,這個contextPath可以由request或application
的getContextPath()方法來獲取。
<a href="<%=request.getContextPath() %>/path/c.jsp">去CCC介面</a>
這樣上面的錯誤就解決了。
使用絕對路徑:使用相對路徑可能會有問題, 但使用絕對路徑肯定沒有問題.
一、下面先用一個小專案來說事,目錄結構如下:
<a href="path/b.jsp">去BBB介面</a>
b.jsp
<a href="c.jsp">去CCC介面</a>
c.jsp
<a href="../a.jsp">去AAA介面</a>
這樣寫的話,肯定是能a到b,b到c,現在,我們用個TestServlet來處理a.jsp的請求.
a.jsp:
<a href="TestServlet">去BBB介面</a>
TestServlet中doGet()方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//模擬從資料庫中查詢資料
List<String> cities = Arrays.asList("樟村","玉山","上饒");
request.setAttribute("cities", cities);
//通過轉發的方式響應/path/b.jsp
request.getRequestDispatcher("/path/b.jsp").forward(request, response);
}
返回到的b.jsp接收轉發過來的資訊:
城市:<%=request.getAttribute("cities") %>
這樣a.jsp能到b.jsp,此時瀏覽器位址列上顯示的是Servlet的路徑,而jsp頁面的超連結還是相對於改jsp頁面的地址,則可能會出現路徑混亂的問題。
a.jsp--->/TestServlet --轉發--->b.jsp(有一個超連結:和b.jsp在同一路徑下的c.jsp)--->無法得到頁面
該如何解決呢?肯定是要說到絕對路徑了
二、編寫絕對路徑來避免上面的問題
1、在javaweb中什麼叫“絕對路徑”
相對於contextPath的路徑。即任何的路徑都必須帶上contextPath
比如:http://localhost:8080/contextPath(當前WEB應用的上下文路徑)/a.jsp
2、如何解決呢?
1)這裡我們要先提一下JavaWeb開發中的"/"到底表示什麼
①當前WEB應用的根路徑:http://localhost:8080/contextPath/ :若 / 交給servlet容器來處理
--請求轉發時:request.getRequestDispatcher("/path/b.jsp").forward(request, response);
--web.xml檔案中對映servlet訪問路徑
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
②、WEB站點的根路徑:http://localhost:8080/ :若 / 交給瀏覽器來處理
--超連結:<a href="TestServlet">去BBB介面</a>
--表達中的action:<form action="/test.jsp">
--做請求重定向的時候:response.sendRedirect("/a.jsp")
2)解決方法
如果 / 代表的是站點的根目錄,在其前面加上contextPath,這個contextPath可以由request或application
的getContextPath()方法來獲取。
<a href="<%=request.getContextPath() %>/path/c.jsp">去CCC介面</a>
這樣上面的錯誤就解決了。