Подтвердить что ты не робот

Как вы получаете контекстный параметр с JavaScript, правильный путь?

Использование 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).

4b9b3361

Ответ 1

Основываясь на обсуждении в комментариях (в частности, от BalusC), вероятно, не стоит делать ничего более сложного, чем это:

<script>var ctx = "${pageContext.request.contextPath}"</script>

Ответ 2

Получил это: D

function getContextPath() {
   return window.location.pathname.substring(0, window.location.pathname.indexOf("/",2));
}
alert(getContextPath());

Важное примечание: работает только для корневого контекста. Не работает с "подпапками", или если в контексте контекста есть косая черта ( "/" ).

Ответ 3

Я думаю, вы можете добиться того, что вы ищете, объединив номер 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}" />";
}

Ответ 4

Я отображаю контекстный путь к атрибуту тега ссылки с 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

Ответ 5

Просмотрите решение, выполнив это. Проверяя решение на этой странице, сделайте следующее решение, надеюсь, оно работает: Пример:

Javascript:

var context = window.location.pathname.substring(0, window.location.pathname.indexOf("/",2)); 
var url =window.location.protocol+"//"+ window.location.host +context+"/bla/bla";

Ответ 6

Принятый ответ работает. Точно так же вы можете попробовать следующее:

<div id="contextPathForJs" style="display: none;">
            <c:out value="${pageContext.request.contextPath}" />            
 </div