60 votes

Spring MVC : comment créer un contrôleur par défaut pour la page d'index ?

Je essaie de réaliser l'une de ces applications standard Hello World en utilisant Spring MVC, mais avec la particularité que je voudrais mapper le contrôleur à la racine. (par exemple: http://numberformat.wordpress.com/2009/09/02/hello-world-spring-mvc-with-annotations/) La seule vraie différence est qu'ils le mappent sur host\appname\something et je voudrais le mapper sur host\appname.

J'ai placé mon index.jsp dans src\main\webapp\jsp et je l'ai mappé dans le fichier web.xml en tant que fichier d'accueil. J'ai essayé:

@Controller("loginController")
public class LoginController{

  @RequestMapping("/")
  public String homepage2(ModelMap model, HttpServletRequest request, HttpServletResponse response){
    System.out.println("blablabla2");
    model.addAttribute("sigh", "lesigh");
    return "index";
  }

Comme mon contrôleur mais je ne vois rien apparaître dans la console de mon tomcat. Est-ce que quelqu'un sait où je me trompe?

Mon web.xml:

        /jsp/index.jsp

        contextConfigLocation
        /WEB-INF/mvc-dispatcher-servlet.xml

        springweb
        org.springframework.web.servlet.DispatcherServlet
        1

        springweb
        /

Le fichier mvc-dispatcher-servlet.xml:

J'utilise Spring 3.0.5.release

Ou est-ce que ce n'est pas possible et dois-je remettre mon index.jsp à la racine de web-inf et mettre une redirection quelque part dans mon jsp pour que le contrôleur le récupère?

71voto

Mike M. Lin Points 3968

J'ai eu le même problème, même après avoir suivi la configuration de Sinhue, mais je l'ai résolu.

Le problème était que quelque chose (Tomcat ?) redirigeait de "/" vers "/index.jsp" lorsque j'avais le fichier index.jsp dans mon répertoire WebContent. Lorsque je l'ai supprimé, la demande n'a plus été redirigée.

Ce que j'ai fait pour diagnostiquer le problème a été de créer un gestionnaire de demande attrape-tout et d'imprimer le chemin du servlet dans la console. Cela m'a montré que même si la demande que je faisais était pour http://localhost/myapp/, le chemin du servlet était modifié en "/index.html". Je m'attendais à ce qu'il soit "/".

@RequestMapping("*")
public String hello(HttpServletRequest request) {
    System.out.println(request.getServletPath());
    return "hello";
}

Donc, en résumé, les étapes à suivre sont :

  1. Dans votre servlet-mapping, utilisez /
  2. Dans votre contrôleur, utilisez RequestMapping("/")
  3. Supprimez la liste de fichiers de bienvenue dans web.xml
  4. Ne laissez aucun fichier dans WebContent qui serait considéré comme une page par défaut (index.html, index.jsp, default.html, etc)

J'espère que cela aidera.

18voto

La redirection est une option. Une chose que vous pouvez essayer est de créer une page d'index très simple que vous placez à la racine du WAR qui ne fait rien d'autre que de rediriger vers votre contrôleur comme

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

Ensuite, vous mappez votre contrôleur avec cette URL avec quelque chose comme

@Controller("loginController")
@RequestMapping(value = "/welcome.html")
public class LoginController{
...
}

Enfin, dans web.xml, pour que votre (nouveau) JSP d'index soit accessible, déclarez

    index.jsp

12voto

Nous pouvons simplement mapper une méthode Controller pour la vue par défaut. Par exemple, nous avons un index.html comme page par défaut.

@RequestMapping(value = "/", method = GET)
public String index() {
    return "index";
}

Une fois fait, nous pouvons accéder à la page avec le contexte d'application par défaut.

Par exemple http://localhost:8080/myapp

7voto

sinuhepop Points 7075

Cela fonctionne pour moi, mais avec quelques différences :

  • Je n'ai pas de welcome-file-list dans web.xml
  • Je n'ai pas de @RequestMapping au niveau de la classe.
  • Et au niveau de la méthode, juste @RequestMapping("/")

Je sais que ce ne sont pas de grandes différences, mais je suis assez sûr (je ne suis pas au travail maintenant) que c'est ma configuration et cela fonctionne avec Spring MVC 3.0.5.

Une dernière chose. Vous ne montrez pas votre configuration de dispatcher dans web.xml, mais peut-être avez-vous un préfixe. Il doit ressembler à ceci :

    myServletName
    /

Si ce n'est pas votre cas, vous aurez besoin d'un filtre url-rewrite ou essayez la solution de redirection.

EDIT: En répondant à votre question, ma configuration de résolveur de vue est également un peu différente :

3voto

Roman Platonov Points 11

Il peut être résolu d'une manière plus simple : dans web.xml

    dispatcher
    *.htm

    index.htm

Après cela, utilisez des contrôleurs pour traiter index.htm avec @RequestMapping("index.htm"). Ou utilisez simplement le contrôleur index

            indexController

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