Все относительные URL на странице HTML, сгенерированной файлом JSP, относятся к текущему URL запроса (URL, как вы видите в адресной строке браузера), а не к расположению файла JSP вна стороне сервера, как вы ожидаете.Именно веб-браузер должен загружать эти ресурсы индивидуально по URL-адресу, а не веб-сервер должен каким-то образом включать их с диска.
Помимо изменения относительных URL-адресов, чтобы сделать их относительными к URL-адресу сервлета, а нерасположение файла JSP, другой способ решить эту проблему - сделать их относительно корня домена (т.е. начать с /
).Таким образом, вам не нужно беспокоиться об изменении относительных путей при изменении URL-адреса сервлета.
<head>
<link rel="stylesheet" href="/context/css/default.css" />
<script src="/context/js/default.js"></script>
</head>
<body>
<img src="/context/img/logo.png" />
<a href="/context/page.jsp">link</a>
<form action="/context/servlet"><input type="submit" /></form>
</body>
Однако вы, вероятно, не захотите жестко кодировать путь контекста.Очень разумноВы можете получить контекстный путь в EL с помощью ${pageContext.request.contextPath}
.
<head>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/default.css" />
<script src="${pageContext.request.contextPath}/js/default.js"></script>
</head>
<body>
<img src="${pageContext.request.contextPath}/img/logo.png" />
<a href="${pageContext.request.contextPath}/page.jsp">link</a>
<form action="${pageContext.request.contextPath}/servlet"><input type="submit" /></form>
</body>
(который можно легко сократить на <c:set var="root" value="${pageContext.request.contextPath}" />
и использовать как ${root}
в другом месте)
Или, если вы не боитесь нечитаемого XML и выделения синтаксиса XML, используйте JSTL <c:url>
:
<head>
<link rel="stylesheet" href="<c:url value="/css/default.css" />" />
<script src="<c:url value="/js/default.js" />"></script>
</head>
<body>
<img src="<c:url value="/img/logo.png" />" />
<a href="<c:url value="/page.jsp" />">link</a>
<form action="<c:url value="/servlet" />"><input type="submit" /></form>
</body>
В любом случае, этов свою очередь довольно громоздко, если у вас много относительных URL.Для этого вы можете использовать тег <base>
.Все относительные URL-адреса мгновенно станут относительными к нему.Однако начинать нужно со схемы (http://
, https://
и т. Д.).Нет простого способа получить базовый путь контекста в простом EL, поэтому нам нужна небольшая помощь: JSTL здесь.
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="uri" value="${req.requestURI}" />
<c:set var="url">${req.requestURL}</c:set>
...
<head>
<base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/" />
<link rel="stylesheet" href="css/default.css" />
<script src="js/default.js"></script>
</head>
<body>
<img src="img/logo.png" />
<a href="page.jsp">link</a>
<form action="servlet"><input type="submit" /></form>
</body>
Это в свою очередь (опять же) несколько предостережений.Якоря (#identifier
URL) также станут относительными к базовому пути!Вместо этого вы хотели бы сделать это относительно URL запроса (URI).Итак, измените как
<a href="#identifier">jump</a>
на
<a href="${uri}#identifier">jump</a>
У каждого способа есть свои плюсы и минусы.Вам решать, что выбрать.По крайней мере, теперь вы должны понимать, как эта проблема вызвана и как ее решить:)
См. Также: