如何使用相对路径而不包括上下文根名称?

要使用静态文件(CSS,JS) ,我必须编写类似 /AppName/templates/style/main.css的绝对路径。有没有什么解决方案,我可以写相对路径像 style/main.css

180303 次浏览

您从某个目录启动 tomcat-这是 tomcat 的 $cwd。您可以指定与此 $cwd 相关的任何路径。

假设你有

home
- tomcat
|_bin
- cssStore
|_file.css

假设您使用命令“ bin/startup.sh”从 ~/tomcat 启动 tomcat。

~/tomcat 成为 tomcat 的主目录($cwd)

您现在可以从 servlet 中的类文件访问“ . ./cssStore/file.css”

希望能帮上忙-多发性硬化症。

如果您关心的是 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 基础相关。在其他的网络服务器上你也会遇到同样的问题。

参见:

相反,我们可以使用如下所示的整个链接(解决方案涉及 jsp 文件)

有了 JSTL,我们可以这样做: 链接类似 css 的资源:

     <link rel="stylesheet" href="${pageContext.request.contextPath}/style/sample.css" />
<script src="${pageContext.request.contextPath}/js/sample.js"></script>

简单地做一个链接:

     <a id=".." class=".." href="${pageContext.request.contextPath}/jsp/sample.jsp">....</a>

熟悉标签是值得的

   <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

还有一个 jsp 方法可以像下面这样做,但是更好的方法是像上面这样:

   <link rel="stylesheet" href="<%=request.getContextPath()%>/style/sample.css" />
<script type="text/javascript" src="<%=request.getContextPath()%>/js/sample.js"></script>

简单地做一个链接:

   <a id=".." class=".." href="<%=request.getContextPath()%>/jsp/sample.jsp">....</a>

只需将 <c:url>标签与应用程序上下文相对路径一起使用。

value参数以 /开始时,标记将把它作为一个应用程序相对 url 对待,并将 application-name 添加到 url 中。 例如:

Jsp:

<c:url value="/templates/style/main.css" var="mainCssUrl" />`
<link rel="stylesheet" href="${mainCssUrl}" />
...
<c:url value="/home" var="homeUrl" />`
<a href="${homeUrl}">home link</a>

将成为这个 html,带有一个域相对 URL:

<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>

这是我一直在使用的@Ralph 建议的衍生版本。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url value="/" var="root" />

然后在你的页面中引用根变量:

<link rel="stylesheet" href="${root}templates/style/main.css">

这可以做得更简单:

<base href="${pageContext.request.contextPath}/"/>

所有的 URL 都将形成没有不必要的 domain:port,但应用程序上下文。