¿Cómo usar rutas relativas sin incluir el nombre de la raíz del contexto?

78

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?

kspacja
fuente
2
¿Por qué (y dónde ) tienes que escribir la ruta completa? Casi cualquier lugar en el que pueda pensar style/main.cssdeberí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.
TJ Crowder
Solo quiero vincular el archivo css a mi página jsp. No escribí para explicar, porque era la imagen más simple y única que puedo usar, así que creo que todos adivinan. Aun así: lo siento. Mi error ...
kspacja

Respuestas:

168

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:

BalusC
fuente
No uso pageContext.request.contextPath y no veo cuándo realmente lo necesito. Puedo cambiar las propiedades del proyecto en netbeans para el contexto, ¿puede explicar más
Shareef
1
$ {pageContext ... no funciona para mí. Solo genera algo como localhost: 8080 / profile / $% 7BpageContext.request.context% 7D / css / profile /
MegaMatt
5
@Matt: actualice al menos a JSP 2.0 (lanzado hace una década). Alternativamente, use <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.
BalusC
1
@Vnge: ¿dejar que JSP lo imprima como una variable JS?
BalusC
1
@Natix: ¿Romper? Tiene la intención de ser la URL base de todas las URL relativas. Consulte también ao stackoverflow.com/a/1889957 Simplemente no lo use si no se ajusta a su implementación técnica.
BalusC
21

Solo usa <c:url>-tag con una ruta relativa al contexto de la aplicación.

Cuando el valuepará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>
Ralph
fuente
2

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

Manidip Sengupta
fuente
2

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>
blueberry0xff
fuente
2

Esto podría hacerse de forma más sencilla:

<base href="${pageContext.request.contextPath}/"/>

Todas las URL se formarán sin necesidad domain:portpero con el contexto de la aplicación.

Grigory Kislin
fuente
-1

Este es un derivado de la sugerencia de @Ralph que he estado usando. Agregue el c:urlen 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">
David Newcomb
fuente