Um meine statische Datei (CSS, JS) zu bearbeiten, muss ich einen absoluten Pfad wie schreiben /AppName/templates/style/main.css
. Gibt es eine Lösung, wie ich einen relativen Pfad schreiben könnte style/main.css
?
Um meine statische Datei (CSS, JS) zu bearbeiten, muss ich einen absoluten Pfad wie schreiben /AppName/templates/style/main.css
. Gibt es eine Lösung, wie ich einen relativen Pfad schreiben könnte style/main.css
?
Antworten:
Wenn Ihr eigentliches Anliegen die Dynamik des Webapp-Kontexts (der Teil "AppName") ist, rufen Sie ihn einfach dynamisch ab 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>
Wenn Sie einen Basispfad für alle relativen Links festlegen möchten, damit Sie nicht ${pageContext.request.contextPath}
in jedem relativen Link wiederholen müssen , verwenden Sie das <base>
Tag. Hier ist ein Beispiel mit Hilfe von JSTL-Funktionen .
<%@ 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>
Auf diese Weise wird jeder relative Link (dh nicht beginnend mit /
oder ein Schema) relativ zum <base>
.
Dies hängt übrigens in keiner Weise speziell mit Tomcat zusammen. Es bezieht sich nur auf HTTP / HTML-Grundlagen. Sie hätten das gleiche Problem auf jedem anderen Webserver.
<c:out>
. Völlig ignorant zu sein und über sehr alte Software zu verfügen, ist übrigens kein fairer Grund, eine Ablehnung vorzunehmen.
Verwenden <c:url>
Sie einfach -tag mit einem relativen Pfad für den Anwendungskontext.
Wenn der value
Parameter mit einem beginnt /
, behandelt das Tag ihn als anwendungsrelative URL und fügt der URL den Anwendungsnamen hinzu. Beispiel:
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>
wird dieses HTML mit einer Domain relativen URL:
<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>
Sie starten Tomcat aus einem Verzeichnis - dem $ cwd für Tomcat. Sie können einen beliebigen Pfad relativ zu diesem $ cwd angeben.
Angenommen, Sie haben
home
- tomcat
|_bin
- cssStore
|_file.css
Angenommen, Sie starten tomcat von ~ / tomcat aus mit dem Befehl "bin / startup.sh".
~ / tomcat wird zum Home-Verzeichnis ($ cwd) für tomcat
Sie können jetzt über Klassendateien in Ihrem Servlet auf "../cssStore/file.css" zugreifen
Hoffe das hilft, - MS
Stattdessen können wir den gesamten Link wie folgt verwenden (Lösung betrifft JSP-Dateien).
Mit JSTL können wir es so machen: Um Ressourcen wie CSS zu verknüpfen, js:
<link rel="stylesheet" href="${pageContext.request.contextPath}/style/sample.css" />
<script src="${pageContext.request.contextPath}/js/sample.js"></script>
Um einfach einen Link zu erstellen:
<a id=".." class=".." href="${pageContext.request.contextPath}/jsp/sample.jsp">....</a>
Es lohnt sich, sich mit Tags vertraut zu machen
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Es gibt auch eine JSP-Methode, um es wie unten zu machen, aber besser wie oben:
<link rel="stylesheet" href="<%=request.getContextPath()%>/style/sample.css" />
<script type="text/javascript" src="<%=request.getContextPath()%>/js/sample.js"></script>
Um einfach einen Link zu erstellen:
<a id=".." class=".." href="<%=request.getContextPath()%>/jsp/sample.jsp">....</a>
Dies könnte einfacher gemacht werden:
<base href="${pageContext.request.contextPath}/"/>
Alle URLs werden ohne unnötigen, domain:port
aber mit Anwendungskontext erstellt.
Dies ist eine Ableitung des von mir verwendeten @ Ralph-Vorschlags. Fügen Sie das c:url
oben in Ihrer JSP hinzu.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url value="/" var="root" />
Dann verweisen Sie einfach auf die Stammvariable auf Ihrer Seite:
<link rel="stylesheet" href="${root}templates/style/main.css">
style/main.css
sollte es funktionieren. Es mag Orte geben, an denen dies nicht der Fall ist, aber ohne dass Sie den Leuten sagen, was Sie tatsächlich versuchen, wird es ein großer Erfolg sein, wenn die Leute Ihnen helfen können.