Заполните выпадающий список из сущности, используя Spring-mvc и thymeleaf - PullRequest
1 голос
/ 18 мая 2019

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

Meal.java

@Entity
public class Meal {

@Id
@GeneratedValue
  private Long id;

  @OneToOne
  private Student mealCook;

  private String mealName;

  private int mealPrice;

Student.java

@Entity
 public class Student {

@Id
@GeneratedValue
private Long id;

private String studentName;

MealController.java

@Controller
@RequestMapping("/m")
public class MealController {

private final MealRepository mealRepository;
private final StudentRepository studentRepository;

public MealController(MealRepository mealRepository, StudentRepository studentRepository){
    this.mealRepository = mealRepository;
    this.studentRepository = studentRepository;
}

@GetMapping
public ModelAndView list(){
    Iterable<Meal> meals = this.mealRepository.findAll();
    return new ModelAndView("meals/list" , "meals", meals);
}

@GetMapping("{id}")
public ModelAndView view(@PathVariable("id") Meal meal) {
    return new ModelAndView("meals/view", "meal", meal);
}

@GetMapping(params = "form")
public String createForm(@ModelAttribute Meal meal) {
    return "meals/form";
}

@PostMapping
public ModelAndView create(@Valid Meal meal,  BindingResult result,
                           RedirectAttributes redirect) {
    Iterable<Student> students = this.studentRepository.findAll();
    if (result.hasErrors()) {
        return new ModelAndView("meals/form", "formErrors", result.getAllErrors());
    }
    meal = this.mealRepository.save(meal);
    redirect.addFlashAttribute("globalMessage", "view.success");
    return new ModelAndView("redirect:/m/{meal.id}", "meal.id", meal.getId());
}

И, наконец, мой взгляд -> form.html

<form id="mealForm" th:action="@{/m/(form)}" th:object="${meal}" action="#" method="post">

    <div class="form-group">
        <label for="mealName">Meal Name</label>
        <input type="text" th:field="*{mealName}" th:class="${'form-control' + (#fields.hasErrors('mealName') ? ' is-invalid' : '')}">
    </div>

    <div class="form-group">
        <label for="mealCook">Meal Cook</label>
        <select th:field="*{mealCook}">
            <option th:each= ??
                    th:value= ??
                    th:text= ??</option>
        </select>
    </div>

    <button type="submit" class="btn btn-primary">Submit</button>
</form>

Теперь цель состоит в том, чтобы добавить 1 ученика к еде, выбрав studentName из выпадающего меню в форме.

Но я изо всех сил пытаюсь передать список студентов из контроллера в представление и отобразить его в раскрывающемся списке.

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Передайте список студентов как атрибут модели в вашем контроллере.Например,

@GetMapping(params = "form")
public String createForm(@ModelAttribute Meal meal, Model theModel) {
    theModel.addAttribute("students", studentRepository.findAll());

    return "meals/form";
}

Затем вы можете прочитать этот атрибут с помощью команды.

<option th:each="student:${students}"
                    th:value="${student.studentName}"
                    th:text="${student.studentName}">

</option>
1 голос
/ 19 мая 2019

Вы должны добавить список студентов в контроллере, где бы вы ни открывали форму:

    ModelAndView model = new ModelAndView("studentList");
    model.addObject(students) // get list from database or...
    // students =studentRepository.findAll() or use your exclusive query

А <option>:

<option th:each="item : ${studentList}"
        th:value=${item.id} // value you want...
        th:text=${item.name}>
</option>

и изменить сущности:

Meal.java

@Entity
    public class Meal {

@Id
@GeneratedValue
  private Long id;

  @OneToOne
  @JoinColumn(name = "meel_cook_id")
  private Student mealCook;

  private String mealName;

  private int mealPrice;

Student.java

@Entity
 public class Student {

@Id
@GeneratedValue
private Long id;

private String studentName;

@OneToOne(mappedBy = "mealCook")
@JsonBackReference
private Meal meal;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...