Cuál es mejor, devuelva "ModelAndView" o "String" en el controlador spring3

115

La forma de retorno 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 forma de retorno 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";
}

Estos funcionan igual. cual es mejor manera? y cual es la diferencia?

gentiljo
fuente

Respuestas:

129

No hay mejor manera. Ambos son perfectamente válidos. El que elija utilizar depende de cuál se adapte mejor a su aplicación: Spring le permite hacerlo de cualquier manera.

Históricamente, los dos enfoques provienen de diferentes versiones de Spring. El ModelAndViewenfoque fue la forma principal de devolver tanto la información del modelo como de la vista desde un controlador en versiones anteriores a Spring 2.0. Ahora puede combinar el Modelparámetro y el Stringvalor de retorno, pero el enfoque anterior sigue siendo válido.

skaffman
fuente
8
Por lo tanto, el enfoque String es el nuevo.
akshayb
1
@skaffman ¿Puede explicar si hay alguna diferencia en la forma en que Spring lo procesa, como anteponer la ruta de contexto, etc.?
Keerthivasan
por favor mire ( stackoverflow.com/questions/37410839/… ). mientras usaba ModelAndView tengo este problema
Vishnu KR
15

Me gustaría agregarme 2 centavos también. El segundo enfoque está más orientado hacia las convenciones, es decir, el desarrollador menciona explícitamente cuál es su vista, pero está implícito que la cadena de retorno es el nombre de la vista. Por tanto, menos codificación, legible y estándar. Mucho mejor que la forma anterior con ModelAndView

M Sach
fuente