3. Получение данных формы

Для обработки формы необходимо выполнить следующую последовательность действий:

  1. Создать объект, поля которого будут содержать данные формы. В нашем случае создадим класс Student;

  2. Передать пустой объект Student при переходе на страницу формы;

  3. В полях формы настроить соответствие между полями формы и полями объекта класса Student;

  4. После отсылки формы заполненный объект Student передается в теле HTTP-запроса с методом POST, после чего заполненный объект можно обработать, сохранить в базе данных и так далее.

Создадим класс Student

Student.java
public class Student {

    private long id;
    private String lastName;
    private String firstName;
    private String patronymic;
    private String email;
    private String phone;
    private String address;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getPatronymic() {
        return patronymic;
    }

    public void setPatronymic(String patronymic) {
        this.patronymic = patronymic;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Student() {}

    public Student(String lastName, String firstName, String patronymic, String email, String phone, String address) {
        this.lastName = lastName;
        this.firstName = firstName;
        this.patronymic = patronymic;
        this.email = email;
        this.phone = phone;
        this.address = address;
    }
}

Изменим метод контроллера, который обрабатывает URL "/add_student". Передадим пустой объект студента

StudentController.java
@Controller
public class StudentController {

    ...

    @GetMapping("/add_student")
    public String addStudent(Model model) {
        model.addAttribute("student", new Student());
        return "add_student";
    }
}

Изменим файл add_student.html. В полях формы добавим привязку к полям объекта, в теге формы укажем название объекта (исходя из метода контроллера он должен называться "student", а также укажем URL для отправки данных формы).

add_student.html
<form enctype="multipart/form-data" action="#" th:action="@{/add_student}" th:object="${student}" method="post" class="needs-validation"
      novalidate>
    <div class="row">
        <div class="col-md-12">
            <h4 class="mb-3">Поля для заполнения</h4>

            <div class="row">

                <div class="col-md-4 mb-3">
                    <label for="lastName">Фамилия</label>
                    <input th:field="*{lastName}" type="text" class="form-control" id="lastName" placeholder=""
                           value="" required>
                </div>


                <div class="col-md-4 mb-3">
                    <label for="firstName">Имя</label>
                    <input th:field="*{firstName}" type="text" class="form-control" id="firstName" placeholder=""
                           value="" required>
                </div>
                <div class="col-md-4 mb-3">
                    <label for="patronymic">Отчество</label>
                    <input th:field="*{patronymic}" type="text" class="form-control" id="patronymic" placeholder=""
                           value="" required>
                </div>
            </div>

            <div class="mb-3">
                <label for="email">Электронная почта</label>
                <input th:field="*{email}" type="email" class="form-control" id="email"
                       placeholder="" value="" required>
            </div>

            <div class="mb-3">
                <label for="phone">Телефон</label>
                <input th:field="*{phone}" type="text" class="form-control" id="phone"
                       placeholder="(ХХХ) ХХХ-ХХХХ" value="" required>
            </div>

            <div class="mb-3">
                <label for="address">Домашний адрес</label>
                <input th:field="*{address}" type="text" class="form-control" id="address" placeholder="" value=""
                       required>
            </div>

            <hr class="mb-4">
            <button class="btn btn-primary btn-lg btn-block" type="submit" value="Submit">Добавить студента</button>
        </div>
    </div>
</form>

Создадим метод контроллера, который принимает POST-запрос с URL "/add_student". Данный метод будет обрабатывать результат заполнения формы.

StudentController.java
@Controller
public class StudentController {

    ...

    @PostMapping("/add_student")
    public String greetingSubmit(@ModelAttribute Student student) {
            return "redirect:/";
    }
}

Изменим класс Student, превратив его в сущность

Student.java
@Entity
@Table(name = "student")
public class Student {

    @Id
    @GeneratedValue
    private long id;

    private String lastName;
    private String firstName;
    private String patronymic;
    private String email;
    private String phone;
    private String address;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getPatronymic() {
        return patronymic;
    }

    public void setPatronymic(String patronymic) {
        this.patronymic = patronymic;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Student() {
    }

    public Student(String lastName, String firstName, String patronymic, String email, String phone, String address) {
        this.lastName = lastName;
        this.firstName = firstName;
        this.patronymic = patronymic;
        this.email = email;
        this.phone = phone;
        this.address = address;
    }
}

Создадим интерфейс репозитория

StudentRepository.java
public interface StudentRepository extends JpaRepository<Student,Long> {}

Добавим класс сервиса для работы с DAO

StudentService.java
@Service
public class StudentService {

    private StudentRepository repository;

    @Autowired
    public void setRepository(StudentRepository repository) {
        this.repository = repository;
    }

    public void saveStudent(Student student) {
        repository.save(student);
    }
}

Изменим класс контроллера. После получения результатов заполнения формы, данные будут сохраняться в базе данных.

StudentController.java
@Controller
public class StudentController {

    private StudentService service;

    @Autowired
    public void setService(StudentService service) {
        this.service = service;
    }

    ...

    @PostMapping("/add_student")
    public String greetingSubmit(@ModelAttribute Student student) {
        service.saveStudent(student);
        return "redirect:/";
    }
}

Last updated