如何使用 spring 从表单中获取未编辑的对象
How to get not editted object from form with spring
我的应用程序中有一个用于结帐的简单控制器
一开始,我们只是把我们订单的对象传给表格:
@GetMapping
public String getOrderForm(Model model){
model.addAttribute("orderForm", new OrderDto());
model.addAttribute("deliveryType", orderService.getDeliveryTypeList());
model.addAttribute("paymentType", orderService.getPaymentTypeList());
return "create-order";
}
之后,用户在该对象中填写2个字段,全部通过以下方法获取:
@PostMapping
public String addNewOrder(@ModelAttribute("orderForm") @Valid OrderDto orderDto,
@AuthenticationPrincipal UserDetails currentUser,
BindingResult bindingResult,
Model model,
RedirectAttributes redirectAttributes){
User userFromBd = userRepository.findByEmail(currentUser.getUsername());
orderDto.setUser_id(userFromBd.getId());
List<AddressDto> savedAddress = addressService.getAllSaved(orderDto.getUser_id());
model.addAttribute("savedAddress", savedAddress);
model.addAttribute("addressForm", new AddressAdditionDto());
return "order-address";
}
这里我们将其他对象传递到表单中,让用户填写它们。这是表单的样子:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Add new order</title>
</head>
<body>
<div th:each="address : ${savedAddress}">
<p>
<span th:text="*{address.country}"></span>
</p>
<p>
<span th:text="*{address.city}"></span>
</p>
</div>
<form th:method="POST" th:action="@{/order/savedaddress}">
<td>Choose adress:</td>
<select name="addressId">
<span th:each="address : ${savedAddress}">
<option th:value="${address.id}"
th:text="${address.id}"></option>
</span>
</select>
<br>
<label>
<input name="submit" type="submit" value="Select"/>
</label>
</form>
<p><a href="/">Home</a></p>
</body>
</html>
在这种形式下,没有与我们原来的 OrderDTO 对象进行交互。此表单中的所有数据均采用以下方法:
@PostMapping("/savedaddress")
public String addAddress(@ModelAttribute("orderForm") @Valid OrderDto orderDto,
@RequestParam(value = "addressId", required = false) Long addressId,
BindingResult bindingResult,
Model model){
model.addAttribute("orderForm", orderDto);
if(orderDto.getPaymentType().equals("CARD")) {
model.addAttribute("savedCard", cardService.getAllByUserId(orderDto.getUser_id()));
model.addAttribute("cardForm", new CardRegisterDto());
return "order-card";
}
return "order-finish";
}
但问题是我的 OrderDTO 对象已经完全空了。即,之前表格中已经填写的字段为空。它可以连接什么?
添加注解@SessionAttributes (types = {OrderDto.class})
class
以上
我认为您没有在 HTML 文件中使用 OrderDto 对象,这可能是获取空对象作为 ModelAttribute 的原因。您可以在表单中使用 th:object
喜欢:
<form th:method="POST" th:action="@{/order/savedaddress}" th:object="${orderForm}">
<input type="hidden" th:field="*{user_id}">
'''
other code
'''
</form>
试试这个:
<form th:method="POST" th:action="@{/order/savedaddress} th:object={orderForm}">
<input type="hidden" th:value="${orderForm.user_id} name=userId">
<td>Choose adress:</td>
<select name="addressId">
<span th:each="address : ${savedAddress}">
<option th:value="${address.id}"
th:text="${address.id}"></option>
</span>
</select>
<br>
<label>
<input name="submit" type="submit" value="Select"/>
</label>
</form>
我的应用程序中有一个用于结帐的简单控制器
一开始,我们只是把我们订单的对象传给表格:
@GetMapping
public String getOrderForm(Model model){
model.addAttribute("orderForm", new OrderDto());
model.addAttribute("deliveryType", orderService.getDeliveryTypeList());
model.addAttribute("paymentType", orderService.getPaymentTypeList());
return "create-order";
}
之后,用户在该对象中填写2个字段,全部通过以下方法获取:
@PostMapping
public String addNewOrder(@ModelAttribute("orderForm") @Valid OrderDto orderDto,
@AuthenticationPrincipal UserDetails currentUser,
BindingResult bindingResult,
Model model,
RedirectAttributes redirectAttributes){
User userFromBd = userRepository.findByEmail(currentUser.getUsername());
orderDto.setUser_id(userFromBd.getId());
List<AddressDto> savedAddress = addressService.getAllSaved(orderDto.getUser_id());
model.addAttribute("savedAddress", savedAddress);
model.addAttribute("addressForm", new AddressAdditionDto());
return "order-address";
}
这里我们将其他对象传递到表单中,让用户填写它们。这是表单的样子:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Add new order</title>
</head>
<body>
<div th:each="address : ${savedAddress}">
<p>
<span th:text="*{address.country}"></span>
</p>
<p>
<span th:text="*{address.city}"></span>
</p>
</div>
<form th:method="POST" th:action="@{/order/savedaddress}">
<td>Choose adress:</td>
<select name="addressId">
<span th:each="address : ${savedAddress}">
<option th:value="${address.id}"
th:text="${address.id}"></option>
</span>
</select>
<br>
<label>
<input name="submit" type="submit" value="Select"/>
</label>
</form>
<p><a href="/">Home</a></p>
</body>
</html>
在这种形式下,没有与我们原来的 OrderDTO 对象进行交互。此表单中的所有数据均采用以下方法:
@PostMapping("/savedaddress")
public String addAddress(@ModelAttribute("orderForm") @Valid OrderDto orderDto,
@RequestParam(value = "addressId", required = false) Long addressId,
BindingResult bindingResult,
Model model){
model.addAttribute("orderForm", orderDto);
if(orderDto.getPaymentType().equals("CARD")) {
model.addAttribute("savedCard", cardService.getAllByUserId(orderDto.getUser_id()));
model.addAttribute("cardForm", new CardRegisterDto());
return "order-card";
}
return "order-finish";
}
但问题是我的 OrderDTO 对象已经完全空了。即,之前表格中已经填写的字段为空。它可以连接什么?
添加注解@SessionAttributes (types = {OrderDto.class}) class
以上我认为您没有在 HTML 文件中使用 OrderDto 对象,这可能是获取空对象作为 ModelAttribute 的原因。您可以在表单中使用 th:object 喜欢:
<form th:method="POST" th:action="@{/order/savedaddress}" th:object="${orderForm}">
<input type="hidden" th:field="*{user_id}">
'''
other code
'''
</form>
试试这个:
<form th:method="POST" th:action="@{/order/savedaddress} th:object={orderForm}">
<input type="hidden" th:value="${orderForm.user_id} name=userId">
<td>Choose adress:</td>
<select name="addressId">
<span th:each="address : ${savedAddress}">
<option th:value="${address.id}"
th:text="${address.id}"></option>
</span>
</select>
<br>
<label>
<input name="submit" type="submit" value="Select"/>
</label>
</form>