Как вы получаете contextPath из JavaScript, правильный путь?
используя серверную часть на основе Java (т. е. сервлеты и JSP), если мне нужен contextPath из JavaScript, какой рекомендуемый шаблон для этого, почему? Я могу придумать несколько вариантов. Я что-нибудь пропустил?
1. Запишите тег скрипта на страницу, которая устанавливает его в некоторую переменную JavaScript
<script>var ctx = "<%=request.getContextPath()%>"</script>
это точно, но требует выполнения скрипта при загрузке страницы.
2. Установить самом contextpath в какой-то скрытый дом элемент
<span id="ctx" style="display:none;"><%=request.getContextPath()%></span>
это точно, и не требует выполнения скрипта при загрузке страницы. Но вам нужен запрос DOM, когда нужно получить доступ к contextPath. Результат запроса DOM можно кэшировать, если вы так сильно заботитесь о производительности.
3. Попробуйте выяснить это в JavaScript, изучив document.URL
или базовый тег
function() {
var base = document.getElementsByTagName('base')[0];
if (base && base.href && (base.href.length > 0)) {
base = base.href;
} else {
base = document.URL;
}
return base.substr(0,
base.indexOf("/", base.indexOf("/", base.indexOf("//") + 2) + 1));
};
это не требует выполнения скрипта при загрузке страницы, и вы также можете кэшируйте результат, если это необходимо. Но это работает только если вы знаете, что ваш контекстный путь является одним каталогом - в отличие от корневого каталога (/
) или несколько каталогов вниз (/mypath/iscomplicated/
).
в какую сторону я склоняюсь
Я предпочитаю скрытый элемент DOM, потому что он не требует выполнения кода JavaScript при загрузке страницы. Только когда мне нужен contextPath, мне нужно будет выполнить что-либо (в этом случае запустите запрос DOM).
5 ответов:
основываясь на обсуждении в комментариях (особенно от BalusC), вероятно, не стоит делать ничего более сложного, чем это:
<script>var ctx = "${pageContext.request.contextPath}"</script>
понял :D
function getContextPath() { return window.location.pathname.substring(0, window.location.pathname.indexOf("/",2)); } alert(getContextPath());
важное примечание: работает только для "корневого" пути контекста. Не работает с "подпапками", или если контекстный путь имеет косую черту ( " / " ) в нем.
Я думаю, что вы можете достичь того, что вы ищете, объединив номер 1 с вызовом функции, как в номере 3.
вы не хотите выполнять скрипты при загрузке страницы и предпочитают вызвать функцию позже? Нормально, просто создать функцию, которая возвращает значение в переменную:
function getContextPath() { return "<%=request.getContextPath()%>"; }
это функция, поэтому она не будет выполняться до тех пор, пока вы ее не вызовете, но она возвращает значение напрямую, без необходимости выполнять DOM-обходы или возиться с URL-адреса.
на данный момент я согласен с @BalusC использовать EL:
function getContextPath() { return "${pageContext.request.contextPath}"; }
или в зависимости от версии JSP fallback to JSTL:
function getContextPath() { return "<c:out value="${pageContext.request.contextPath}" />"; }
я отображаю контекстный путь к атрибуту тега ссылки с id= "contextPahtHolder", а затем получаю его в коде JS. Например:
<html> <head> <link id="contextPathHolder" data-contextPath="${pageContext.request.contextPath}"/> <body> <script src="main.js" type="text/javascript"></script> </body> </html>
главная.js
var CONTEXT_PATH = $('#contextPathHolder').attr('data-contextPath'); $.get(CONTEXT_PATH + '/action_url', function() {});
Если контекстный путь пуст (например, во встроенном контейнере сервлета istance), это будет пустая строка. В противном случае он содержит строку contextPath
рецензент решение по этому Проверяя решение этой страницы, сделайте следующее решение я надеюсь, что оно работает: Образец:
Javascript:
var context = window.location.pathname.substring(0, window.location.pathname.indexOf("/",2)); var url =window.location.protocol+"//"+ window.location.host +context+"/bla/bla";