Spring MVC @SessionAttributes and @CookieValue Annotation Example
June 28, 2019
On this page we will learn Spring MVC @SessionAttributes
and @CookieValue
annotation. The JavaBean object can be added in session by two way in spring MVC. One by using @SessionAttributes
and another by session.setAttribute(). The difference between them is that previous one is used to keep object in session for short lived. In spring MVC, we may need to populate our form with the data which was extracted in any previous request in the application. Here we can use @SessionAttributes. It works with @ModelAttribute and is annotated at type level. The objects are added in ModelAttribute and the name of it is assigned to @SessionAttributes value element. @CookieValue is used as argument of request mapping method. The HTTP cookie is bound to the @CookieValue parameter for a given cookie name. Find the example now.
@SessionAttributes
@SessionAttributes is used in conjunction with @ModelAttribute. @SessionAttributes is used at type level for a specific handler. If we have declared a @ModelAttribute as@ModelAttribute("countrybean") public Country addAttributes() { }
@Controller @SessionAttributes(value = "countrybean", types = {Country.class}) public class HelloController { }
@Controller @SessionAttributes(value = {"bean1", "bean2" }, types = {Bean1.class, Bean2.class}) public class HelloController { @ModelAttribute("bean1") public Bean1 addAttributes1() {} @ModelAttribute("bean2") public Bean2 addAttributes2() {} }
@CookieValue
In spring @CookieValue annotation binds a method parameter to the HTTP cookie. This is used in the method annotated with @RequestMapping. Suppose we have a HTTP cookie name as JSESSIONID, the we can use @CookieValue as below.@RequestMapping(value="/updateForm") public ModelAndView country(@CookieValue("JSESSIONID") String cookie){}
Example for @SessionAttributes and @CookieValue
To understand @SessionAttributes and @CookieValue in real life, we will provide the example. @SessionAttributes is useful to support the form. Suppose in one request we have some bean which will be used by form in any other request. So we add the bean to ModelAttribute and then the name of it is assigned to SessionAttributes. In this way, the bean is saved in the session. When the request comes to the controller, first all the methods annotated with @ModelAttribute run. Now find the two controller being used in our example.HelloController.java
@Controller @SessionAttributes(value = "countrybean", types = {Country.class}) public class HelloController { @Autowired private CountryController controller; @ModelAttribute("countrybean") public Country addAttributes() { Country country = new Country(); country.setCountryName("India"); country.setCapital("Delhi"); return country; } @RequestMapping(value="countryinfo") public String country(){ return "start"; } }
@Controller public class CountryController { @RequestMapping(value="/updateForm") public ModelAndView country(HttpSession session, @CookieValue("JSESSIONID") String cookie){ Country countryObj = (Country)session.getAttribute("countrybean"); System.out.println("Country Name:"+ countryObj.getCountryName()); System.out.println("Capital:"+ countryObj.getCapital()); System.out.println("JSESSIONID:"+ cookie); return new ModelAndView("updateCountry","country", countryObj); } }
1. When we hit the URL /countryinfo, the method addAttributes() in HelloController class runs and a ModelAttribute named countrybean is created.
2. When the URL /updateForm is requested, the method country of CountryController class runs.
3. The updateCountry.jsp page will be populated with the values extracted from session.
4. The request mapping method which has the @CookieValue argument, will provide the cookie value for the assigned cookie name.
Find the populated form as an output.

Country Name:India Capital:Delhi JSESSIONID:D301ED03E90EE36F1CE99B5F268109AF