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

时间:2011-01-21 22:18:33

标签: jsp servlets resources relative-path contextpath

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

6 个答案:

答案 0 :(得分:162)

如果实际关注的是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 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>

这样每个相对链接(即/或方案开头)将变为相对于<base>

这与Tomcat没有任何具体关系。它与HTTP / HTML基础知识有关。每个其他网络服务器都会出现同样的问题。

另见:

答案 1 :(得分: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,域名相对url:

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

答案 2 :(得分:2)

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

假设你有

home
- tomcat
 |_bin
- cssStore
 |_file.css

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

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

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

希望有所帮助, - M.S。

答案 3 :(得分: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>

答案 4 :(得分:2)

这可以更简单:

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

所有网址都将在没有不必要的domain:port的情况下形成,但会与应用程序上下文一起形成。

答案 5 :(得分:-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">