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
?
jsp
servlets
resources
relative-path
contextpath
kspacja
fuente
fuente
style/main.css
debería funcionar. Es posible que haya lugares en los que no sea así, pero sin que usted le diga a la gente lo que realmente está tratando de hacer, será muy acertado si la gente puede ayudarlo.Respuestas:
Si su preocupación real es la dinámica del contexto de la aplicación web (la parte "AppName"), recupérelo 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 de modo que no necesite repetir
${pageContext.request.contextPath}
en cada enlace relativo, utilice la<base>
etiqueta. Aquí hay un ejemplo con la ayuda de 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 manera, cada enlace relativo (es decir, que no comience con
/
o un esquema) se volverá relativo al<base>
.Por cierto, esto no está relacionado específicamente con Tomcat de ninguna manera. Solo está relacionado con los conceptos básicos de HTTP / HTML. Tendría el mismo problema en todos los demás servidores web.
Ver también:
fuente
<c:out>
. Ser un completo ignorante y tener un software muy antiguo no es una razón justa para rechazar la votación, por cierto.Solo usa
<c:url>
-tag con una ruta relativa al contexto de la aplicación.Cuando el
value
parámetro 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>
fuente
Comienzas tomcat desde algún directorio, que es $ cwd para tomcat. Puede especificar cualquier ruta relativa a este $ cwd.
suponga que tiene
home - tomcat |_bin - cssStore |_file.css
Y suponga que inicia tomcat desde ~ / tomcat, usando el comando "bin / startup.sh".
~ / tomcat se convierte en el directorio de inicio ($ cwd) para tomcat
Puede acceder a "../cssStore/file.css" desde los archivos de clase en su servlet ahora
Espero que ayude, - MS
fuente
En lugar de usar el enlace completo, podemos hacer lo siguiente (la solución se refiere a archivos jsp)
Con JSTL podemos hacerlo 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 mejor como arriba:
<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>
fuente
Esto podría hacerse de forma más sencilla:
<base href="${pageContext.request.contextPath}/"/>
Todas las URL se formarán sin necesidad
domain:port
pero con el contexto de la aplicación.fuente
Este es un derivado de la sugerencia de @Ralph que he estado usando. Agregue el
c:url
en 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">
fuente