Wie lade ich externe Webseiten und Templates in meine Spring Web Applikation?
Ich habe eine Spring Webapplikation, welche im resources-Ordner die statischen Dateien enthalten. Da hab ich mich gefragt ob ich die Anwendung etwas generischer gestalten kann, indem ich den Zeiger auf einen Ordner in z.B. auf dem Desktop lege.
Nach einer Recherche (und auch die Nutzung von ChatGPT) soll ich einen ResoruceHandler definieren der unten stehend aussehen soll, aber es klappt nicht. Hab ich was falsch gemacht?
@Configuration
public class ResourceHandler implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/ordnerMitWebseite/**")
.addResourceLocations("file:C:/Users/rika/Desktop/ordnerMitWebseite/");
}
}
1 Antwort
Das Argument für den Resource Handler bestimmt das Pattern für die relative URL. Wenn du dort beispielsweise den Wert /example/** angibst, bedeutet das, dass bei allen URLs, die mit http(s)://your-website-domain/example/ beginnen, die Webanwendung in den angegebenen Ressourcenordnern nachschaut.
Noch einmal an einem Beispiel dargestellt:
In addResourceHandlers ist Folgendes gesetzt:
registry
.addResourceHandler("/example/**")
.addResourceLocations("/some-files/");
In deiner JSP-Datei hast du beispielsweise ein Bild eingebunden:
<img alt="..." src="<c:url value="/example/some-image.png" />">
Die Webanwendung würde nun unter webapp/some-files nach der Bilddatei some-image.png schauen. Der Resource Handler mappt die Adresse anhand des Pattern auf die verfügbare Resource Location.
Wenn du einen Ordner außerhalb des Webrootverzeichnis nutzen möchtest, brauchst du ein file URI Scheme. Die Angabe ist bei dir noch invalid.
Da dein Webserver offensichtlich auf einem Windows OS läuft, würde das so aussehen:
file:///C:/some/path/to/some/directory/
Mit diesem Property würdest du das Standardverzeichnis (bzw. die Standardverzeichnisse) für Ressourcen bestimmen.
Beim Resource Handler hast du etwas mehr Flexibilität, da du mehrere Ressourcenrouten anlegen (ein URL Pattern wird auf ein/mehrere Verzeichnis/se gemappt) und denen noch individuell explizite Eigenschaften zuordnen kannst.
Bei JavaScript-Dateien kann es beispielsweise Sinn machen, diese explizit zu komprimieren (Gzip-Kompression) und zu cachen.
registry
.addResourceHandler("/js/**")
.addResourceLocations("/resrc/js/")
.setCachePeriod(7200) // 7200 seconds
.resourceChain(true)
.addResolver(new GzipResourceResolver()) // gzip compression
.addResolver(new PathResourceResolver()); // default resolver to find the resources in resource locations
Man könnte den Dateien noch weitere Resolver anhängen, um beispielsweise ein Minifying des Codes anzustoßen oder bestimmte Dateien nur dann auszuspielen, wenn die Anfrage von jemanden bestimmtes kommt.