由JSP文件生成的HTML页面中的所有相对URL都是相对于当前请求URL(即在浏览器地址栏中看到的URL),而不是相对于服务器端JSP文件位置,这一点可能与您的期望不同。实际上,需要通过URL单独下载这些资源的是Web浏览器,而不是从磁盘中将它们包含到Web服务器中。
除了更改相对URL以使它们相对于Servlet的URL而不是JSP文件位置之外,另一种解决此问题的方法是使它们相对于域根(即以/
开头)。这样,当您更改Servlet的URL时,就无需担心再次更改相对路径。
<head>
<link rel="stylesheet" href="/context/css/default.css" />
<script src="/context/js/default.js"></script>
</head>
<body>
<img src="/context/img/logo.png" />
<a href="/context/page.jsp">link</a>
<form action="/context/servlet"><input type="submit" /></form>
</body>
然而,您可能不想硬编码上下文路径。这是非常合理的。您可以通过EL获取上下文路径:${pageContext.request.contextPath}
。
<head>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/default.css" />
<script src="${pageContext.request.contextPath}/js/default.js"></script>
</head>
<body>
<img src="${pageContext.request.contextPath}/img/logo.png" />
<a href="${pageContext.request.contextPath}/page.jsp">link</a>
<form action="${pageContext.request.contextPath}/servlet"><input type="submit" /></form>
</body>
(which可以通过
<c:set var="root" value="${pageContext.request.contextPath}" />
轻松缩短,并在其他地方使用
${root}
)
或者,如果你不害怕无法阅读的XML和损坏的XML语法高亮,请使用JSTL<c:url>
:
<head>
<link rel="stylesheet" href="<c:url value="/css/default.css" />" />
<script src="<c:url value="/js/default.js" />"></script>
</head>
<body>
<img src="<c:url value="/img/logo.png" />" />
<a href="<c:url value="/page.jsp" />">link</a>
<form action="<c:url value="/servlet" />"><input type="submit" /></form>
</body>
无论如何,如果您有很多相对URL,这会变得非常麻烦。为此,您可以使用<base>
标签。所有相对URL将立即变成相对于它的URL。但是,它必须以方案(http://
,https://
等)开头。在普通EL中没有简洁的方法来获取基本上下文路径,因此我们需要JSTL的一些帮助。
<%@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="uri" value="${req.requestURI}" />
<c:set var="url">${req.requestURL}</c:set>
...
<head>
<base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/" />
<link rel="stylesheet" href="css/default.css" />
<script src="js/default.js"></script>
</head>
<body>
<img src="img/logo.png" />
<a href="page.jsp">link</a>
<form action="servlet"><input type="submit" /></form>
</body>
这反过来(再次)有一些注意事项。锚点(#identifier
URL)也将相对于基本路径!您希望它相对于请求URL(URI)而不是基本路径。因此,请进行更改,如下:
<a href="#identifier">jump</a>
为了
<a href="${uri}#identifier">jump</a>
每种方法都有其优缺点。选择哪种方法取决于您。至少,现在您应该了解如何引起此问题以及如何解决它 :)
另请参阅:
/*
,但如果您正在尝试创建一种前置控制器,我建议您阅读这个答案,也许还有这个答案。 - BalusC