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

为了处理我的静态文件(CSS,JS),我必须编写像/AppName/templates/style/main.css这样的绝对路径。 有没有解决方案,我可以写style/main.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的Servlet时,浏览器无法访问/查找CSS,图像和链接等相关资源
  • 建议使用<base> html标签吗?

只要使用<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,与一个域的相对网址:

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

你从某个目录启动tomcat – 这是tomcat的$ cwd。 你可以指定任何相对于这个$ cwd的路径。

假设你有

 home - tomcat |_bin - cssStore |_file.css 

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

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

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

希望有帮助, – MS

而是使用整个链接,我们可以做如下(解决方案涉及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> 

这可以做得更简单:

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

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

这是@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"> 
Interesting Posts