#spring #spring-boot #spring-mvc #thymeleaf
#spring #spring-загрузка #spring-mvc #thymeleaf
Вопрос:
Я создаю веб-сайт электронной коммерции 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
in chargeReqeust
можно было обновлять автоматически?
Ответ №1:
К сожалению для вас, вы не сможете сделать это с помощью простого контроллера. Вам понадобится @ControllerAdvice, который будет служить глобальным контроллером, чтобы иметь возможность обновлять корзину всякий раз, когда кто-то добавляет товар в свою корзину или удаляет товары из своей корзины.
Другими словами, вам нужен ГЛОБАЛЬНЫЙ КОНТРОЛЛЕР. Этот глобальный контроллер должен проверять атрибут 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, который позволяет вам
идентифицировать пользователя в более чем одностраничном запросе или посетить веб-сайт и сохранить информацию об этом пользователе.
Приветствия