Ich entwickle eine Webanwendung mit Spring MVC 3 und habe das DispatcherServlet
Abfangen aller Anfragen an '/' wie folgt (web.xml):
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Dies funktioniert nun wie angekündigt. Wie kann ich jedoch mit statischen Inhalten umgehen? Früher, bevor ich RESTful-URLs verwendet habe, hätte ich zum Beispiel alle * .html abgefangen und an das gesendet DispatcherServlet
, aber jetzt ist es ein anderes Ballspiel.
Ich habe einen Ordner / static /, der / styles /, / js /, / images / etc enthält, und möchte / static / * aus dem Ordner ausschließen DispatcherServlet
.
Jetzt konnte ich statische Ressourcen zum Laufen bringen, als ich dies tat:
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/</url-pattern>
</servlet-mapping>
Aber ich möchte, dass es nette URLs hat (der Punkt, an dem ich Spring MVC 3 verwende), nicht die Zielseite www.domain.com/app/
Ich möchte auch keine Lösung, die an Tomcat oder einen anderen Servlet-Container gekoppelt ist, und da dies (relativ) wenig Verkehr ist, benötige ich keinen Webserver (wie Apache httpd) im Voraus.
Gibt es dafür eine saubere Lösung?
quelle
Antworten:
Da ich viel Zeit mit diesem Thema verbracht habe, dachte ich, ich würde meine Lösung teilen. Seit Frühjahr 3.0.4 wird ein Konfigurationsparameter aufgerufen
<mvc:resources/>
(mehr dazu auf der Referenzdokumentationswebsite ), mit dem statische Ressourcen bereitgestellt werden können, während das DispatchServlet weiterhin im Stammverzeichnis Ihrer Site verwendet wird.Verwenden Sie dazu eine Verzeichnisstruktur, die wie folgt aussieht:
Der Inhalt der Dateien sollte folgendermaßen aussehen:
src / springmvc / web / HelloWorldController.java:
WebContent / WEB-INF / web.xml:
WebContent / WEB-INF / springmvc-servlet.xml:
WebContent / jsp / index.jsp:
Hoffe das hilft :-)
quelle
Dieses Problem wurde in Spring 3.0.4.RELEASE behoben, wo Sie das
<mvc:resources mapping="..." location="..."/>
Konfigurationselement in Ihrer Spring Dispatcher-Konfigurationsdatei verwenden können.Überprüfen Sie die Federdokumentation
quelle
Fügen Sie in Spring 3.0.x Folgendes zu Ihrer servlet-config.xml hinzu (die Datei, die in web.xml als contextConfigLocation konfiguriert ist. Sie müssen auch den mvc-Namespace hinzufügen, aber googeln Sie einfach danach, wenn Sie nicht wissen, wie !;)
Das ist für mich in Ordnung
Grüße
Ayub Malik
quelle
Wenn ich Ihr Problem richtig verstehe, habe ich wahrscheinlich eine Lösung für Ihr Problem gefunden:
Ich hatte das gleiche Problem, bei dem die Rohausgabe ohne CSS-Stile, Javascripts oder JQuery-Dateien angezeigt wurde.
Ich habe gerade Zuordnungen zum "Standard" -Servlet hinzugefügt. Der Datei web.xml wurde Folgendes hinzugefügt:
Dies sollte die Javascript- und CSS-Dateianforderungen aus dem DispatcherRequest-Objekt herausfiltern.
Auch hier bin ich mir nicht sicher, ob du danach suchst, aber es hat bei mir funktioniert. Ich denke, "Standard" ist der Name des Standardservlets in JBoss. Ich bin mir nicht sicher, was es für andere Server ist.
quelle
<url-pattern>
Tags innerhalb derselben hinzufügen<servlet-mapping>
Es gibt einen weiteren Stapelüberlaufpfosten, der eine hervorragende Lösung bietet .
Es scheint nicht Tomcat-spezifisch zu sein, ist einfach und funktioniert hervorragend. Ich habe einige der Lösungen in diesem Beitrag mit Spring MVC 3.1 ausprobiert, hatte dann aber Probleme, meinen dynamischen Inhalt bereitzustellen.
Kurz gesagt heißt es, eine Servlet-Zuordnung wie folgt hinzuzufügen:
quelle
Ich habe mit tuckeys urlrewritefilter einen Weg gefunden, das zu umgehen. Bitte zögern Sie nicht, eine bessere Antwort zu geben, wenn Sie eine haben!
In web.xml:
In urlrewrite.xml:
Dies bedeutet, dass jeder Uri mit einem '.' Darin (wie zum Beispiel style.css) wird nicht neu geschrieben.
quelle
<mvc:resources/>
, wie @Joris zeigt.Ich habe mich gerade mit diesem Problem in Spring MVC 3.0 auseinandergesetzt und mich zunächst für die Option UrlRewriteFilter entschieden. Ich war jedoch nicht zufrieden mit dieser Lösung, da sie sich "nicht richtig anfühlte" (ich bin nicht die einzige - siehe den obigen Link zu den Frühlingsforen, in denen das Wort "Hack" einige Male vorkommt).
Daher habe ich eine ähnliche Lösung wie "Unbekannt (Google)" oben entwickelt, mir aber die Idee geliehen, dass alle statischen Inhalte von / static / (aus der Spring Roo-Version der Pet Store-App) bereitgestellt werden. Das "Standard" -Servlet hat bei mir nicht funktioniert, das Spring Webflow ResourceServlet jedoch (ebenfalls aus der von Spring Roo generierten App).
Web.xml:
Die einzige Änderung, die ich an JSPs vorgenommen habe, war das Hinzufügen des / static / -Pfads zu URLs für CSS, JS und Bilder. Beispiel "$ {pageContext.request.contextPath} /static/css/screen.css".
Für Maven-Benutzer lautet die Abhängigkeit für "org.springframework.js.resource.ResourceServlet":
quelle
Meine eigenen Erfahrungen mit diesem Problem sind wie folgt. Die meisten Spring-bezogenen Webseiten und Bücher scheinen darauf hinzudeuten, dass die am besten geeignete Syntax die folgende ist.
Die obige Syntax schlägt vor, dass Sie Ihre statischen Ressourcen (CSS, JavaScript, Bilder) in einem Ordner mit dem Namen "resources" im Stammverzeichnis Ihrer Anwendung ablegen können, dh / webapp / resources /.
Nach meiner Erfahrung (ich verwende Eclipse und das Tomcat-Plugin) funktioniert dies jedoch nur, wenn Sie Ihren Ressourcenordner in WEB_INF (oder META-INF) ablegen. Die von mir empfohlene Syntax lautet also wie folgt.
Verweisen Sie in Ihrer JSP (oder ähnlichem) wie folgt auf die Ressource.
Unnötig zu erwähnen, dass die gesamte Frage nur auftauchte, weil ich wollte, dass mein Spring Dispatcher-Servlet (Front-Controller) alles abfängt, alles Dynamische, das heißt. Also habe ich folgendes in meiner web.xml.
Da ich aktuelle Best Practices verwende, habe ich Folgendes in meiner Servlet-XML für den Front-Controller (siehe oben).
In meiner eigentlichen Controller-Implementierung habe ich Folgendes, um sicherzustellen, dass ich eine Standardmethode zur Verarbeitung aller eingehenden Anforderungen habe.
Ich hoffe das hilft.
quelle
Ich hatte das gleiche Problem und fand Joris 'Antwort sehr hilfreich. Aber zusätzlich muss ich hinzufügen
in die Servlet-Konfigurationsdatei. Ohne diese Funktion funktioniert die Ressourcenzuordnung nicht und alle Handler funktionieren nicht mehr. Hoffe das wird jemandem helfen.
quelle
Das URLRewrite ist eine Art "Hack", wenn Sie es so nennen möchten. Es kommt darauf an, dass Sie das Rad neu erfinden. da gibt es bereits bestehende lösungen. Eine andere Sache, an die Sie sich erinnern sollten, ist HTTP-Server = statischer Inhalt & App-Server = dynamischer Inhalt (so wurden sie entworfen). Indem Sie die entsprechenden Verantwortlichkeiten an jeden Server delegieren, maximieren Sie die Effizienz ... aber heutzutage ist dies wahrscheinlich nur in leistungskritischen Umgebungen ein Problem, und so etwas wie Tomcat würde höchstwahrscheinlich die meiste Zeit in beiden Rollen gut funktionieren. aber es ist trotzdem etwas zu beachten.
quelle
Ich habe es so gelöst:
Dies funktioniert bei Tomcat und natürlich bei Jboss. Am Ende entschied ich mich jedoch für die Lösung, die Spring (wie von rozky erwähnt) bietet und die weitaus portabler ist.
quelle
Ich habe beide Methoden verwendet, nämlich URLrewrite und Annotation basierend auf Spring MVC 3.0.x, und fand, dass Annotation Based Approach am besten geeignet ist
Ein auf Anmerkungen basierender Ansatz wird also das gute Geschäft sein.
quelle
Ab Frühjahr 3 müssen alle Ressourcen auf andere Weise zugeordnet werden. Sie müssen das Tag verwenden, um den Speicherort der Ressourcen anzugeben.
Beispiel:
Auf diese Weise weisen Sie das Dispatcher-Servlet an, in den Verzeichnisressourcen nach dem statischen Inhalt zu suchen.
quelle
Meine Art, dieses Problem zu lösen, besteht darin, alle Ihre Aktionen mit einem bestimmten Präfix wie "Web" oder "Service" zu versehen und zu konfigurieren, dass alle URLs mit diesem Präfix vom DispatcherServlet abgefangen werden.
quelle
Ich füge nur drei Regeln vor der Spring-Standardregel (/ **) zu Tuckeys URLrewritefilter (urlrewrite.xml) hinzu, um das Problem zu lösen
quelle
Ich weiß, dass es einige Konfigurationen gibt, um den statischen Inhalt zu verwenden, aber meine Lösung besteht darin, dass ich nur einen Massenordner für Webanwendungen in Ihrem Tomcat erstelle. Diese "Bulk-Webanwendung" stellt nur alle statischen Inhalte bereit, ohne Apps bereitzustellen. Dies ist eine schmerzfreie und einfache Lösung, um statische Inhalte für Ihre eigentliche Spring-Webanwendung bereitzustellen.
Zum Beispiel verwende ich zwei Webapp-Ordner auf meinem Tomcat.
Wenn ich Javascript verwenden möchte, füge ich einfach den URI für meine Javascript-Datei hinzu.
EX> /resources/path/to/js/myjavascript.js
Für statische Bilder verwende ich dieselbe Methode.
EX> /resources/path/to/img/myimg.jpg
Zuletzt habe ich meinem Tomcat eine " Sicherheitsbeschränkung " auferlegt, um den Zugriff auf das eigentliche Verzeichnis zu blockieren. Ich habe die Benutzerrolle "Nobody" auf die Einschränkung gesetzt, sodass die Seite "403 verbotener Fehler" generiert, wenn Leute versuchen, auf den Pfad für statische Inhalte zuzugreifen.
Bisher funktioniert es sehr gut für mich. Mir ist auch aufgefallen, dass viele beliebte Websites wie Amazon, Twitter und Facebook unterschiedliche URI für die Bereitstellung statischer Inhalte verwenden. Um dies herauszufinden, klicken Sie einfach mit der rechten Maustaste auf einen statischen Inhalt und überprüfen Sie dessen URI.
quelle
Dies hat in meinem Fall den eigentlichen Job gemacht
in web.xml:
...
quelle
Für die Java-basierte Federkonfiguration können Sie Folgendes verwenden
Verwenden von ResourceHandlerRegistry, in dem Registrierungen von Ressourcenhandlern für die Bereitstellung statischer Ressourcen gespeichert werden.
Weitere Informationen @ WebMvcConfigurerAdapter, der Rückrufmethoden zum Anpassen der Java-basierten Konfiguration für Spring MVC definiert, die über @EnableWebMvc aktiviert wurde.
quelle
Nachdem ich denselben hier beschriebenen Entscheidungsprozess erlebt und durchlaufen hatte, entschied ich mich für den ResourceServlet-Vorschlag, der sehr gut funktioniert.
Beachten Sie, dass Sie hier weitere Informationen zur Verwendung von Webflow in Ihrem Maven-Erstellungsprozess erhalten: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html
Wenn Sie das standardmäßige zentrale Maven-Repository verwenden, ist das Artefakt (im Gegensatz zum oben genannten Springsource-Bundle):
quelle
Dies kann auf mindestens drei Arten erreicht werden.
Lösungen :
Für vollständige Codebeispiele, wie dies erreicht werden kann, verweisen wir auf meine Antwort in einem anderen Beitrag: Wie ordne ich Anfragen einer HTML-Datei in Spring MVC zu?
quelle
Das Problem liegt bei URLPattern
Ändern Sie Ihr URL-Muster in Ihrer Servlet-Zuordnung von "/" in "/ *".
quelle
Wenn Sie eine annotationsbasierte Konfiguration verwenden möchten, verwenden Sie den folgenden Code
quelle
Platzieren Sie statische Inhalte wie css, js im folgenden Pfad
quelle