春天的@ModelAttribute和@SessionAttrubutes之间有什么区别?

时间:2014-03-12 11:11:41

标签: spring-mvc

浏览了一段时间并访问了几个网站后,我无法获得清晰度。所以请任何人解释我@ModelAttribute究竟做了什么

1 个答案:

答案 0 :(得分:0)

Spring API文档通常非常好,所以我总是建议在尝试理解框架时作为起点。

@ModelAttribute的Javadocs说:

  

绑定方法参数或方法返回值的注释   到命名的模型属性,暴露给Web视图。支持的   用于{@link RequestMapping}带注释的处理程序类。

一般来说,@ModelAttribute是控制器声明其返回值由Spring自动绑定到Model中的方法,并定义Spring自动绑定到方法参数中的Model值。

例如:

@ModelAttribute("myValue")
public Foo myValue()
{
   return new MyFoo();
}

这基本上是对Spring的说法:

  

每当此Controller被映射为为请求提供服务时,请调用此方法并将返回值绑定到“myValue”键下的Model中。

这与:

相同
@RequestMapping("/foo")
public ModelAndView foo()
{
    ModelAndView mav = new ModelAndView("myView");
    mav.addObject("myValue", new Foo());
    return mav;
}

这里没有正确和错误的方法,它只是促进了建立模型的不同方式。

@ModelAttribute注释也可用于控制器的方法参数。所以你可以拥有以下内容:

@RequestMapping("/doFoo") 
public void doFoo(@ModelAttribute("myValue")Foo foo)
{
    Do some stuff here...
}

同样,这是Spring提供的一种方便的方法,可以促进实现控制器的不同方式。它完全相同:

@RequestMapping("/doFoo") 
public void doFoo(ModelAndView modelAndView)
{
    Foo foo = (Foo)modelAndView.getModel().get("myValue");
    Do some stuff here...
}

@SessionAttribute以完全相同的方式工作,但顾名思义,该值绑定到用户的HTTPSession或从用户的HTTPSession读取。