Как управлять путем к файлу при доступе из другого каталога?

У меня есть несколько веб-страниц, расположенных в разных каталогах, и моя цель состоит в том, чтобы иметь какую-то организованную структуру, чтобы я мог получить доступ к файлам 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" />..

таким образом, если вы измените имя папки или путь. вам нужно только изменить конфигурацию

Другие вопросы по тегам