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

ksp*_*cja 76 resources jsp servlets relative-path contextpath

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

Bal*_*usC 164

如果您真正关心的是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>
Run Code Online (Sandbox Code Playgroud)

如果要为所有相对链接设置基本路径,以便不需要${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>
Run Code Online (Sandbox Code Playgroud)

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

这是与Tomcat没有任何关系的方式.它与HTTP/HTML基础知识有关.每个其他网络服务器都会遇到同样的问题.

也可以看看:

  • @Matt:升级到至少JSP 2.0(十年前发布).或者,使用`<c:out>`.作为一个完全无知和拥有非常遗留的软件并不是一个公平的理由来贬低,顺便说一下. (5认同)

Ral*_*lph 20

只需使用带有应用程序上下文相对路径的<c:url>-tag.

value参数以a开头时/,标记会将其视为应用程序相对URL,并将应用程序名称添加到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>
Run Code Online (Sandbox Code Playgroud)

将成为这个HTML,与域相对URL:

<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>
Run Code Online (Sandbox Code Playgroud)