wake-up-neo.com

Wie verwende ich relative Pfade ohne Angabe des Kontextstammnamens?

Um meine statische Datei (CSS, JS) zu bearbeiten, muss ich einen absoluten Pfad wie /AppName/templates/style/main.css Schreiben. Gibt es eine Lösung, dass ich einen relativen Pfad wie style/main.css Schreiben könnte?

75
kspacja

Wenn Ihr Anliegen actual die Dynamik des Webapp-Kontexts (der "AppName" -Teil) ist, rufen Sie ihn einfach dynamisch mit HttpServletRequest#getContextPath() ab.

<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 ${pageContext.request.contextPath} In every relativen Links nicht wiederholen müssen, verwenden Sie das Tag <base> . 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 (d. H. nicht beginnend mit / Oder einem Schema) relativ zum <base>.

Dies ist übrigens in keiner Weise speziell mit Tomcat verwandt. Es bezieht sich nur auf HTTP/HTML-Grundlagen. Sie hätten das gleiche Problem auf jedem anderen Webserver.

Siehe auch:

162
BalusC

Verwenden Sie einfach <c:url> - tag mit einem relativen Pfad zum Anwendungskontext.

Wenn der Parameter value mit einem / Beginnt, wird er vom Tag als relative Anwendungs-URL behandelt und der URL wird der Anwendungsname hinzugefügt. 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 relativen Domain-URL:

<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>
20
Ralph

Anstatt den gesamten Link zu verwenden, können wir ihn wie folgt erstellen (Lösung betrifft JSP-Dateien)

Mit JSTL können wir es so machen: Um eine Ressource wie css, js zu verlinken:

     <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 dies wie unten zu tun, 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>
2
blueberry0xff

Sie starten Tomcat von einem Verzeichnis aus - 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 mit dem Befehl "bin/startup.sh".

~/Tomcat wird das Ausgangsverzeichnis ($ cwd) für Tomcat

Sie können jetzt über Klassendateien in Ihrem Servlet auf "../cssStore/file.css" zugreifen

Hoffe das hilft, - M.S.

2

Dies könnte einfacher gemacht werden:

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

Alle URLs werden ohne unnötiges domain:port aber mit Anwendungskontext.

2
GKislin