@SessionAttribute:模型何时初始化?

时间:2011-12-27 13:56:05

标签: spring-mvc spring-annotations

当我想在Spring 3中的Session范围中使用模型时,我使用了foll。控制器中的注释: -

    @SessionAttribute("myModel");

但是,这只是myModel的声明。它在什么时候被初始化,以便我在View中使用它。 Spring如何知道这个模型的类型?

有人可以用例子来解释这个吗?

2 个答案:

答案 0 :(得分:7)

@SessionAttribute的工作原理如下:

    将相应的属性放入模型时(显式或使用@SessionAttribute - 带注释的方法)初始化
  • @ModelAttribute

  • 当调用其签名中具有相应模型属性的控制器方法时,
  • @SessionAttribute由HTTP参数中的数据更新。

  • 当您在传递给控制器​​方法的@SessionAttribute对象上调用setComplete()作为参数时,
  • SessionStatus被清除。

示例:

@SessionAttribute("myModel")
@Controller
public class MyController {
    @RequestMapping(...)
    public String displayForm(@RequestParam("id") long id, ModelMap model) {
        MyModel m = findById(id);
        model.put("myModel", m); // Initialized
        return ...;
    }

    @RequestMapping(...)    
    public String submitForm(@ModelAttribute("myModel") @Valid MyModel m,
        BindingResult errors, SessionStatus status) {
        if (errors.hasErrors()) {
            // Will render a view with updated MyModel
            return ...;
        } else {
            status.setComplete(); // MyModel is removed from the session
            save(m);
            return ...;
        }

    }
}

答案 1 :(得分:0)

您可以使用@ModelAttribute注释方法,如果属性名称与@SessionAttribute注释中指定的相同,则属性将存储在会话中。这是一个完整的例子:

@Controller   
@RequestMapping(value = "/test.htm") 
@SessionAttributes("myModel")
public class DeleteNewsFormController {

    // Add you model object to the session here
    @ModelAttribute("myModel")
    public String getResultSet() {
        return "Hello";
    }

    //retreive objects from the session
    @RequestMapping(method = RequestMethod.GET)
    public @ResponseBody testMethod(@ModelAttribute("resultSet") String test, Model model) {