Wie verwende ich relative Pfade ohne Angabe des Kontextstammnamens?


78

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?


1
Warum (und wo ) müssen Sie den vollständigen Pfad schreiben? Fast überall, wo ich mir vorstellen kann, style/main.csssollte 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.
TJ Crowder

Ich möchte nur die CSS-Datei mit meiner JSP-Seite verknüpfen. Ich habe keine Erklärung geschrieben, weil es die einfachste und einzige Verwendung war, die ich mir vorstellen kann, also denke ich, dass jeder raten kann. Trotzdem: Es tut mir leid. Mein Fehler ...
kspacja

Antworten:


168

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.

Siehe auch:


Ich benutze nicht pageContext.request.contextPath und ich sehe nicht, wann ich es wirklich brauche. Ich kann die Projekteigenschaften in NetBeans für den Kontext ändern. Kannst du mehr erklären
Shareef

1
$ {pageContext ... funktioniert bei mir nicht. Erzeugt einfach so etwas wie localhost: 8080 / profile / $% 7BpageContext.request.context% 7D / css / profile /
MegaMatt

5
@Matt: Upgrade auf mindestens JSP 2.0 (veröffentlicht vor einem Jahrzehnt). Alternativ verwenden <c:out>. Völlig ignorant zu sein und über sehr alte Software zu verfügen, ist übrigens kein fairer Grund, eine Ablehnung vorzunehmen.
BalusC

1
@Vnge: Lass JSP es einfach als JS-Variable drucken?
BalusC

1
@ Natix: Pause? Es ist als Basis-URL aller relativen URLs gedacht . Siehe auch ua stackoverflow.com/a/1889957 Verwenden Sie es nur nicht, wenn es nicht zu Ihrer technischen Implementierung passt.
BalusC

20

Verwenden <c:url>Sie einfach -tag mit einem relativen Pfad für den Anwendungskontext.

Wenn der valueParameter 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>

2

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


2

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>

2

Dies könnte einfacher gemacht werden:

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

Alle URLs werden ohne unnötigen, domain:portaber mit Anwendungskontext erstellt.


-1

Dies ist eine Ableitung des von mir verwendeten @ Ralph-Vorschlags. Fügen Sie das c:urloben 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">
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.