В этой статье рассмотрим работу с аннотацией @SessionAttributes в Spring MVC. Как понятно из названия, эта аннотация предназначена для работы с атрибутами сессии. А именно, @SessionAttributes объявляет атрибут(ы) сессии, используемый(ые) конкретным обработчиком.
В следующем фрагменте кода показано использование этой аннотации:
@Controller
@SessionAttributes("person")
public class SessionAttributesController {
@RequestMapping(value = "/session-attr", method = RequestMethod.GET)
public ModelAndView sessionAttributes( @ModelAttribute Person person ) {
ModelAndView modelAndView = new ModelAndView("session_attr");
modelAndView.addObject( person );
return modelAndView;
}
}
Обратите внимание на аннотацию @ModelAttribute в методе sessionAttributes(). Таким образом данные из сессии передаются в атрибут person метода sessionAttributes(). Если убрать аннотацию @ModelAttribute, то в модели не окажется атрибута person.
или с несколькими атрибутами сессии:
@Controller
@SessionAttributes({"person", "sheldon"})
public class SessionMultipleAttributesController {
@RequestMapping(value = "/session-multiattr", method = RequestMethod.GET)
public ModelAndView sessionMultiAttributes( @ModelAttribute Person person, @ModelAttribute Sheldon sheldon ) {
ModelAndView modelAndView = new ModelAndView("session_multiple_attr");
modelAndView.addObject( person );
modelAndView.addObject( sheldon );
return modelAndView;
}
}
Учтите, что во время выполнения методов sessionAttributes() и sessionMultiAttributes() в сессии уже должны храниться объекты person и sheldon. Иначе получите ошибку 500 и сообщение об ошибке вида:
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/spring-sessionattribute] threw exception [Expected session attribute 'person'] with root cause
org.springframework.web.HttpSessionRequiredException: Expected session attribute 'person'
Чтобы добавить объекты в сессию, используйте, например, следующий код:
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home( HttpSession httpSession ) {
httpSession.setAttribute("person", new Person("John") );
httpSession.setAttribute("sheldon", new Sheldon() );
return "home";
}
Этот код должен вызываться ДО(!!!) вызова методов sessionAttributes() и sessionMultiAttributes() для того чтобы поместить объекты person и sheldon в сессию.
Либо, чтобы избавиться от ошибки, можно добавить следующие два метода в контроллер:
@ModelAttribute("person")
public Person populatePerson() {
return new Person("empty");
}
@ModelAttribute("sheldon")
public Sheldon populateSheldon() {
return new Sheldon();
}
Код проекта с примерами из статьи Вы можете скачать по следующей ссылке - Скачать spring-sessionattribute.zip