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

Posted

技术标签:

【中文标题】如何在不包含上下文根名称的情况下使用相对路径?【英文标题】:How to use relative paths without including the context root name? 【发布时间】:2011-06-13 11:01:13 【问题描述】:

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

【问题讨论】:

为什么(和哪里)你必须写完整的路径?几乎在我能想到的任何地方,style/main.css 都可以使用。很可能有些地方没有,但如果你不告诉人们你真正想要做什么,那么人们是否可以帮助你将是非常偶然的。 我只想将 css 文件链接到我的 jsp 页面。我没有写解释,因为它是最简单的,也是我能想象的唯一用途,所以我想每个人都猜到了。即便如此:对不起。我的错... 【参考方案1】:

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

假设你有

home
- tomcat
 |_bin
- cssStore
 |_file.css

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

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

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

希望对您有所帮助,-M.S.

【讨论】:

【参考方案2】:

如果您实际关心的是 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,请使用&lt;base&gt; 标签。这是一个借助 JSTL functions 的示例。

<%@ 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>

这样每个相对链接(即不是/或scheme开头的链接)都将与&lt;base&gt;相关。

顺便说一句,这与 Tomcat 没有任何关系。它只与 HTTP/html 基础知识有关。您在其他所有网络服务器中都会遇到同样的问题。

另见:

Browser can't access/find relative resources like CSS, images and links when calling a Servlet which forwards to a JSP Is it recommended to use the <base> html tag?

【讨论】:

我不使用 pageContext.request.contextPath 并且我看不到我什么时候真正需要它我可以更改 netbeans 中的项目属性以获取上下文你能解释更多 $pageContext... 不适合我。只需生成类似 localhost:8080/profile/$%7BpageContext.request.context%7D/css/profile/ 的内容 @Matt:至少升级到 JSP 2.0(十年前发布)。或者,使用&lt;c:out&gt;。顺便说一句,完全无知并拥有非常旧的软件并不是投反对票的合理理由。 @Vnge: 让 JSP 将其打印为 JS 变量? @Natix:休息?它有意作为所有相对 URL 的基本 URL。另请参阅 a.o ***.com/a/1889957 如果它不适合您的技术实现,请不要使用它。【参考方案3】:

我们可以使用下面的整个链接来代替(解决方案涉及 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>

【讨论】:

【参考方案4】:

只需将&lt;c:url&gt;-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>

【讨论】:

【参考方案5】:

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

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

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

<link rel="stylesheet" href="$roottemplates/style/main.css">

【讨论】:

【参考方案6】:

这可以做得更简单:

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

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

【讨论】:

以上是关于如何在不包含上下文根名称的情况下使用相对路径?的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 Canvas - 在不翻译上下文的情况下相对于对象的中心进行缩放

如何在 Tomcat 中设置上下文路径,以便在不附加部署文件夹名称的情况下进入站点?

文件的相对路径和绝对路径以及根相对路径

具有到父级的相对包含路径的 C++ makefile

如何在不使用 ConstraintLayout 中的边距属性的情况下相对于屏幕宽度设置 2 个视图之间的空间

如何在给定两个绝对路径的情况下找到相对路径?