Search code examples
javaspringspring-bootdrop-down-menuthymeleaf

How do I get the selected value from a drop-down menu with Thymeleaf?


My user is adding an exam object which is then added to the subject object. Subject and exam have a one to many relationship. The user is selecting the subject in the drop down menu.This menu contains string not actual subject objects. In this form, how do I send an exam object and the selected item (String) to the controller?

My HTML file

            <form action="#" th:action="@{/addExam}" th:object="${exam}" 
     method="post">
             <div th:object="${subject}">
    <select th:field="*{option}" class="form-control" id="subjectOrder" 
name= "subjectOrder">
    <option value="">Select subject</option>

<option 
    th:each="Subject : ${subjects}" 
    th:value="${Subject}" 
    th:text="${Subject}"></option>
 </div>
 <div>
    <table>
        <tr>
              Exam Title
            <td><input type="text" th:field="*{examTitle}" /></td>

        </tr>  
        <tr>
            <td> Exam grade worth </td>
            <td><input th:field="*{examGradeWorth}" /></td>

            </tr>  
            <tr>
                <td><button type="submit">Submit post</button></td>
                </tr>
      </table>
    </div>
    </form>

The controller, I want to set subject Name to equal the subject the user selected in the drop down box.

    @GetMapping("/addexam")
public String showExamForm(Model model) {

    Authentication loggedInUser = 
  SecurityContextHolder.getContext().getAuthentication();
    String email = loggedInUser.getName();   

    User user = userRepository.findByEmailAddress(email);

    ArrayList<String> subjects = new ArrayList<String>();

    for(Subject sub:user.getSubject())
    {
        subjects.add(sub.getSubjectName());
    }
    model.addAttribute("subjects", subjects);

return "addExam";
}

@PostMapping("/addexam")
public String addNewExam(@ModelAttribute("exam") @Valid @RequestBody Exam 
    exam,UserRegistrationDto userDto, BindingResult result, Model model) {

    examRepository.save(exam);
    model.addAttribute("examTitle", exam.getExamTitle());
    model.addAttribute("examGradeWorth", exam.getExamGradeWorth());
    String subjectName = (); 

 //I want to set subjectName to equal the selected option.

    Subject subject = subjectRepository.findBySubjectName(subjectName);
    subject.addExam(exam);
    subjectRepository.save(subject);


return "userProfile1";


}

Solution

  • I managed to find the selected value. See my code below.

    Exam Controller:

     @Controller
    
    public class AddExamController {
    
    @Autowired
    private ExamRepository examRepository;
    @Autowired
    private SubjectRepository subjectRepository;
    @Autowired 
    private UserRepository userRepository;
    
    @ModelAttribute("exam")
    public Exam exam() {
        return new Exam();
    }
    
    
    @GetMapping("/addexam")
    public String showExamForm(Model model) {
    
        Authentication loggedInUser = SecurityContextHolder.getContext().getAuthentication();
        String email = loggedInUser.getName();   
    
        User user = userRepository.findByEmailAddress(email);
    
        ArrayList<String> subjects = new ArrayList<String>();
    
        for(Subject sub:user.getSubject())
        {
            subjects.add(sub.getSubjectName());
        }
        model.addAttribute("subjects", subjects);
    
    return "addExam";
    }
    
    @PostMapping("/addExam") //This was causing one problem i was getting. I had it as /addexam and it should have been addExam
    public String addNewExam(@ModelAttribute("exam") @Valid @RequestBody Exam exam,UserRegistrationDto userDto, BindingResult result, Model model) {
    
        examRepository.save(exam);
        model.addAttribute("examTitle", exam.getExamTitle());
        model.addAttribute("examGradeWorth", exam.getExamGradeWorth());
        model.addAttribute("subject", "");
    
    
    
        //String subjectName = ("subject", exam.getSubject());
    
    //  Subject subject = subjectRepository.findBySubjectName(subjectName);
        //subject.addExam(exam);
    /// subjectRepository.save(subject);
    
    return "userProfile1";
    
    
        }
    }
    

    HTML

        <form action="#" th:action="@{/addExam}"  th:object="${exam}" method="post">
    
    <select th:field="*{subject}" class="form-control" id="subject" name="subject">
        <option value="">Select subject</option>
        <option 
            th:each="Subject : ${subjects}" 
            th:value="${Subject}" 
            th:text="${Subject}"></option>
        <table>
            <tr>
            <td> Exam Title:</td>
             <td><input type="text" th:field="*{examTitle}" /></td>
    
            </tr>  
            <tr>
                <td> Exam grade worth </td>
                <td><input th:field="*{examGradeWorth}" /></td>
    
                </tr>  
                <tr>
                    <td><button type="submit">Submit post</button></td>
                    </tr>
        </table>
        </div>
    </form>