我通过org.springframework.web.bind.annotation.SessionAttributes在结帐流程中将购物车实例存储在会话变量中:
@SessionAttributes({"shoppingCart"})
public class CheckoutController { ... }
但是,当结帐流程完成后,我想在会话中存储一个全新的ShoppingCart实例。
我需要类似的东西:
sessionAttributes.set("shoppingCart", new ShoppingCart());
我可以使用哪种方法来完成此任务?
答案 0 :(得分:3)
如果您可以访问HttpServletRequest
,请尝试使用此
request.getSession().setAttribute("shoppingCart", new ShoppingCart());
答案 1 :(得分:1)
您只需使用Model
来覆盖此内容:
public String method(Model model) {
model.addAttribute("shoppingCart", new ShoppingCart());
....
}
另一个选项是将SessionStatus
接口添加到方法参数中。它有清理会话属性的方法:
public String method(SessionStatus sessionStatus) {
sessionStatus.setComplete();
....
}
答案 2 :(得分:0)
感谢您的回答。 最后我用以下方式解决了这个问题: 我有一个基础控制器,用于所有与结账相关的控制器,在创建新会话时填充购物车:
@SessionAttributes({"shoppingCart"})
public class CheckoutController {
@ModelAttribute("shoppingCart")
public ShoppingCart populateSessionShoppingCart() {
// populates the cart for the first time if its null
return new ShoppingCart();
}
}
在完成结账过程的控制器中,我使用以下方法:
@Controller
public class PaymentController extends CheckoutController {
@RequestMapping(value = "/final_page", method = RequestMethod.GET)
public String finalPage(Map<String, Object> model) {
model.put("shoppingCart", new ShoppingCart());
return "final_page";
}
}
行:model.put(“shoppingCart”,new ShoppingCart());在会话中重置购物车。
注意:此方法仅使用spring会话处理,当然也会使用底层的HttpSession。 spring如何在内部处理会话处理,是一个内部弹簧实现细节,与上面的代码无关。