一尘不染

如何在不包含上下文根名称的情况下使用相对路径?

jsp

要处理我的静态文件(CSS,JS),我必须编写绝对路径,例如/AppName/templates/style/main.css。有什么解决办法,我可以写相对路径style/main.css


阅读 321

收藏
2020-06-08

共1个答案

一尘不染

如果您 真正 关心的是webapp上下文的动态性(“
AppName”部分),则只需通过即可动态检索它HttpServletRequest#getContextPath()

<head>
    <link rel="stylesheet" href="${pageContext.request.contextPath}/templates/style/main.css" />
    <script src="${pageContext.request.contextPath}/templates/js/main.js"></script>
    <script>var base = "${pageContext.request.contextPath}";</script>
</head>
<body>
    <a href="${pageContext.request.contextPath}/pages/foo.jsp">link</a>
</body>

如果您想为所有相对链接设置基本路径,从而无需${pageContext.request.contextPath}每个
相对链接中重复,请使用<base>标记。这是一个使用JSTL函数帮助的示例。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<head>
    <c:set var="url">${pageContext.request.requestURL}</c:set>
    <base href="${fn:substring(url, 0, fn:length(url) - fn:length(pageContext.request.requestURI))}${pageContext.request.contextPath}/" />
    <link rel="stylesheet" href="templates/style/main.css" />
    <script src="templates/js/main.js"></script>
    <script>var base = document.getElementsByTagName("base")[0].href;</script>
</head>
<body>
    <a href="pages/foo.jsp">link</a>
</body>

这样,每个相对链接(即 /或方案开头)都将相对于<base>

这与Tomcat没有任何关系。它只是与HTTP / HTML基础相关。您将在每个其他Web服务器中遇到相同的问题。

2020-06-08