2013-05-04 5 views
3

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

ответ

1

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

myModelAndView.add("count", count); 

Но почему утруждая count если вы можете использовать warenkorb.size в любом случае?

+0

Я не добавляю объект warenkorb в модель снова. Но это работает? В чем разница? (Кстати, речь идет не о функциональности .. я просто пытался что-то другое узнать. Конечно, warenkorb.size работает также) – akcasoy

+0

Вы имеете в виду это: warenkorb.add (item) не меняет объект в сеансе, он просто манипулирует свойством объекта. Но в сеансе есть все тот же объект, из-за этого нам не нужно снова добавлять warenkorb к модели. Но count = count + 2 меняет объект Integer count. Итак, новый объект должен быть добавлен в сеанс? – akcasoy

+0

@Cimbom Звучит так, как будто у вас есть :) – zeroflagL