¿Cómo manejar la ruta del archivo cuando se accede desde una ubicación diferente directorio?
-
28-09-2019 - |
Pregunta
Tengo algunas páginas web que se sientan en diferentes directorios y mi meta es tener algún tipo de estructura organizada de modo que pueda acceder a los archivos CSS o JS sin codificar el camino.
Por ejemplo, la estructura de directorios es:
root --- js --- some.js
|
|--css --- some.css
|
|---pages ---- main.jsp
|
|---other----foo---- foo.jsp
|
|--bar --- bar.jsp
A continuación, main.jsp y foo.jsp intenta hacer referencia some.js pero tiene que tener camino diferente.
( main.jsp )
<script type="text/javascript" src="../js/some.js"></script>
( foo.jsp)
<script type="text/javascript" src="../../js/some.js"></script>
Esto no es ideal si quiero cambiar la ubicación de main.jsp o foo.jsp, tengo que volver a cada archivo y cambiar la ruta manualmente.
Me refiero a tener clase de fábrica que tiene la ruta completa para cada uno de los archivos de modo que sería algo como:
<script type="text/javascript" src=<% Factory.getFullPath(some.js) %> ></script>
En este caso, todavía puedo mover archivos libremente y no tener que volver a cada archivo.
¿Puedo conseguir un poco de opinión a mi enfoque? ¿Hay otra manera de resolver esto?
Solución
Utilice una ruta relativa al contexto. Esto hará que la ruta absoluta a la raíz del dominio. Puede obtener la ruta de contexto por HttpServletRequest#getContextPath()
. En JSP, la HttpServletRequest
está disponible por ${pageContext.request}
.
<script type="text/javascript" src="${pageContext.request.contextPath}/js/some.js"></script>
(el contextPath
sí ya comienza con un /
, por lo que no es necesario prefijar usted mismo)
También puede configurarlo usando el HTML <base>
etiqueta de modo que todos URL relativa en la página se convierte en relación a la misma. De esta manera no es necesario copiar ${pageContext.request.contextPath}
sobre todo el lugar.
<base href="${pageContext.request.contextPath}"></base>
<script type="text/javascript" src="js/some.js"></script>
Sin embargo, esto tiene una advertencia: anclas, como <a href="#foo">
se convertirá también en relación a la misma. Es necesario tener esto en cuenta, así que si vas para esto.
Ver también:
Otros consejos
mm No estoy realmente seguro de si una fábrica es la forma más adecuada para ello, tal vez funcione .. i recordar que para que usaba una interfaz donde he implementado algunas constantes, incluyendo la ruta de la carpeta JS y CSS
public interface Configuration {
public static final String SERVER_URL = "http://localhost:8080/";
public static final String CSS_URL = SERVER_URL + "css/";
public static final String JS_URL = SERVER_URL + "js/";
}
y luego tendría que importar esta interfaz en el servlet y lo llaman así:
...src="<% Configuration.JS_URL %>some.js" />..
de esa manera si usted cambia su nombre carpetas o ruta. usted sólo tiene que cambiar la configuración