创建新的modelandview或将模型作为方法参数传递有什么区别

时间:2012-02-20 14:46:47

标签: java spring spring-mvc

我养成了这样做的习惯,所以在我的单元测试中我可以检查添加到模型中的内容:

@RequestMapping(value = "/Foo", method = RequestMethod.GET)
public ModelAndView goHome()
{
  ModelandView mav = new ModelAndView("foobar.jsp");
  mav.addObject("bar", new Bar());
  return mav;
}

这样做会更好:

@RequestMapping(value = "/Foo", method = RequestMethod.GET)
public String goHome(final Model model)
{
  model.addAttribute("bar", new Bar());
  return "foobar.jsp";
}

1 个答案:

答案 0 :(得分:6)

差异只是语义上的。如果你没有创建ModelAndView对象,Spring将为你做。

通常情况下,第二种方法更为可取,因为单元测试更容易,特别是如果您传递Map而不是模型。


编辑澄清测试(基于jUnit)。我发现以下签名更可取:

@RequestMapping(value = "/Foo", method = RequestMethod.GET)
public String goHome(final Map model) {
    model.addAttribute("bar", new Bar());
    return "foobar.jsp";
}

这使我们无需了解Spring即可创建测试

@Test
public void testGoHome() {
    // Setup
    Controller controller = ...
    Map<String, Bar> model = new HashMap<String, Bar>();

    // Test
    assertEquals("foobar.jsp", controller.goHome(model));
    assertNotNull(model.get("bar"));
}

此示例基于Map,但如果您愿意,也可以是ModelMap甚至Model