29 votes

À l'aide de Spring, mappage à la racine dans web.xml, les ressources statiques sont introuvables

Ce que j'essaie de faire est de faire correspondre les requêtes à la servlet racine (la terminologie correcte?). J'en suis au point où les Url sont mappées à la vue correcte, mais tout le contenu statique - css, javascript, images - qui est la partie de la page ne peut pas être trouvé.

Donc, dans mon web.xml ma servlet balise ressemble à ceci

<servlet-mapping>
    <servlet-name>springapp</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Mon contrôleur ressemble à quelque chose comme ceci:

@RequestMapping("/shop")
public class TheShopController extends MyBaseController {

    public static String VIEW = "Tile.Shop";

    @Override
    @RequestMapping(method = RequestMethod.GET)
    protected ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp) {
        ModelAndView mav = new ModelAndView(VIEW);
        return mav;
    }

}

MyBaseController est très simple. Il ressemble à ceci:

public abstract class MyBaseController extends AbstractController {

    protected Logger log = Logger.getLogger(getClass());

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) 
        throws Exception {

        ModelAndView mav = processRequest(req, resp);
        return mav;
    }

    protected abstract ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp);
}

Je suis en utilisant des Tuiles de mon point de vue de la couche. Ma configuration est comme suit:

/WEB-INF/tiles-defs.xml

Comme je l'ai mentionné, les points de vue sont trouvés, mais les ressources statiques, qui sont un port de la page ne peut pas être trouvé. Voici quelques exemples de déconnexion de mettre:

2010-01-24 17:25:01,777 DEBUG [http-8080-7] servlet.DispatcherServlet (DispatcherServlet.java:690) - DispatcherServlet avec le nom "springapp' le traitement de la requête GET pour [/springapp/static/css/compte.css] 2010-01-24 17:25:01,778 WARN [http-8080-4] servlet.DispatcherServlet (DispatcherServlet.java:962) - Aucune correspondance trouvée pour la requête HTTP avec URI [/springapp/static/css/shop.css] dans DispatcherServlet avec nom 'springapp' 2010-01-24 17:25:01,778 DEBUG [http-8080-6] servlet.FrameworkServlet (FrameworkServlet.java:677) - avec Succès la demande dûment remplie 2010-01-24 17:25:01,778 WARN [http-8080-5] servlet.DispatcherServlet (DispatcherServlet.java:962) - Pas de cartographie trouvé pour la requête HTTP avec l'URI [/springapp/static/css/offre.css] dans DispatcherServlet avec le nom "springapp' 2010-01-24 17:25:01,778 AVERTIR [http-8080-3] servlet.DispatcherServlet (DispatcherServlet.java:962) - Aucune correspondance trouvée pour la requête HTTP avec l'URI [/springapp/static/css/défilement boutons.css] dans DispatcherServlet avec le nom de "springapp'

Va http://localhost:8080/springapp/shop fonctionne très bien mais le css et les images sont manquantes.

Je pense qu'en utilisant des Tuiles est en quelque sorte de compliquer les choses, mais je suis réticent à se débarrasser de lui. Je me demande si je dois ajuster mon point de vue la configuration de la résolution doit être tweeked en quelque sorte? Le chaînage de vue des résolveurs peut-être? Je suis juste pas que dans l'accomplissement de cette.

61voto

axtavt Points 126632

Le problème est que les demandes pour le contenu statique aller à la dispatcherServlet, parce que c'est mappé comme <url-pattern>/</url-pattern>. C'est un problème très commun dans les applications avec de "repos" de l'Url (qui est, sans aucun préfixe dans l' DispatcherServlet mapping).

Il y a plusieurs façons de résoudre ce problème:


Depuis Le Printemps 3.x le moyen privilégié pour accéder à des ressources statiques est d'utiliser <mvc:resources>: web.xml:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping>

Printemps config:

<!-- Handles GET requests for /resources/** by efficiently serving static content 
    in the ${webappRoot}/resources dir --> 
<mvc:resources mapping="/resources/**" location="/resources/" /> 

Voir aussi MVC Simplifications au Printemps 3


1. Utiliser la réécriture d'URL, filtre
Voir mvc-basic exemple ici

2. Définir un préfixe pour l' default servlet:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

C'est, demande d' /static/images/image.png sera de retour le fichier nommé /images/image.png Cependant, cela est incompatible à travers les différents conteneurs de servlet (ne travaille pas de la Jetée), voir les solutions de contournement ici

3. Définir le contenu statique des extensions pour l' default servlet:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

4. Ne pas utiliser Reposant Url, utiliser des Url avec le préfixe:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping>

5. Ne pas utiliser Reposant Url, utiliser des Url avec l'extension:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>

5voto

Solubris Points 1805

Quelqu'un at-il envisagé d'utiliser ceci:

 <!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource requests to the container's default Servlet -->
<mvc:default-servlet-handler/>
 

Voici les derniers documents du printemps à ce sujet: http://static.springsource.org/spring/docs/3.1.2.RELEASE/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-default-servlet -handler

4voto

ngeek Points 1638

Comme une alternative à la solution proposée nombre (2 par défaut à la servlet, qui se comporte différemment de conteneur de servlet pour conteneur de servlet), je vous recommande de prendre un coup d'oeil dans les Ressources de Servlet (org.springframework.js.resource.ResourceServlet) de la Spring Webflow projet.

Pour plus de détails, jetez un oeil à http://stackoverflow.com/questions/1483063/spring-mvc-3-and-handling-static-content-am-i-missing-something

1voto

Nereis Points 100

J'ai le même problème mais au lieu d'utiliser spring, je fais mon petit filtre qui redirige root vers ma page de démarrage comme ça:

     HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String pageName = req.getServletPath();

    if(pageName.equals("/")) {
        res.sendRedirect( req.getContextPath() + "/start" );
    } else {
        chain.doFilter(request, response);
    }
 

C'est peut-être une astuce, mais cela semble fonctionner correctement avec un petit code. Cliquez ici pour plus d'informations sur les filtres http://www.oracle.com/technetwork/java/filters-137243.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X