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:
[
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.
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.
Remplacez @RestController
par @Controller
.
Vous pouvez essayer d'utiliser ModelAndView
:
@RequestMapping("/")
public ModelAndView index () {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
return modelAndView;
}
Remplacez @Restcontroller par @ controller. @ Restcontroller renvoie uniquement le contenu, pas les pages html et jsp.
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:
Vous pouvez passer avec ceci répondre à la question Service de démarrage Spring pour télécharger un fichier
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 .
Vous devriez utiliser login.html
. Et remplacez RestController
par Controller
Je n'utilise pas Thymeleaf et la seule façon dont cela a fonctionné pour moi était avec @Controller
in dans la classe et
@RequestMapping(method = RequestMethod.GET, value = "/")
public String index() {
return "index.html";
}