Spring MVC SessionAttributes с использованием ModelAttribute

Недавно я пытаюсь изучить 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, но проблема так и не решилась.


person akcasoy    schedule 04.05.2013    source источник


Ответы (1)


Вы не изменяете count (на самом деле не можете), вы назначаете ему. Таким образом, модель по-прежнему указывает на старое значение. Вам придется добавить новое значение вручную.

myModelAndView.add("count", count);

Но зачем возиться с count, если вы все равно можете использовать warenkorb.size?

person a better oliver    schedule 04.05.2013
comment
Я больше не добавляю объект warenkorb в модель. Но это работает? В чем разница? (Кстати, речь не о функциональности.. я просто пытался узнать что-то другое.. конечно, warenkorb.size тоже работает) - person akcasoy; 04.05.2013
comment
Вы имеете в виду это: warenkorb.add(item) не изменяет объект в сеансе, он просто манипулирует свойством объекта. Но в сессии все тот же объект, из-за этого нам не нужно снова добавлять в модель варенкорб. Но count = count + 2 изменяет количество объектов Integer. Итак, новый объект должен быть добавлен в сеанс? - person akcasoy; 04.05.2013
comment
@Cimbom Похоже, ты понял :) - person a better oliver; 04.05.2013