我正在创建一个Spring Boot电子商务网站,并且我有一个span
标签,其中包含到目前为止购物车中的总价格,并且在后台使用JavaScript进行了更新:
<form method="POST" th:object="${chargeRequest}">
<span class="total">
Total: <span class="total-price">$0</span>
</span>
</form>
,然后将模型属性model.addAttribute("chargeRequest", new ChargeRequest());
传递到此页面,并将ChargeRequest类定义为:
public class ChargeRequest {
private int amount;
// constructor, setter/getter
// ...
}
问题是:如何更新amount
中的chargeRequest
,并使用Thymeleaf将其传递回控制器?
th:field
仅对<input>
,<select>
,<textarea>
有效,我不能直接将其放入<span>
标记
我尝试传递2个属性:
model.addAttribute("amount", new String("$0"));
model.addAttribute("chargeRequest", new ChargeRequest());
<span class="total">
Total: <span class="total-price" th:text="${amount}">$0</span>
<input type="hidden" th:value="${amount}, id="amount", name="amount">
</span>
但是我不知道如何更新${amount}
以便amount
中的chargeReqeust
能自动更新?
答案 0 :(得分:0)
不幸的是,对于您来说,您将无法使用简单的控制器来做到这一点。您将需要一个@ControllerAdvice,它将用作全局控制器,以便每当有人向其购物车中添加产品或从其购物车中删除产品时都可以更新购物车。
换句话说,您需要一个 GLOBAL CONTROLLER 。该全局控制器应检查 SESSION 属性,以允许您更改购物车总数并在每次更改时对其进行更新。例如,请在下面查看。
@ControllerAdvice
public class GlobalCartController{
@Autowired
private HttpSession session;
@ModelAttribute("cartModel")
public CartModel getCartTotal(){
if(session.getAttribute("cart")==null){
//Here you create cart attribute for the session
// then
session.setAttribute("cartModel", cartObjectWithUpdatedTotal);
}
return (CartObjectWithUpdatedTotal) session.getAttribute("cartModel");
}
请注意,始终会在所有路由上始终检查全局控制器,并且不需要路由,这使您可以使用HttpSession autowired类,该类允许您
在一页以上的请求中标识用户,或访问网站并存储有关该用户的信息。
欢呼