jsp - mvc - ¿Cómo usar rutas relativas sin incluir el nombre raíz de contexto?
pagecontext request contextpath spring mvc (6)
Comienzas tomcat desde algún directorio, que es $ cwd para tomcat. Puede especificar cualquier ruta relativa a este $ cwd.
supongamos que tiene
home
- tomcat
|_bin
- cssStore
|_file.css
Y supongamos que inicia tomcat desde ~ / tomcat, usando el comando "bin / startup.sh".
~ / tomcat se convierte en el directorio de inicio ($ cwd) para tomcat
Ahora puede acceder a "../cssStore/file.css" desde los archivos de clase de su servlet
Espero que ayude, - MS
Para trabajar con mi archivo estático (CSS, JS) tengo que escribir una ruta absoluta como /AppName/templates/style/main.css
. ¿Hay alguna solución, que pueda escribir una ruta relativa como style/main.css
?
En lugar de utilizar un enlace completo, podemos hacer lo siguiente (la solución se refiere a los archivos jsp)
Con JSTL podemos hacer que sea como: Para vincular recursos como css, js:
<link rel="stylesheet" href="${pageContext.request.contextPath}/style/sample.css" />
<script src="${pageContext.request.contextPath}/js/sample.js"></script>
Para simplemente hacer un enlace:
<a id=".." class=".." href="${pageContext.request.contextPath}/jsp/sample.jsp">....</a>
Vale la pena familiarizarse con las etiquetas
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
También hay un método jsp para hacerlo como a continuación, pero de una manera mejor como la anterior:
<link rel="stylesheet" href="<%=request.getContextPath()%>/style/sample.css" />
<script type="text/javascript" src="<%=request.getContextPath()%>/js/sample.js"></script>
Para simplemente hacer un enlace:
<a id=".." class=".." href="<%=request.getContextPath()%>/jsp/sample.jsp">....</a>
Esto es un derivado de la sugerencia @Ralph que he estado usando. Agregue c:url
a la parte superior de su JSP.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url value="/" var="root" />
Luego solo haga referencia a la variable raíz en su página:
<link rel="stylesheet" href="${root}templates/style/main.css">
Esto podría hacerse más simple:
<base href="${pageContext.request.contextPath}/"/>
Toda la URL se formará sin domain:port
innecesario domain:port
pero con contexto de la aplicación.
Si su preocupación real es la dinámica del contexto de la aplicación web (la parte "NombreAplicación"), simplemente HttpServletRequest#getContextPath()
dinámicamente por HttpServletRequest#getContextPath()
.
<head>
<link rel="stylesheet" href="${pageContext.request.contextPath}/templates/style/main.css" />
<script src="${pageContext.request.contextPath}/templates/js/main.js"></script>
<script>var base = "${pageContext.request.contextPath}";</script>
</head>
<body>
<a href="${pageContext.request.contextPath}/pages/foo.jsp">link</a>
</body>
Si desea establecer una ruta base para todos los enlaces relativos para que no tenga que repetir ${pageContext.request.contextPath}
en cada enlace relativo, use la etiqueta <base>
. Aquí hay un ejemplo con la ayuda de las funciones JSTL .
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<head>
<c:set var="url">${pageContext.request.requestURL}</c:set>
<base href="${fn:substring(url, 0, fn:length(url) - fn:length(pageContext.request.requestURI))}${pageContext.request.contextPath}/" />
<link rel="stylesheet" href="templates/style/main.css" />
<script src="templates/js/main.js"></script>
<script>var base = document.getElementsByTagName("base")[0].href;</script>
</head>
<body>
<a href="pages/foo.jsp">link</a>
</body>
De esta forma, cada enlace relativo (es decir, que no comienza con /
o un esquema) se volverá relativo a la <base>
.
Por cierto, esto no está relacionado específicamente con Tomcat de ninguna manera. Simplemente está relacionado con los conceptos básicos de HTTP / HTML. Tendría el mismo problema en cada otro servidor web.
Ver también:
Simplemente use <c:url>-tag con una ruta relativa al contexto de la aplicación.
Cuando el parámetro de value
comienza con un /
, la etiqueta lo tratará como una URL relativa a la aplicación y agregará el nombre de la aplicación a la url. Ejemplo:
jsp:
<c:url value="/templates/style/main.css" var="mainCssUrl" />`
<link rel="stylesheet" href="${mainCssUrl}" />
...
<c:url value="/home" var="homeUrl" />`
<a href="${homeUrl}">home link</a>
se convertirá en este html, con una URL relativa al dominio:
<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>