Что лучше, верните «ModelAndView» или «String» на контроллере spring3.

115

Способ возврата 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;
}

Способ возврата 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";
}

Они работают одинаково. какой способ лучше? а какая разница?

gentlejo
источник

Ответы:

129

Нет лучшего способа. Оба варианта абсолютно верны. Какой из них вы выберете, зависит от того, какой из них лучше подходит для вашего приложения - Spring позволяет сделать это в любом случае.

Исторически эти два подхода исходят из разных версий Spring. ModelAndViewПодход был основным способом возвращения как модель и просматривать информацию из контроллера в пре-Spring 2.0. Теперь вы можете комбинировать Modelпараметр и Stringвозвращаемое значение, но старый подход по-прежнему действует.

skaffman
источник
8
Следовательно, подход String является новым.
акшайб
1
@skaffman Можете ли вы объяснить, есть ли какие-либо различия в способах обработки Spring, таких как добавление contextpath и т. д.
Keerthivasan
пожалуйста, посмотрите ( stackoverflow.com/questions/37410839/… ). при использовании ModelAndView у меня возникла эта проблема
Вишну К.Р.
15

Я также хотел бы добавить мне 2 цента. Второй подход больше ориентирован на соглашение, т.е. разработчик явно указывает, что он представляет, но неявно, что возвращаемая строка - это имя представления. Так что меньше кодирования, удобочитаемости и стандартно. Намного лучше, чем старый способ с ModelAndView

M Sach
источник