O que é melhor, retorne “ModelAndView” ou “String” no controlador spring3

115

A 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;
}

A maneira de retornar 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";
}

Estes funcionam da mesma forma. qual é a melhor maneira? e qual é a diferença?

gentlejo
fonte

Respostas:

129

Não existe maneira melhor. Ambos são perfeitamente válidos. Qual você escolhe usar depende de qual se adapta melhor à sua aplicação - o Spring permite que você faça isso de qualquer maneira.

Historicamente, as duas abordagens vêm de diferentes versões do Spring. A ModelAndViewabordagem era a principal forma de retornar informações de modelo e visualização de um controlador no pré-Spring 2.0. Agora você pode combinar o Modelparâmetro e o Stringvalor de retorno, mas a abordagem antiga ainda é válida.

skaffman
fonte
8
Portanto, a abordagem String é a nova.
akshayb
1
@skaffman Você pode explicar se há alguma diferença na maneira como o Spring processa como prefixar o caminho de contexto etc.
Keerthivasan
por favor olhe ( stackoverflow.com/questions/37410839/… ). ao usar ModelAndView eu tenho este problema
Vishnu KR
15

Eu gostaria de adicionar 2 centavos também. A segunda abordagem é mais voltada para a convenção, ou seja, o desenvolvedor menciona explicitamente qual é a sua visão, mas está implícito que a string de retorno é o nome da visão. Portanto, menos codificação, legível e padrão. Muito melhor do que a maneira mais antiga com ModelAndView

M Sach
fonte