Jak uzyskać contextPath z JavaScript, we właściwy sposób?

Używając zaplecza opartego na Javie (tj. servletów i JSP), jeśli potrzebuję ścieżki kontekstowej z JavaScript, jaki jest zalecany wzorzec do tego, dlaczego? Mogę wymyślić kilka możliwości. Czy coś mi umknęło?

1. Spalić znacznik skryptu na stronie, która ustawia go w jakiejś zmiennej JavaScript

<script>var ctx = "<%=request.getContextPath()%>"</script>

Jest to dokładne, ale wymaga wykonania skryptu podczas ładowania strony.

2. Ustawianie ścieżki kontekstowej w ukrytym DOM element

<span id="ctx" style="display:none;"><%=request.getContextPath()%></span>

Jest to dokładne i nie wymaga wykonywania skryptu podczas ładowania strony. Ale potrzebujesz zapytania DOM, gdy potrzebujesz dostępu do ścieżki kontekstowej. Wynik zapytania DOM może być buforowany, jeśli zależy ci na wydajności.

3. Spróbuj to zrozumieć w JavaScript, sprawdzając document.URL lub znacznik bazowy

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));
};

Nie wymaga to wykonania skryptu podczas ładowania strony, a w razie potrzeby możesz także buforować wynik. Ale działa to tylko wtedy, gdy wiesz, że ścieżka kontekstowa jest pojedynczym katalogiem - w przeciwieństwie do katalogu głównego (/) lub wielu katalogów w dół (/mypath/iscomplicated/).

Which way I ' m leaning

Preferuję ukryty element DOM, ponieważ nie wymaga on wykonywania kodu JavaScript przy ładowaniu strony. Tylko wtedy, gdy potrzebuję ścieżki kontekstowej, będę musiał cokolwiek wykonać (w tym przypadku uruchomić zapytanie DOM).

Author: Mike M. Lin, 2011-07-07

5 answers

Bazując na dyskusji w komentarzach (szczególnie z BalusC), chyba nie warto robić nic bardziej skomplikowanego niż to:

<script>var ctx = "${pageContext.request.contextPath}"</script>
 58
Author: Mike M. Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-22 20:33:50

Mam: D

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

Ważna uwaga: działa tylko dla ścieżki kontekstowej "root". Nie działa z "podfolderami" lub jeśli ścieżka kontekstowa ma ukośnik ("/").

 38
Author: Cedric Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-06 14:28:38

Myślę, że możesz osiągnąć to, czego szukasz, łącząc numer 1 z wywołaniem funkcji takiej jak w numerze 3.

Nie chcesz uruchamiać skryptów podczas ładowania strony i wolisz wywołać funkcję później? Dobrze, po prostu utwórz funkcję, która zwraca wartość, którą ustawisz w zmiennej:

function getContextPath() {
   return "<%=request.getContextPath()%>";
}

Jest to funkcja, więc nie będzie wykonywana, dopóki jej nie wywołasz, ale zwraca wartość bezpośrednio, bez potrzeby przechodzenia DOM lub majstrowania przy adresach URL.

At w tym punkcie zgadzam się z @BalusC aby używać EL:

function getContextPath() {
   return "${pageContext.request.contextPath}";
}

Lub w zależności od wersji JSP fallback do JSTL:

function getContextPath() {
   return "<c:out value="${pageContext.request.contextPath}" />";
}
 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-22 20:02:33

Renderuję ścieżkę kontekstową do atrybutu znacznika linku id="contextPahtHolder", a następnie uzyskuję ją w kodzie JS. Na przykład:

<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() {});

Jeśli ścieżka kontekstowa jest pusta( jak w osadzonym kontenerze serwletów istance), będzie to pusty łańcuch. W przeciwnym razie zawiera łańcuch contextPath

 1
Author: Олег Шавров,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 07:40:45

Recenzent rozwiązanie przez to Sprawdzanie rozwiązania tej strony, zrobić następujące rozwiązanie mam nadzieję, że to działa: Przykład:

Javascript:

var context = window.location.pathname.substring(0, window.location.pathname.indexOf("/",2)); 
var url =window.location.protocol+"//"+ window.location.host +context+"/bla/bla";
 0
Author: Armando Cordova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-16 05:05:20