Ответ 1
Основываясь на обсуждении в комментариях (в частности, от BalusC), вероятно, не стоит делать ничего более сложного, чем это:
<script>var ctx = "${pageContext.request.contextPath}"</script>
Использование back-end на основе Java (т.е. сервлетов и JSP), если мне нужен contextPath из JavaScript, каков рекомендуемый шаблон для этого, почему? Я могу придумать несколько возможностей. Я что-то не хватает?
1. Запишите тег SCRIPT на страницу, которая устанавливает его в некоторой переменной JavaScript
<script>var ctx = "<%=request.getContextPath()%>"</script>
Это точно, но при загрузке страницы требуется выполнение SCRIPT.
2. Установите contextPath в некоторый скрытый элемент DOM
<span id="ctx" style="display:none;"><%=request.getContextPath()%></span>
Это точно и не требует выполнения SCRIPT при загрузке страницы. Но вам нужен запрос DOM, когда вам нужно получить доступ к contextPath. Результат запроса DOM может быть кэширован, если вы заботитесь о производительности.
3. Попытайтесь выяснить это в JavaScript, изучив document.URL
или тег BASE
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));
};
Это не требует выполнения SCRIPT при загрузке страницы, и вы также можете кэшировать результат, если это необходимо. Но это работает только в том случае, если вы знаете, что ваш контекстный путь - это единственный каталог - в отличие от корневого каталога (/
) или нескольких каталогов вниз (/mypath/iscomplicated/
).
В каком направлении я склоняюсь
Я предпочитаю скрытый элемент DOM, потому что он не требует выполнения кода JavaScript при загрузке страницы. Только когда мне понадобится contextPath, мне нужно будет что-нибудь выполнить (в этом случае запустите запрос DOM).
Основываясь на обсуждении в комментариях (в частности, от 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 для 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>
main.js
var CONTEXT_PATH = $('#contextPathHolder').attr('data-contextPath');
$.get(CONTEXT_PATH + '/action_url', function() {});
Если путь контекста пуст (как во встроенном контейнере сервлета), это будет пустая строка. В противном случае он содержит строку 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";
Принятый ответ работает. Точно так же вы можете попробовать следующее:
<div id="contextPathForJs" style="display: none;">
<c:out value="${pageContext.request.contextPath}" />
</div