要使用静态文件(CSS,JS) ,我必须编写类似 /AppName/templates/style/main.css的绝对路径。有没有什么解决方案,我可以写相对路径像 style/main.css?
/AppName/templates/style/main.css
style/main.css
您从某个目录启动 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()动态地检索它。
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 函数的例子。
${pageContext.request.contextPath}
<base>
<%@ 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>标签与应用程序上下文相对路径一起使用。
<c:url>
当 value参数以 /开始时,标记将把它作为一个应用程序相对 url 对待,并将 application-name 添加到 url 中。 例如:
value
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,但应用程序上下文。
domain:port