@SessionAttribute: когда инициализируется модель? - PullRequest
1 голос
/ 27 декабря 2011

Когда я хочу модель в области видимости Сессии в Spring 3, я использую следующие.аннотация в контроллере: -

    @SessionAttribute("myModel");

Однако это всего лишь объявление myModel.В какой момент он инициализируется, так что я использую его в представлении.И как Spring узнает тип класса этой модели?

Может кто-нибудь объяснить это примером?

Ответы [ 2 ]

7 голосов
/ 27 декабря 2011

@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 ...;
        }

    }
}
0 голосов
/ 27 декабря 2011

Вы можете аннотировать методы с помощью @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) {
...