Как вы получаете 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 54

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";