Как использовать относительные пути без включения имени корневого контекста?
Для работы с моим статическим файлом (CSS, JS) я должен написать абсолютный путь, например /AppName/templates/style/main.css
. Есть ли какое-либо решение, что я мог бы писать относительный путь, например style/main.css
?
Ответы
Ответ 1
Если ваша актуальная проблема связана с динамичностью контекста 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. У вас будет такая же проблема на любом другом веб-сервере.
См. также:
Ответ 2
Просто используйте <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 с относительным URL-адресом домена:
<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>
Ответ 3
Вы запускаете tomcat из некоторого каталога - это $cwd для tomcat. Вы можете указать любой путь относительно этого $cwd.
предположим, что у вас есть
home
- tomcat
|_bin
- cssStore
|_file.css
И предположим, что вы запустите tomcat из ~/tomcat, используя команду "bin/startup.sh".
~/tomcat становится домашним каталогом ($ cwd) для tomcat
Теперь вы можете получить доступ к "../cssStore/file.css" из файлов классов в вашем сервлетах
Надеюсь, что это поможет, - М.С..
Ответ 4
Вместо использования всей ссылки мы можем сделать, как показано ниже (решение касается файлов 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>
Ответ 5
Это можно сделать проще:
<base href="${pageContext.request.contextPath}/"/>
Весь URL-адрес будет сформирован без ненужного domain:port
, но с контекстом приложения.
Ответ 6
Это производная от предложения @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">