1. 程式人生 > >JavaWeb中的絕對路徑和相對路徑

JavaWeb中的絕對路徑和相對路徑

前段時間自己也剛好遇到了這個問題,把相對路徑改成絕對路徑就沒問題了,今天覆習到這裡就稍微總結一下。

使用絕對路徑:使用相對路徑可能會有問題, 但使用絕對路徑肯定沒有問題. 

一、下面先用一個小專案來說事,目錄結構如下:


a.jsp:
<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>
這樣上面的錯誤就解決了。