Getting Started | Validating Form Input
The application involves validating a user’s name and age, so you first need to create a class that backs the form used to create a person. The following listing (from src/main/java/com/example/validatingforminput/PersonForm.java) shows how to do so: pac
spring.io
이번 애플리케이션 : 사용자의 이름과 나이를 검증하는 것이 목표
PersonForm 객체 생성
src/main/java/com/example/validatingforminput/PersonForm.java
package com.example.validatingforminput;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
public class PersonForm {
@NotNull
@Size(min=2, max=30)
private String name;
@NotNull
@Min(18)
private Integer age;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String toString() {
return "Person(Name: " + this.name + ", Age: " + this.age + ")";
}
}
- Size(min=2, max=30) : 이름은 2자에서 30자 사이여야 한다.
- NotNull : 값이 null이 될 수 없다.
- @Min(18) : 나이는 18세 이상이어야 한다.
Web Controller 생성
src/main/java/com/example/validatingforminput/WebController.java
package com.example.validatingforminput;
import jakarta.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Controller
public class WebController implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/results").setViewName("results");
}
@GetMapping("/")
public String showForm(PersonForm personForm) {
return "form";
}
@PostMapping("/")
public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "form";
}
return "redirect:/results";
}
}
showForm
- form template 반환
- personForm 객체를 매개변수로 받아 템플릿이 PersonFrom 객체의 속성을 form 필드와 연결할 수 있게 한다.
checkPersonInfo
두 개의 인수를 받는다.
- 폼에서 입력된 속성을 모으기 위해 @Valid로 표시된 personFrom 객체
- @Valid : Spring MVC가 이 객체에 대해 검증을 수행하도록 지시한다.
- 검증 오류를 테스트하고 가져오기 위해 bindingResult 객체
- @Valid로 검증된 결과를 저장한다.
폼에 바인딩된 PersonFrom 객체의 모든 속성을 가져온다 → BindingResult 객체를 사용하여 검증 오류가 있는지 검사한다 → 오류가 발생하면 사용자를 원래의 form template으로 다시 보낸다. 이 경우 오류 메시지가 폼에 표시된다. → 모든 속성이 유효하면 브라우저를 "result"라는 최종 결과 템플릿으로 redirection한다.
HTML Front End
src/main/resources/templates/form.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<form action="#" th:action="@{/}" th:object="${personForm}" method="post">
<table>
<tr>
<td>Name:</td>
<td><input type="text" th:field="*{name}" /></td>
<td th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</td>
</tr>
<tr>
<td>Age:</td>
<td><input type="text" th:field="*{age}" /></td>
<td th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</td>
</tr>
<tr>
<td><button type="submit">Submit</button></td>
</tr>
</table>
</form>
</body>
</html>
폼 태그
- action : 폼 제출 시 요청이 전송될 URL 지정 → '/'로 폼 제출하도록 설정
- th:object="${personForm}" : 폼이 PersonFrom 객체를 백업 객체로 사용하도록 지정
- method="post" : 폼 제출 방식을 POST로 설정
입력 필드
- <td><input type="text" th:field="*{name}" /></td>
- Thymelaf를 사용하여 폼 필드를 PersonFrom 객체의 name 속성과 연결
- <td><input type="text" th:field="*{age}" /></td>
- Thymelaf를 사용하여 폼 필드를 PersonFrom 객체의 age 속성과 연결
오류 메시지
- th:if : 해당 필드에 오류가 있는 경우에만 이 셀 표시
- th:errors : 해당 필드의 검증 오류 메시지 출력
제출 버튼
- <td><button type="submit">Submit</button></td> : 폼을 제출하는 버튼
'Spring' 카테고리의 다른 글
[Spring] Exception Handling (0) | 2024.07.05 |
---|---|
Validation in Spring Boot (0) | 2024.07.02 |
Serving Web Content with Spring MVC (0) | 2024.06.28 |
Mapping Requests (0) | 2024.06.26 |
REST APIs Explained - 4 Components (0) | 2024.06.26 |