tutorial funciona español ejemplos definicion curso como caracteristicas javascript jsp servlets

funciona - ¿Cómo se obtiene el contextPath de JavaScript, de la manera correcta?



javascript pdf (4)

Basado en la discusión en los comentarios (particularmente de BalusC), probablemente no valga la pena hacer algo más complicado que esto:

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

Usando un back-end basado en Java (es decir, servlets y JSP), si necesito el contextPath de JavaScript, ¿cuál es el patrón recomendado para hacer eso? ¿Por qué? Puedo pensar en algunas posibilidades. ¿Me estoy perdiendo alguno?

1. Grabar una etiqueta SCRIPT en la página que lo establece en alguna variable de JavaScript

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

Esto es preciso, pero requiere la ejecución de scripts al cargar la página.

2. Establezca el contextPath en algún elemento DOM oculto

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

Esto es preciso y no requiere ninguna ejecución de script al cargar la página. Pero necesitas una consulta DOM cuando necesites acceder al contextPath. El resultado de la consulta DOM puede almacenarse en caché si le importa mucho el rendimiento.

3. Trate de averiguarlo dentro de JavaScript examinando document.URL o la etiqueta 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)); };

Esto no requiere ninguna ejecución de script al cargar la página, y también puede almacenar en caché el resultado si es necesario. Pero esto solo funciona si sabe que su ruta de contexto es un solo directorio, a diferencia del directorio raíz ( / ) o de los múltiples directorios hacia abajo ( /mypath/iscomplicated/ ).

De qué manera me inclino

Estoy favoreciendo el elemento DOM oculto, porque no requiere la ejecución de código JavaScript a la carga de la página. Solo cuando necesito el contextPath, tendré que ejecutar algo (en este caso, ejecutar una consulta DOM).


Creo que puedes lograr lo que estás buscando combinando el número 1 con una función llamada en el número 3.

¿No desea ejecutar scripts en la carga de la página y prefiere llamar a una función más adelante? Bien, solo crea una función que devuelva el valor que habrías establecido en una variable:

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

Es una función, por lo que no se ejecutará hasta que realmente lo llames, pero devuelve el valor directamente, sin necesidad de realizar recorridos DOM ni modificar las URL.

En este punto, estoy de acuerdo con @BalusC para usar EL:

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

o dependiendo de la versión de JSP de respaldo a JSTL:

function getContextPath() { return "<c:out value="${pageContext.request.contextPath}" />"; }


Entendido: D

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

Nota importante: solo funciona para la ruta de contexto "raíz". No funciona con "subcarpetas", o si la ruta de contexto tiene una barra inclinada ("/").


Represento la ruta de contexto al atributo de la etiqueta de enlace con id = "contextPahtHolder" y luego la obtengo en código JS. Por ejemplo:

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

Si la ruta de contexto está vacía (como en el contenedor de servlet incrustado istance), será cadena vacía. De lo contrario, contiene la cadena contextPath