Ce qui est mieux, renvoie «ModelAndView» ou «String» sur le contrôleur spring3

115

La manière de retourner ModelAndView

@RequestMapping(value = "/list", method = RequestMethod.GET)
public ModelAndView list(
    @UserAuth UserAuth user, 
    ModelAndView mav) {

    if (!user.isAuthenticated()) {
        mav.setViewName("redirect:http://www.test.com/login.jsp");
        return mav;
    }

    mav.setViewName("list");
    mav.addObject("articles", listService.getLists());

    return mav;
}

La manière de retourner String

@RequestMapping(value = "/list", method = RequestMethod.GET)
public String list(
    @UserAuth UserAuth user, 
    Model model) {

    if (!user.isAuthenticated()) {
        return "redirect:http://www.test.com/login.jsp";
    }

    model.addAttribute("articles", listService.getLists());

    return "list";
}

Celles-ci fonctionnent de la même manière. quel est le meilleur moyen? et quelle est la différence?

Gentlejo
la source

Réponses:

129

Il n'y a pas de meilleur moyen. Les deux sont parfaitement valables. Celui que vous choisissez d'utiliser dépend de celui qui convient le mieux à votre application - Spring vous permet de le faire dans les deux sens.

Historiquement, les deux approches proviennent de versions différentes de Spring. L' ModelAndViewapproche était le principal moyen de renvoyer à la fois des informations sur le modèle et la vue à partir d'un contrôleur avant le printemps 2.0. Vous pouvez maintenant combiner le Modelparamètre et la Stringvaleur de retour, mais l'ancienne approche est toujours valide.

skaffman
la source
8
Par conséquent, l'approche String est la nouvelle.
akshayb
1
@skaffman Pouvez-vous expliquer s'il y a une différence dans la façon dont Spring le traite comme le préfixe de chemin de contexte, etc.
Keerthivasan
veuillez regarder ( stackoverflow.com/questions/37410839/… ). en utilisant ModelAndView, j'ai eu ce problème
Vishnu KR
15

Je voudrais également m'ajouter 2 cents. La deuxième approche est plus orientée vers les conventions, c'est-à-dire que le développeur mentionne explicitement quelle est sa vue, mais il est implicite que la chaîne de retour est le nom de la vue. Donc moins de codage, lisible et standard. Bien mieux que l'ancienne avec ModelAndView

M Sach
la source