Stanislav Gvozdilin
Stanislav Gvozdilin

Reputation: 13

Spring Boot Thymeleaf Method POST SELECT null

Guys. Tell me please how to get values from select in the Controller? This returns null. request.getParameter("firstUserYears"); request.getParameter("secondUserYears");

I want to get value of "birthDay" field.

my thymeleaf html form:

    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    <form method="post" action="/calculate_years">
    <select name="firstUserYears" th:field="*{users}"/>
    <option th:each="user : ${users}" th:value="firstUserYears" th:text="${user.firstName}">
    </option>
    </select>

    <select name="secondUserYears" th:field="*{users}"/>
    <option th:each="user : ${users}" th:value="${user.firstName}" th:text="${user.firstName}">
    </option>
    </select>
    
    <button type="submit">Submit</button>
                        
    </form>
    </body>
    </html>

Controller:

    @GetMapping("/user-difference")
    public String calculateDifferenceForm(Model model) {
         model.addAttribute("users", service.findAll());    
         return "user-difference";
    }
    
    
    @PostMapping("/calculate_years")
    public String calculateDifferenceForm(HttpServletRequest request, @ModelAttribute User user,
            BindingResult bindingResult){
    
            String firstUsersYearsOld = request.getParameter("firstUserYears");
            String secondUsersYearsOld = request.getParameter("secondUserYears");
            String name = request.getParameter("name");
            
            BindingResult results = bindingResult;
            
            System.out.println(results);
            System.out.println(user);
            System.out.println(name);
            System.out.println(firstUsersYearsOld);
            System.out.println(secondUsersYearsOld);
            
        return "redirect:/user-difference";
    }

Upvotes: 1

Views: 1166

Answers (1)

Wim Deblauwe
Wim Deblauwe

Reputation: 26878

You should start with defining a form data object. For example:

public class AgeDifferenceFormData {
  private long user1Id;
  private long user2Id;

  // getters and setters here
}

Create an empty such object in your @GetMapping:

    @GetMapping("/user-difference")
    public String calculateDifferenceForm(Model model) {
         model.addAttribute("formData", new AgeDifferenceFormData());
         model.addAttribute("users", service.findAll());    
         return "user-difference";
    }

Now update your HTML form to use the form data object:

<form method="post" action="/calculate_years" th:object="${formData}">
    <select th:field="*{user1Id}"/>
        <option th:each="user : ${users}" th:value="${user.id}" th:text="${user.firstName}">
        </option>
    </select>

    <select th:field="*{user2Id}"/>
        <option th:each="user : ${users}" th:value="${user.id}" th:text="${user.firstName}">
        </option>
    </select>
    
    <button type="submit">Submit</button>
                        
    </form>

Note how you need to:

  • Set a selected object for Thymeleaf via th:object="${formData}"
  • Set the dedicated field for each select via th:field="*{user1Id}" and th:field="*{user2Id}"
  • Use the unique id of the user for the th:value.

Now in your @PostMapping method do this:

@PostMapping("/calculate_years")
    public String calculateDifferenceForm(@ModelAttribute("formData") AgeDifferenceFormData formData,
            BindingResult bindingResult){
    
            User user1 = service.getUser(formData.getUser1Id());
            User user2 = service.getUser(formData.getUser2Id());
            // calculate age difference here
            
        return "redirect:/user-difference";
    }

See also Using HTML select options with Thymeleaf for more info.

Upvotes: 1

Related Questions