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


78

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


1
为什么(必须在哪里)写完整路径?我能想到的几乎任何地方都style/main.css应该起作用。可能在某些地方并没有,但是如果您没有告诉别人您实际上正在尝试做什么,那么人们是否可以帮助您将是很失败的。
TJ Crowder

我只想将css文件链接到我的jsp页面。我没有写解释,因为它是最简单的并且只能使用我可以成像的图像,所以我认为每个人都可以猜到。即使如此:对不起。我的错...
kspacja 2011年

Answers:


168

如果您真正关心的是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基础相关。您将在每个其他Web服务器中遇到相同的问题。

也可以看看:


我不使用pageContext.request.contextPath,也没有看到我何时真正需要它,我可以在netbeans中更改上下文的项目属性,您能解释一下吗
shareef 2013年

1
$ {pageContext ...对我不起作用。只是生成类似localhost:8080 / profile / $%7BpageContext.request.context%7D / css / profile /之类的东西
MegaMatt

5
@Matt:至少升级到JSP 2.0(十年前发布)。或者,使用<c:out>。顺便说一句,成为一个完全无知的人并拥有非常传统的软件并不是拒绝投票的合理理由。
BalusC

1
@Vnge:只是让JSP将其打印为JS变量?
BalusC 2014年

1
@Natix:休息?它旨在作为所有相对URL的基础URL。另请参见ao stackoverflow.com/a/1889957如果它不适合您的技术实现,请不要使用它。
BalusC

20

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

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,具有域相对网址:

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

2

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

假设你有

home
- tomcat
 |_bin
- cssStore
 |_file.css

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

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

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

希望对您有所帮助-MS


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>

2

这可以更简单地完成:

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

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


-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">
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.