web-dev-qa-db-fra.com

Comment retourner une page html depuis un contrôleur reposant au démarrage du printemps?

Je veux renvoyer une simple page html du contrôleur, mais je ne reçois que le nom du fichier, pas son contenu. Pourquoi?

Ceci est mon code de contrôleur:

@RestController
public class HomeController {

    @RequestMapping("/")
    public String welcome() {
        return "login";
    }
}

Voici la structure de mon projet:

[enter image description here

10
Gustavo

Lorsque vous utilisez @RestController comme ceci:

@RestController
public class HomeController {

    @RequestMapping("/")
    public String welcome() {
        return "login";
    }
}

C’est la même chose que vous le faites dans un contrôleur normal:

@Controller
public class HomeController {

    @RequestMapping("/")
    @ResponseBody
    public String welcome() {
        return "login";
    }
}

L'utilisation de @ResponseBody renvoie return "login"; en tant qu'objet String. Tout objet que vous renvoyez sera attaché en tant que payload dans le corps HTTP en tant que JSON.

C'est pourquoi vous obtenez juste login dans la réponse.

16
kukkuz

La réponse de Kukkuz n'a pas fonctionné pour moi jusqu'à ce que j'ajoute cette dépendance dans le fichier pom:

<!-- Spring boot Thymeleaf -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Du guide ici .

En plus de mettre à jour les ressources du registre comme indiqué ici

Il a ensuite commencé à bien fonctionner. Si, à l'avenir, quelqu'un rencontre le même problème et si la première réponse ne résout pas votre problème, suivez ces 2 autres étapes après avoir utilisé le code de la réponse de @ Kukkuz pour voir si cela fait une différence.

4
Silmarilos

Remplacez @RestController par @Controller.

2
Noshin

Vous pouvez essayer d'utiliser ModelAndView:

@RequestMapping("/")
public ModelAndView index () {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("index");
    return modelAndView;
}
2
Happy Nguyen

Remplacez @Restcontroller par @ controller. @ Restcontroller renvoie uniquement le contenu, pas les pages html et jsp. 

1
Prasad Reddy

La String vous revenez ici:

 return "login";

Est-ce réellement le contenu entier que vous renvoyez au navigateur?.

Si vous souhaitez que le contenu d'un fichier soit renvoyé, vous pouvez:

  1. Fichier ouvert
  2. Lire le contenu dans String
  3. Renvoyer la valeur

Vous pouvez passer avec ceci répondre à la question Service de démarrage Spring pour télécharger un fichier

0
ppeterka

La forme la plus correcte et la plus moderne consiste à utiliser IoC pour insérer des dépendances dans la méthode de noeud final, comme dans le cas de thymeleafModel ...

 @Controller 
 public class GreetingController {
        @GetMapping("/greeting") 
        public String greeting(
            @RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
             model.addAttribute("name", name); 
             return "greeting"; 
             // returns the already proccessed model from src/main/resources/templates/greeting.html 
      }
 }

Voir l'exemple complet à l'adresse: https://spring.io/guides/gs/serving-web-content/

Vous n'obtenez que le nom car vous ne retournez que le nom return "login";. C'est @RestController et ce contrôleur renvoie des données plutôt qu'une vue. De ce fait, vous n'obtenez que le contenu que vous renvoyez à partir de la méthode.

Si vous souhaitez afficher une vue avec ce nom, vous devez utiliser Spring MVC, voir cet exemple .

0
Aleksandr Podkutin

Vous devriez utiliser login.html. Et remplacez RestController par Controller

0
Kairat Doshekenov

Je n'utilise pas Thymeleaf et la seule façon dont cela a fonctionné pour moi était avec @Controllerin dans la classe et 

@RequestMapping(method = RequestMethod.GET, value = "/")
public String index() {
    return "index.html";
}
0
Johnny Willer