Как передать два объекта из формы тимелеафа в Spring Controller? - PullRequest
0 голосов
/ 12 июля 2020

Я хочу передать два объекта из формы тимелеафа в контроллер. Вот мой код тимелеафа:

<!DOCTYPE html>
<html lang='en' xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1"/>
<title>Payment Page</title>
</head>
<body>
<h1>Payment List</h1>

<table>
<tr>
 <th>StuId</th>
 <th>Month</th>
 <th>Amount</th>
 
</tr>
<tr th:each="payment:${student.payments}">
<td th:text="${student.id}">2</td>
<td th:text="${payment.month}">devesh</td>
<td th:text="${payment.amount}">23</td>
</tr>
</table>

<h3>Add a Payment</h3>
 <form action="#" th:action= "@{/payments}" th:object="${payment}" method="POST"> 
      <div th:object="${student}" >
 <label for="name">Month:</label>
   <input type="text" name="month" size="50"></input><br/> 
 <label for="amount">Amount:</label> 
   <input type="text" name="amount" size="50"></input><br/>
<input type = "submit"/></form>

</body>
</html>

в форме, за исключением объекта платежа, который фактически отправляется здесь, я хочу передать объект студента или идентификатор моему контроллеру, поскольку любой платеж должен соответствовать определенному студенту. Я не мог найти никакого способа до сих пор после большого поиска.

Метод PaymentController, в котором я хочу передать объекты, поскольку я использую форму отправки, я не смог передать переменную в th: action

@RequestMapping(method = RequestMethod.POST, value = "/{id}/payments")
    public String doPayment(@ModelAttribute("payment") PaymentRecord paymentRecord, @PathVariable int id) {
        Student st = studentService.getStudentInfo(id);
        
        st.addPayments(paymentRecord);
        System.out.println("entered into do payment");
    

        
        
            studentService.addStudent(st);
      
        
        paymentService.doPayment(paymentRecord);
        return "redirect:{id}/payments";
    }

Пожалуйста, предложите. Я застрял здесь

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Вы можете сделать это разными способами.

Но сначала давайте сократим аннотацию метода публикации с:

@RequestMapping(method = RequestMethod.POST, value = "/{id}/payments")

до

@PostMapping("/{id}/payments")

Я бы также изменил переменную id на studentId, чтобы сделать ее более понятной для следующего человека, читающего ваш код.

Теперь включите переменную как скрытый тип ввода в тегах формы:

<input type="hidden" name="studentId" th:value="${student.id}">

Затем вы можете

a) Добавить свойство String studentId в свой класс PaymentRecord. Затем в методе публикации вы можете вызвать paymentRecord.getStudentId();

или

б) Добавьте параметр запроса для studentId в свой метод, сопоставленный с @PostMapping. Таким образом, ваша подпись метода может иметь @RequestParam(String studentId). В этом случае значение studentId будет полностью доступно пользователю.

или

c) Используйте @RequestBody и сопоставьте значения с bean-компонентом. Вы можете прочитать этот топи c дальше и посмотреть на некоторую предысторию с этим вопросом .

0 голосов
/ 13 июля 2020

Вместо:

return "redirect:{id}/payments";

попробуйте следующее:

return "redirect:" + id + "/payments";

или (если нужно указать / в перенаправлении):

return "redirect:/" + id + "/payments";

Если вы хотите «ПОЛУЧИТЬ» с несколькими ob js, тогда вы можете что-то вроде:

 @RequestMapping(value = { "/deleteuserdocument/{docid}/{userid}" }, method = RequestMethod.GET)

Это из моего репозитория github , где я «ПОЛУЧИТЬ» ting the Documentid для конкретного c идентификатор пользователя. Надеюсь, это поможет.

...