Недавно я пытаюсь изучить Spring MVC. Кажется, я плохо понял функциональность аннотаций @SessionAttributes и @ModelAttribute.
Это часть моего контроллера:
@SessionAttributes({"shoppingCart", "count"})
public class ItemController {
@ModelAttribute("shoppingCart")
public List<Item> createShoppingCart() {
return new ArrayList<Item>();
}
@ModelAttribute("count")
public Integer createCount() {
return 0;
}
@RequestMapping(value="/addToCart/{itemId}", method=RequestMethod.GET)
public ModelAndView addToCart(@PathVariable("itemId") Item item,
@ModelAttribute("shoppingCart") List<Item> shoppingCart, @ModelAttribute("count") Integer count) {
if(item != null) {
shoppingCart.add(item);
count = count + 2;
}
return new ModelAndView(new RedirectView("showAllItems"));
}
В основном есть jsp, в котором перечислены все элементы. Если пользователь нажмет «addToCart» для определенного товара, этот товар будет добавлен в список shoppingCart. Я лучше сначала объясню свое понимание этого контроллера, и вы можете сказать мне, что я не понимаю.
При первом вызове ItemController будут выполнены методы createShoppingCart и createCount, а возвращаемые параметры будут сохранены в сеансе под именами «shoppingCart» и «count». Когда пользователь вызывает URL ".../addToCart/1", будет вызван метод addToCart. Поскольку мне нужно в сигнатуре метода 2 значения из сеанса, контроллер будет смотреть в сеансе, есть ли уже значения. Да, они есть. В настоящее время shoppingCart — это пустой список, а количество равно 0. В теле метода выбранный элемент будет добавлен в список, количество будет равно 2. JSP будет отображаться снова.
Проблема в том, что jsp видит, что список shoppingCart теперь не пуст. но счетчик по-прежнему равен 0. Когда я добавляю товары в корзину, я вижу на jsp, что shoppingCart заполнен товарами, но значение count всегда равно 0.
На самом деле нет никакой разницы между объектами shoppingCart и count .. я не понимаю, почему он ведет себя так. Сначала я сомневался, что тип счетчика примитивный int, потом поменял на Integer, но проблема так и не решилась.