Html/Jsp頁面中的路徑,是供瀏覽器使用的。“/”代表的是服務器根目錄,一個服務器會有多個web應用,所以請求資源時需要加應用名才能正確訪問。
頁面中使用的相對路徑,也是由瀏覽器根據當前頁面的url或<base>元素解析成完整請求路徑的。
頁面中使用路徑的常用方式如下:
1.當前應用的根路徑+靜態資源的相對路徑:
<link type="stylesheet" href="${pageContext.request.contextPath}/satic/ css/common.css"> <form action="${pageContext.request.contextPath}/servlet/login" method="post">
瀏覽器解析時會將”/”解析為服務器。如果不加當前應用的根路徑,有可能會錯誤地把static當作應用名,取決於部署時path的設置。所以最好統一添加應用的根路徑。
獲取當前應用的根路徑:
EL表達式:${pageContext.request.contextPath};
JSP:<% =request.getContextPath() %>
若工程文件就是在根目錄下,通過request.getContextPath()返回的字符串為空。
2.當前應用的絕對路徑+靜態資源的相對路徑:
<%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=gbk" isELIgnored="false"%> <% String appContext= request.getContextPath();// 獲取當前應用的根路徑構建當前應用的絕對路徑(/appName) String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + appContext ; // 將basePath存入pageContext中,將來用EL表達式讀取 pageContext.setAttribute("basePath",basePath); %> <html> <body> <a href="${pageScope.basePath}/jsp/login.jsp"> </body> </html>
缺點:每個請求前都要加${pageScope.basePath}
3.利用<base>標簽
默認情況下,頁面中相對路徑的請求都是相對於當前頁面的url發出的;如果當前頁面存在<base>標簽,則請求是相對<base>中設定的值。
<%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=gbk" isELIgnored="false"%> <% String appContext= request.getContextPath();// 獲得當前應用的根路徑 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort() + appContext ; %> <html> <head> <base href="<%=basePath%>"> <!--設定base標簽--> </head> <body> <a href="/jsp/login.jsp">Login</a> </body> </html>
缺點: 對於被包含的文件依然無效。
Servlet內所有的路徑都要用絕對路徑,即以”/”開頭,代表當前的web應用。
req.getRequestDispatcher("/pages/login.jsp").forward(req, resp);轉發路徑中”/”代表當前應用。