Je développe une webapp à l'aide de Spring MVC 3 et ai la DispatcherServlet
capture de toutes les demandes à '/' comme ça (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>
Maintenant, cela fonctionne comme annoncé, mais comment puis-je gérer le contenu statique? Auparavant, avant d'utiliser des URL RESTful, j'aurais intercepté tous les fichiers * .html par exemple et les aurais envoyés au DispatcherServlet
, mais maintenant c'est un jeu de balle différent.
J'ai un dossier / static / qui inclut / styles /, / js /, / images / etc et je voudrais exclure / static / * du DispatcherServlet
.
Maintenant, je pouvais faire fonctionner les ressources statiques quand je faisais ceci:
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/</url-pattern>
</servlet-mapping>
Mais je veux qu'il ait de belles URL (le point pour moi d'utiliser Spring MVC 3) pas la page de destination étant www.domain.com/app/
Je ne veux pas non plus de solution couplée à tomcat ou à tout autre conteneur de servlet, et comme il s'agit d'un trafic (relativement) faible, je n'ai pas besoin d'un serveur Web (comme apache httpd) en face.
Y a-t-il une solution propre à cela?
la source
Réponses:
Depuis que j'ai passé beaucoup de temps sur cette question, j'ai pensé partager ma solution. Depuis le printemps 3.0.4, il existe un paramètre de configuration appelé
<mvc:resources/>
(plus d'informations à ce sujet sur le site Web de documentation de référence ) qui peut être utilisé pour servir des ressources statiques tout en utilisant le DispatchServlet à la racine de votre site.Pour l'utiliser, utilisez une structure de répertoires qui ressemble à ceci:
Le contenu des fichiers doit ressembler à:
src / springmvc / web / HelloWorldController.java:
WebContent / WEB-INF / web.xml:
WebContent / WEB-INF / springmvc-servlet.xml:
WebContent / jsp / index.jsp:
J'espère que cela t'aides :-)
la source
Ce problème est résolu dans la version Spring 3.0.4.RELEASE où vous pouvez utiliser l'
<mvc:resources mapping="..." location="..."/>
élément de configuration dans votre fichier de configuration du répartiteur Spring.Vérifier la documentation de Spring
la source
Dans Spring 3.0.x, ajoutez ce qui suit à votre servlet-config.xml (le fichier configuré dans web.xml en tant que contextConfigLocation. Vous devez également ajouter l'espace de noms mvc mais juste google pour cela si vous ne savez pas comment !;)
Ça marche pour moi
Cordialement
Ayub Malik
la source
Si je comprends bien votre problème, je pense avoir trouvé une solution à votre problème:
J'ai eu le même problème où la sortie brute était affichée sans styles css, javascripts ou fichiers jquery trouvés.
Je viens d'ajouter des mappages au servlet "par défaut". Les éléments suivants ont été ajoutés au fichier web.xml:
Cela devrait filtrer les demandes de fichiers javascript et css de l'objet DispatcherRequest.
Encore une fois, je ne sais pas si c'est ce que vous recherchez, mais cela a fonctionné pour moi. Je pense que "par défaut" est le nom du servlet par défaut dans JBoss. Je ne sais pas trop ce que c'est pour les autres serveurs.
la source
<url-pattern>
tags à l'intérieur du même<servlet-mapping>
Il existe un autre poste de débordement de pile qui a une excellente solution .
Il ne semble pas être spécifique à Tomcat, est simple et fonctionne très bien. J'ai essayé quelques solutions dans ce post avec Spring MVC 3.1, mais j'ai eu des problèmes pour que mon contenu dynamique soit servi.
En bref, il dit d'ajouter un mappage de servlet comme celui-ci:
la source
J'ai trouvé un moyen de contourner cela en utilisant le filtre d'urlrewrite de tuckey. N'hésitez pas à donner une meilleure réponse si vous en avez une!
Dans web.xml:
Dans urlrewrite.xml:
Cela signifie que tout uri avec un '.' dedans (comme style.css par exemple) ne sera pas réécrit.
la source
<mvc:resources/>
, comme l'a démontré @Joris.Je viens de me débattre avec ce problème dans Spring MVC 3.0 et j'ai d'abord choisi l'option UrlRewriteFilter. Cependant, je n'étais pas satisfait de cette solution car elle "ne se sentait pas bien" (je ne suis pas le seul - voir le lien ci-dessus vers les forums de printemps où le mot "hack" apparaît plusieurs fois).
J'ai donc trouvé une solution similaire à "Inconnu (Google)" ci-dessus, mais j'ai emprunté l'idée d'avoir tout le contenu statique servi à partir de / statique / (tiré de la version Spring Roo de l'application Pet Store). Le servlet "par défaut" n'a pas fonctionné pour moi, mais le Spring Webflow ResourceServlet l'a fait (également tiré de l'application générée par Spring Roo).
Web.xml:
La seule modification que j'ai apportée aux JSP a été d'ajouter le chemin / statique / aux URL pour CSS, JS et les images. Par exemple, "$ {pageContext.request.contextPath} /static/css/screen.css".
pour les utilisateurs de Maven, la dépendance pour "org.springframework.js.resource.ResourceServlet" est:
la source
Ma propre expérience avec ce problème est la suivante. La plupart des pages Web et des livres liés à Spring semblent suggérer que la syntaxe la plus appropriée est la suivante.
La syntaxe ci-dessus suggère que vous pouvez placer vos ressources statiques (CSS, JavaScript, images) dans un dossier nommé "ressources" à la racine de votre application, c'est-à-dire / webapp / resources /.
Cependant, d'après mon expérience (j'utilise Eclipse et le plugin Tomcat), la seule approche qui fonctionne est si vous placez votre dossier de ressources dans WEB_INF (ou META-INF). Ainsi, la syntaxe que je recommande est la suivante.
Dans votre JSP (ou similaire), référencez la ressource comme suit.
Inutile de mentionner que toute la question s'est posée uniquement parce que je voulais que mon servlet répartiteur Spring (contrôleur frontal) intercepte tout, tout dynamique, c'est-à-dire. J'ai donc ce qui suit dans mon web.xml.
Enfin, puisque j'utilise les meilleures pratiques actuelles, j'ai ce qui suit dans mon servlet de contrôleur frontal xml (voir ci-dessus).
Et j'ai les éléments suivants dans mon implémentation de contrôleur réelle, pour m'assurer d'avoir une méthode par défaut pour gérer toutes les demandes entrantes.
J'espère que ça aide.
la source
J'ai eu le même problème et j'ai trouvé la réponse de Joris très utile. Mais en plus je dois ajouter
dans le fichier de configuration du servlet. Sans cela, le mappage des ressources ne fonctionnera pas et tous les gestionnaires cesseront de fonctionner. J'espère que cela aidera quelqu'un.
la source
L'URLRewrite est une sorte de "hack" si vous voulez l'appeler ainsi. Cela revient à dire que vous réinventez la roue; car il existe déjà des solutions. Une autre chose à retenir est le serveur Http = contenu statique et le serveur d'applications = contenu dynamique (c'est ainsi qu'ils ont été conçus). En déléguant les responsabilités appropriées à chaque serveur, vous maximisez l'efficacité ... mais de nos jours, cela n'est probablement qu'une préoccupation dans un environnement à performances critiques et quelque chose comme Tomcat fonctionnerait très bien dans les deux rôles la plupart du temps; mais c'est quand même quelque chose à garder à l'esprit.
la source
Je l'ai résolu de cette façon:
Cela fonctionne sur Tomcat et bien sûr Jboss. Cependant, j'ai finalement décidé d'utiliser la solution que Spring propose (comme mentionné par rozky) qui est beaucoup plus portable.
la source
J'ai utilisé les deux façons qui sont basées sur l'urlrewrite et les annotations dans Spring mvc 3.0.x et j'ai trouvé que l'approche basée sur les annotations est la plus appropriée qui est
L'approche basée sur les annotations sera donc la bonne affaire.
la source
À partir du printemps 3, toutes les ressources doivent être cartographiées de manière différente. Vous devez utiliser la balise pour spécifier l'emplacement des ressources.
Exemple :
De cette façon, vous demandez au servlet du répartiteur de rechercher dans les ressources du répertoire pour rechercher le contenu statique.
la source
Ma façon de résoudre ce problème consiste à placer toutes vos actions avec un préfixe spécifique comme "web" ou "service" et à configurer que toutes les URL avec ce préfixe seront interceptées par le DispatcherServlet.
la source
J'ajoute juste trois règles avant la règle par défaut du printemps (/ **) à l'urlrewritefilter de tuckey (urlrewrite.xml) pour résoudre le problème
la source
Je sais qu'il existe quelques configurations pour utiliser le contenu statique, mais ma solution est que je crée simplement un dossier d'applications Web en bloc dans votre tomcat. Cette "webapp en vrac" ne sert que tous les contenus statiques sans servir d'applications. Il s'agit d'une solution simple et sans douleur pour servir des contenus statiques à votre webapp réelle de printemps.
Par exemple, j'utilise deux dossiers webapp sur mon tomcat.
Si je veux utiliser javascript, j'ajoute simplement l'URI de mon fichier javascript.
EX> /resources/path/to/js/myjavascript.js
Pour les images statiques, j'utilise la même méthode.
EX> /resources/path/to/img/myimg.jpg
Enfin, je mets " la contrainte de sécurité " sur mon tomcat pour bloquer l'accès au répertoire réel. J'ai mis le rouleau d'utilisateur "personne" à la contrainte afin que la page génère "erreur interdite 403" lorsque les gens ont essayé d'accéder au chemin du contenu statique.
Jusqu'à présent, cela fonctionne très bien pour moi. J'ai également remarqué que de nombreux sites Web populaires comme Amazon, Twitter et Facebook utilisent différents URI pour diffuser des contenus statiques. Pour le savoir, faites un clic droit sur un contenu statique et vérifiez leur URI.
la source
Cela a fait le vrai travail dans mon cas
dans web.xml:
...
la source
Pour une configuration de ressort basée sur java, vous pouvez utiliser les éléments suivants
Utilisation de ResourceHandlerRegistry qui stocke les enregistrements de gestionnaires de ressources pour servir des ressources statiques.
Plus d'informations @ WebMvcConfigurerAdapter qui définit les méthodes de rappel pour personnaliser la configuration Java pour Spring MVC activée via @EnableWebMvc.
la source
Après avoir rencontré et suivi le même processus de prise de décision décrit ici, j'ai décidé d'aller avec la proposition ResourceServlet qui fonctionne très bien.
Notez que vous obtenez plus d'informations sur la façon d'utiliser webflow dans votre processus de construction maven ici: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html
Si vous utilisez le référentiel central Maven standard, l'artefact est (à l'opposé du bundle source de sources mentionné ci-dessus):
la source
Cela peut être réalisé de trois manières au moins.
Solutions :
Pour des exemples de code complets sur la façon d'y parvenir, veuillez vous reporter à ma réponse dans un autre article: Comment mapper les demandes au fichier HTML dans Spring MVC?
la source
Le problème est avec URLPattern
Modifiez votre modèle d'URL sur le mappage de votre servlet de "/" à "/ *"
la source
et si vous souhaitez utiliser une configuration basée sur des annotations, utilisez le code ci-dessous
la source
Placer le contenu statique comme css, js dans le chemin suivant
la source