Web应用程序名称(实际上是上下文路径)可以通过调用获得HttpServletrequest#getContextPath()
(因此不能getServletPath()
像以前建议的那样使用)。您可以通过在JSP中通过检索${pageContext.request.contextPath}
。
<p>The context path is: ${pageContext.request.contextPath}.</p>
如果您打算将其用于JSP页面中的所有相对路径(这会使这个问题更有意义),则可以使用HTML <base>
标记:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="url">${req.requestURL}</c:set>
<c:set var="uri" value="${req.requestURI}" />
<!doctype html>
<html lang="en">
<head>
<title>SO question 2204870</title>
<base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/">
<script src="js/global.js"></script>
<link rel="stylesheet" href="css/global.css">
</head>
<body>
<ul>
<li><a href="home.jsp">Home</a></li>
<li><a href="faq.jsp">FAQ</a></li>
<li><a href="contact.jsp">Contact</a></li>
</ul>
</body>
</html>
页面中的所有链接将自动相对于,<base>
因此您无需在所有位置复制粘贴上下文路径。请注意,当相对链接以开头时/
,它们将不再相对于<base>
,而是相对于域根。
ServletContext.getContextPath()
应被视为应用程序的主要或首选上下文路径”。这就是我在意识到这一点之后将其包含在原始答案中的原因。我没有删除我的第一次尝试,因为我希望OP考虑阅读文档并对相关方法有所了解。我希望你明白我的意思。