79

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

4

6 回答 6

169

如果您真正关心的是 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 基础知识有关。您在其他所有网络服务器中都会遇到同样的问题。

也可以看看:

于 2011-01-21T22:41:50.623 回答
21

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

value参数以 开头时/,标签会将其视为应用程序相对 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>

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

<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>
于 2015-11-22T14:32:01.053 回答
2

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

假设你有

home
- tomcat
 |_bin
- cssStore
 |_file.css

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

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

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

希望有帮助,-MS

于 2011-01-21T22:37:44.450 回答
2

而是使用整个链接,我们可以如下制作(解决方案涉及 jsp 文件)

使用 JSTL,我们可以这样: 链接 css、js 等资源:

     <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>
于 2014-08-21T00:34:57.197 回答
2

这可以更简单地完成:

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

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

于 2016-10-24T22:50:51.513 回答
-1

这是我一直在使用的@Ralph 建议的派生词。添加c:url到您的JSP 的顶部。

<%@ 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">
于 2016-03-21T16:59:04.233 回答