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

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

1. Создать объект, поля которого будут содержать данные формы. В нашем случае создадим класс **Student**;
2. Передать пустой объект **Student** при переходе на страницу формы;
3. В полях формы настроить соответствие между полями формы и полями объекта класса **Student**;
4. После отсылки формы заполненный объект Student передается в теле HTTP-запроса с методом POST, после чего заполненный объект можно обработать, сохранить в базе данных и так далее.

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

{% code title="Student.java" %}

```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;
    }
}
```

{% endcode %}

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

{% code title="StudentController.java" %}

```java
@Controller
public class StudentController {

    ...

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

{% endcode %}

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

{% code title="add\_student.html" %}

```markup
<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>
```

{% endcode %}

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

{% code title="StudentController.java" %}

```java
@Controller
public class StudentController {

    ...

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

{% endcode %}

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

{% code title="Student.java" %}

```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;
    }
}
```

{% endcode %}

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

{% code title="StudentRepository.java" %}

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

{% endcode %}

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

{% code title="StudentService.java" %}

```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);
    }
}
```

{% endcode %}

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

{% code title="StudentController.java" %}

```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:/";
    }
}
```

{% endcode %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://opu.gitbook.io/oop2/practice-4/3.-poluchenie-dannykh-formy.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
