@SessionAttributes. Сессия в Spring MVC

апреля
26
2012

В этой статье рассмотрим работу с аннотацией @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

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии