Как управлять путем к файлу при доступе из другого каталога?
У меня есть несколько веб-страниц, расположенных в разных каталогах, и моя цель состоит в том, чтобы иметь какую-то организованную структуру, чтобы я мог получить доступ к файлам js или css без жесткого кодирования пути.
Например, структура каталогов:
root --- js --- some.js
|
|--css --- some.css
|
|---pages ---- main.jsp
|
|---other----foo---- foo.jsp
|
|--bar --- bar.jsp
Затем main.jsp и foo.jsp пытаются ссылаться на some.js, но должны иметь другой путь.
( main.jsp )
<script type="text/javascript" src="../js/some.js"></script>
( foo.jsp)
<script type="text/javascript" src="../../js/some.js"></script>
Это не идеально, если я хочу изменить местоположение main.jsp или foo.jsp, я должен вернуться к каждому файлу и изменить путь вручную.
Я думаю, чтобы иметь класс фабрики, который имеет полный путь для каждого файла, чтобы он выглядел примерно так:
<script type="text/javascript" src=<% Factory.getFullPath(some.js) %> ></script>
В этом случае я все еще могу свободно перемещать файлы и не возвращаться к каждому файлу.
Могу ли я получить некоторое мнение о моем подходе? Есть ли другой способ решить эту проблему?
2 ответа
Используйте контекстно-относительный путь. Это сделает абсолютный путь к корневому домену. Вы можете получить контекстный путь HttpServletRequest#getContextPath()
, В JSP HttpServletRequest
доступно по ${pageContext.request}
,
<script type="text/javascript" src="${pageContext.request.contextPath}/js/some.js"></script>
( contextPath
Сам уже начинается с /
так что вам не нужно добавлять префикс самостоятельно)
Вы также можете установить его с помощью HTML <base>
тег, так что каждый относительный URL на странице становится относительно него. Таким образом, вам не нужно копировать ${pageContext.request.contextPath}
по всему месту.
<base href="${pageContext.request.contextPath}"></base>
<script type="text/javascript" src="js/some.js"></script>
Это, однако, имеет одну оговорку: якоря, как <a href="#foo">
также станет относительным к этому. Вы должны принять это во внимание, если вы идете на это.
Смотрите также:
Мм Я не совсем уверен, что фабрика является наиболее подходящим способом сделать это, может быть, он будет работать.. я помню, что для этого я использовал интерфейс, где я реализовал некоторые константы, включая путь к папкам JS и CSS
public interface Configuration {
public static final String SERVER_URL = "http://localhost:8080/";
public static final String CSS_URL = SERVER_URL + "css/";
public static final String JS_URL = SERVER_URL + "js/";
}
и тогда мне нужно будет импортировать этот интерфейс в сервлет и вызвать его так:
...src="<% Configuration.JS_URL %>some.js" />..
таким образом, если вы измените имя папки или путь. вам нужно только изменить конфигурацию