Как использовать относительные пути без включения имени корневого контекста? - PullRequest
75 голосов
/ 22 января 2011

Для работы с моим статическим файлом (CSS, JS) я должен написать абсолютный путь, например /AppName/templates/style/main.css. Есть ли решение, что я мог бы написать относительный путь, как style/main.css?

Ответы [ 6 ]

162 голосов
/ 22 января 2011

Если ваша фактическая проблема связана с динамичностью контекста веб-приложения (часть «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.У вас будет такая же проблема на любом другом веб-сервере.

См. Также:

20 голосов
/ 22 ноября 2015

Просто используйте <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>
2 голосов
/ 25 октября 2016

Это можно сделать проще:

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

Все URL будут сформированы без лишних domain:port, но с контекстом приложения.

2 голосов
/ 21 августа 2014

Вместо использования всей ссылки мы можем сделать, как показано ниже (решение касается файлов 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 голосов
/ 22 января 2011

Вы запускаете tomcat из некоторого каталога - который является $ cwd для tomcat.Вы можете указать любой путь относительно этого $ cwd.

. Предположим, у вас есть

home
- tomcat
 |_bin
- cssStore
 |_file.css

. Предположим, вы запускаете tomcat из ~ / tomcat, используя команду "bin / startup.sh".

~ / tomcat становится домашним каталогом ($ cwd) для tomcat

Теперь вы можете получить доступ к "../cssStore/file.css" из файлов классов в вашем сервлете

Надеюсь, что поможет, - MS

0 голосов
/ 21 марта 2016

Это производная от предложения @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">
...