Я пытаюсь изучить 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 со списком всех элементов. Пользователь Wenn нажимает «addToCart» для определенного элемента, этот элемент будет добавлен в список shoppingCart. Я лучше объясню свое понимание этого контроллера первым, и вы можете сказать мне, чего я не понимаю.
В первый раз, когда вызывается ItemController, будут выполняться методы createShoppingCart и createCount, а возвращаемые параметры будут сохранены в сеансе под именами «shoppingCart» и «count». Когда пользователь вызывает URL-адрес «.../addToCart/1», вызывается метод addToCart. Так как я нуждаюсь в этом в значении сигнатуры метода 2 из сеанса, контроллер будет смотреть в сеансе, будут ли значения уже там. Да, они ... В это время shoppingCart - это пустой список, а count - 0. В теле метода выбранный элемент будет добавлен в список, счет будет равен 2. Jsp будет отображаться снова.
Проблема в том, что jsp может видеть, что список shoppingCart теперь не пуст. но счет по-прежнему равен 0. Когда я добавляю элементы в корзину, я могу видеть на jsp, что на сайте ShoppingCart есть предметы, но значение count всегда 0.
На самом деле нет никакой разницы между shoppingCart и count объекты .. я не понимаю, почему так ведет себя. Я сначала сомневался, что тип count был примитивным int, а затем я изменил его на Integer typ, но проблема не решена.
Я не добавляю объект warenkorb в модель снова. Но это работает? В чем разница? (Кстати, речь идет не о функциональности .. я просто пытался что-то другое узнать. Конечно, warenkorb.size работает также) – akcasoy
Вы имеете в виду это: warenkorb.add (item) не меняет объект в сеансе, он просто манипулирует свойством объекта. Но в сеансе есть все тот же объект, из-за этого нам не нужно снова добавлять warenkorb к модели. Но count = count + 2 меняет объект Integer count. Итак, новый объект должен быть добавлен в сеанс? – akcasoy
@Cimbom Звучит так, как будто у вас есть :) – zeroflagL