web-dev-qa-db-fra.com

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

J'essaie de faire l'une de ces applications standard printemps mvc hello world, mais avec le twist que je voudrais mapper le contrôleur à la racine. (par exemple: http://numberformat.wordpress.com/2009/09/02/hello-world-spring-mvc-with-annotations/ ). Donc, la seule vraie différence est qu'ils le cartographient to Host\appname\quelque chose et je voudrais mapper à Host\appname.

J'ai placé mon index.jsp dans src\main\webapp\jsp et l'a mappé dans le fichier web.xml en tant que fichier de bienvenue . 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";
  }

En tant que 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:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

    <!-- Index -->
    <welcome-file-list>
        <welcome-file>/jsp/index.jsp</welcome-file>
    </welcome-file-list>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>springweb</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

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

</web-app>

Le fichier mvc-dispatcher-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config />
    <context:component-scan base-package="de.claude.test.*" />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

J'utilise Spring 3.0.5.release

Ou n'est-ce pas possible et dois-je replacer mon index.jsp à la racine de l'info-Web et placer une redirection vers un emplacement situé dans mon jsp afin que le contrôleur l'utilise?

59
Hugo

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

Le problème était que quelque chose (Tomcat?) Transférait de "/" à "/index.jsp" lorsque le fichier index.jsp se trouvait dans mon répertoire WebContent. Quand j'ai enlevé cela, la demande n'a plus été transmise.

Ce que j'ai fait pour diagnostiquer le problème a été de créer un gestionnaire de requête fourre-tout et d'imprimer le chemin d'accès du servlet à la console. Cela m'a montré que même si ma demande concernait http: // localhost/myapp/ , le chemin d'accès à la servlet était remplacé par "/index.html". Je m'attendais à ce que ce soit "/".

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

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

  1. Dans votre mappage de servlets, utilisez <url-pattern>/</url-pattern>
  2. Dans votre contrôleur, utilisez RequestMapping("/")
  3. Débarrassez-vous de welcome-file-list dans web.xml
  4. _ {Aucun fichier présent dans le contenu Web ne serait considéré comme une page par défaut} (index.html, index.jsp, default.html, etc.)

J'espère que cela t'aides.

71
Mike M. Lin

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 fichier WAR.

<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
<c:redirect url="/welcome.html"/>

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 rendre votre (nouveau) index JSP accessible, déclarez

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
18

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

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

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

E.g http://localhost:8080/myapp

Cela fonctionne pour moi, mais quelques différences:

  • Je n'ai pas de liste de fichiers de bienvenue dans web.xml
  • Je n'ai pas de @RequestMapping au niveau de la classe.
  • Et au niveau de la méthode, simplement @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), c'est ma configuration et cela fonctionne avec Spring MVC 3.0.5.

Une dernière chose. Vous ne montrez pas la configuration de votre distributeur dans web.xml, mais vous avez peut-être un preffixe. Ce doit être quelque chose comme ça:

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

Si ce n'est pas votre cas, vous aurez besoin d'un filtre de réécriture d'URL ou essayez la solution de redirection.

EDIT: Répondant à votre question, ma configuration du résolveur de vues est également un peu différente:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view/" />
    <property name="suffix" value=".jsp" />
</bean>
7
sinuhepop

Il peut être résolu de manière plus simple: Dans web.xml

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.htm</welcome-file>
</welcome-file-list>

Après cela, utilisez les contrôleurs que vous voulez traiter avec index.htm avec @RequestMapping ("index.htm"). Ou utilisez simplement le contrôleur d'index

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="index.htm">indexController</prop>
        </props>
    </property>
<bean name="indexController" class="org.springframework.web.servlet.mvc.ParameterizableViewController"
      p:viewName="index" />
</bean>
3
Roman Platonov

Il suffit de mettre une entrée supplémentaire dans votre fichier XML print i.e.mvc-dispatcher-servlet.xml

<mvc:view-controller path="/" view-name="index"/>

Après avoir placé ceci dans votre fichier xml, placez votre vue par défaut ou votre fichier jsp dans votre dossier JSP personnalisé, comme indiqué dans le fichier mvc-dispatcher-servlet.xml.

changez index avec votre nom jsp.

1
Shalin Patel

Une façon d'y parvenir est de mapper votre fichier de bienvenue sur le chemin de demande de votre contrôleur dans le fichier web.xml:

[web.xml]

<web-app ...

<!-- Index -->
<welcome-file-list>
    <welcome-file>home</welcome-file>
</welcome-file-list>

</web-app>

[LoginController.Java]

@Controller("loginController")
public class LoginController{

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

La solution que j'utilise dans mes applications Web SpringMVC consiste à créer une classe DefaultController simple, comme suit: -

@Controller
public class DefaultController {

    private final String redirect;

    public DefaultController(String redirect) {
        this.redirect = redirect;
    }

    @RequestMapping(value = "/")
    public ModelAndView redirectToMainPage() {
        return new ModelAndView("redirect:/" + redirect);
    }

}

La redirection peut être injectée en utilisant la configuration de ressort suivante: -

<bean class="com.adoreboard.farfisa.controller.DefaultController">
    <constructor-arg name="redirect" value="${default.redirect:loginController}"/>
</bean>

Le ${default.redirect:loginController} sera par défaut à loginController mais peut être modifié en insérant default.redirect=something_else dans un fichier de propriétés de ressort/en définissant une variable d'environnement, etc.

Comme @Mike a mentionné ci-dessus, j'ai aussi: -

  • Je me suis débarrassé de la section <welcome-file-list> ... </welcome-file-list> dans le fichier web.xml.
  • Aucun contenu dans WebContent ne serait considéré comme une page par défaut (index.html, index.jsp, default.html, etc.)

Cette solution permet à Spring de s’inquiéter davantage des redirections qui peuvent ou non être ce que vous aimez.

0
bobmarksie